2025-01-30 23:38:06 +01:00

190 lines
7.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using TMPro;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif
namespace Michsky.MUIP
{
[AddComponentMenu("Modern UI Pack/Context Menu/Context Menu Content")]
public class ContextMenuContent : MonoBehaviour, IPointerClickHandler
{
// Resources
public ContextMenuManager contextManager;
public Transform itemParent;
// Settings
public bool useIn3D = false;
// Items
public List<ContextItem> contexItems = new List<ContextItem>();
GameObject selectedItem;
Image setItemImage;
TextMeshProUGUI setItemText;
Sprite imageHelper;
string textHelper;
[System.Serializable]
public class ContextItem
{
[Header("Information")]
[Space(-5)]
public string itemText = "Item Text";
public Sprite itemIcon;
public ContextItemType contextItemType;
[Header("Sub Menu")]
public List<SubMenuItem> subMenuItems = new List<SubMenuItem>();
[Header("Events")]
public UnityEvent onClick;
}
[System.Serializable]
public class SubMenuItem
{
public string itemText = "Item Text";
public Sprite itemIcon;
public ContextItemType contextItemType;
public UnityEvent onClick;
}
public enum ContextItemType { Button, Separator }
void Awake()
{
if (contextManager == null)
{
try
{
#if UNITY_2023_2_OR_NEWER
contextManager = FindObjectsByType<ContextMenuManager>(FindObjectsSortMode.None)[0];
#else
contextManager = (ContextMenuManager)FindObjectsOfType(typeof(ContextMenuManager))[0];
#endif
itemParent = contextManager.transform.Find("Content/Item List").transform;
}
catch { Debug.LogError("<b>[Context Menu]</b> Context Manager is missing.", this); return; }
}
foreach (Transform child in itemParent)
Destroy(child.gameObject);
}
public void ProcessContent()
{
foreach (Transform child in itemParent) { Destroy(child.gameObject); }
for (int i = 0; i < contexItems.Count; ++i)
{
bool nulLVariable = false;
if (contexItems[i].contextItemType == ContextItemType.Button && contextManager.contextButton != null)
selectedItem = contextManager.contextButton;
else if (contexItems[i].contextItemType == ContextItemType.Separator && contextManager.contextSeparator != null)
selectedItem = contextManager.contextSeparator;
else
{
Debug.LogError("<b>[Context Menu]</b> At least one of the item presets is missing. " +
"You can assign a new variable in Resources (Context Menu) tab. All default presets can be found in " +
"<b>Modern UI Pack > Prefabs > Context Menu</b> folder.", this);
nulLVariable = true;
}
if (nulLVariable == false)
{
if (contexItems[i].subMenuItems.Count == 0)
{
GameObject go = Instantiate(selectedItem, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
go.transform.SetParent(itemParent, false);
if (contexItems[i].contextItemType == ContextItemType.Button)
{
setItemText = go.GetComponentInChildren<TextMeshProUGUI>();
textHelper = contexItems[i].itemText;
setItemText.text = textHelper;
Transform goImage = go.gameObject.transform.Find("Icon");
setItemImage = goImage.GetComponent<Image>();
imageHelper = contexItems[i].itemIcon;
setItemImage.sprite = imageHelper;
if (imageHelper == null)
setItemImage.color = new Color(0, 0, 0, 0);
Button itemButton = go.GetComponent<Button>();
itemButton.onClick.AddListener(contexItems[i].onClick.Invoke);
itemButton.onClick.AddListener(contextManager.Close);
}
}
else if (contextManager.contextSubMenu != null && contexItems[i].subMenuItems.Count != 0)
{
GameObject go = Instantiate(contextManager.contextSubMenu, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
go.transform.SetParent(itemParent, false);
ContextMenuSubMenu subMenu = go.GetComponent<ContextMenuSubMenu>();
subMenu.cmManager = contextManager;
subMenu.cmContent = this;
subMenu.subMenuIndex = i;
setItemText = go.GetComponentInChildren<TextMeshProUGUI>();
textHelper = contexItems[i].itemText;
setItemText.text = textHelper;
Transform goImage;
goImage = go.gameObject.transform.Find("Icon");
setItemImage = goImage.GetComponent<Image>();
imageHelper = contexItems[i].itemIcon;
setItemImage.sprite = imageHelper;
}
StopCoroutine("ExecuteAfterTime");
StartCoroutine("ExecuteAfterTime", 0.01f);
}
}
contextManager.SetContextMenuPosition();
contextManager.Open();
}
public void OnPointerClick(PointerEventData eventData)
{
if (contextManager.isOn == true) { contextManager.Close(); }
else if (eventData.button == PointerEventData.InputButton.Right && contextManager.isOn == false) { ProcessContent(); }
}
IEnumerator ExecuteAfterTime(float time)
{
yield return new WaitForSecondsRealtime(time);
itemParent.gameObject.SetActive(false);
itemParent.gameObject.SetActive(true);
}
#if !UNITY_IOS && !UNITY_ANDROID
public void OnMouseOver()
{
#if ENABLE_LEGACY_INPUT_MANAGER
if (useIn3D == true && Input.GetMouseButtonDown(1))
#elif ENABLE_INPUT_SYSTEM
if (useIn3D == true && Mouse.current.rightButton.wasPressedThisFrame)
#endif
{
ProcessContent();
}
}
#endif
public void AddNewItem()
{
ContextItem item = new ContextItem();
contexItems.Add(item);
}
}
}