using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.UI; using TMPro; namespace RainbowArt.CleanFlatUI { [ExecuteAlways] public class ContextMenu : MonoBehaviour, IPointerDownHandler { protected internal class ContextMenuItem : MonoBehaviour, IPointerEnterHandler { public TextMeshProUGUI itemText; public Image itemImage; public Image itemLine; public Button button; public virtual void OnPointerEnter(PointerEventData eventData) { EventSystem.current.SetSelectedGameObject(gameObject); } } [SerializeField] GameObject itemTemplate; [SerializeField] TextMeshProUGUI itemText; [SerializeField] Image itemImage; [SerializeField] Image itemLine; [SerializeField] Animator animator; [SerializeField] RectOffset padding = new RectOffset(); [SerializeField] float spacing = 2; [Serializable] public class OptionItem { public string text; public Sprite icon; public OptionItem() { } public OptionItem(string newText) { text = newText; } public OptionItem(Sprite newImage) { icon = newImage; } public OptionItem(string newText, Sprite newImage) { text = newText; icon = newImage; } } [SerializeField] List options = new List(); [Serializable] public class ContextMenuEvent: UnityEvent { } [SerializeField] ContextMenuEvent onValueChanged = new ContextMenuEvent(); enum Origin { RightBottom, LeftBottom, RightTop, LeftTop, } Origin origin = Origin.RightBottom; List menuItems = new List(); GameObject clickerBlocker; IEnumerator diableCoroutine; float disableTime = 0.15f; float distanceX = 2.0f; float distanceY = 2.0f; public RectOffset Padding { get => padding; set { padding = value; } } public float Spacing { get => spacing; set { spacing = value; } } public ContextMenuEvent OnValueChanged { get => onValueChanged; set { onValueChanged = value; } } public void Show(Vector2 mousePosition, RectTransform areaScope) { if(options.Count > 0) { gameObject.SetActive(true); DestroyAllMenuItems(); DestroyClickBlocker(); SetupTemplate(); CreateAllMenuItems(options); UpdatePosition(mousePosition,areaScope); CreateClickBlocker(); PlayAnimation(true); } } public void AddOptions(List optionList) { options.AddRange(optionList); } public void AddOptions(List optionList) { for (int i = 0; i < optionList.Count; i++) { options.Add(new OptionItem(optionList[i])); } } public void AddOptions(List optionList) { for (int i = 0; i < optionList.Count; i++) { options.Add(new OptionItem(optionList[i])); } } public void ClearOptions() { options.Clear(); } void SetupTemplate() { ContextMenuItem menuItem = itemTemplate.GetComponent(); if (menuItem == null) { menuItem = itemTemplate.AddComponent(); menuItem.itemText = itemText; menuItem.itemImage = itemImage; menuItem.itemLine = itemLine; menuItem.button = itemTemplate.GetComponent