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 PopupMenu : MonoBehaviour, IPointerDownHandler { protected internal class PopupMenuItem : 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; public enum Origin { TopStart = 0, TopCenter, TopEnd, BottomStart, BottomCenter, BottomEnd, LeftStart, LeftCenter, LeftEnd, RightStart, RightCenter, RightEnd } [SerializeField] Origin origin = Origin.BottomStart; [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 PopupMenuEvent: UnityEvent { } [SerializeField] PopupMenuEvent onValueChanged = new PopupMenuEvent(); List menuItems = new List(); GameObject clickerBlocker; IEnumerator diableCoroutine; float disableTime = 0.15f; uint distance = 10; public RectOffset Padding { get => padding; set { padding = value; } } public float Spacing { get => spacing; set { spacing = value; } } public PopupMenuEvent OnValueChanged { get => onValueChanged; set { onValueChanged = value; } } public void ShowPopupMenu(Vector3 position, float width, float height) { if(options.Count > 0) { gameObject.SetActive(true); DestroyAllMenuItems(); DestroyClickBlocker(); SetupTemplate(); CreateAllMenuItems(options); UpdatePosition(position,width,height); 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() { PopupMenuItem menuItem = itemTemplate.GetComponent(); if (menuItem == null) { menuItem = itemTemplate.AddComponent(); menuItem.itemText = itemText; menuItem.itemImage = itemImage; menuItem.itemLine = itemLine; menuItem.button = itemTemplate.GetComponent