namespace UIWidgets.Menu { using System; using System.Collections.Generic; using UIWidgets.Styles; using UnityEngine; using UnityEngine.UI; /// /// ContextMenu template. /// [RequireComponent(typeof(LayoutGroup))] [RequireComponent(typeof(RectTransform))] public partial class ContextMenuView : MonoBehaviour, IStylable { /// /// MenuItem template. /// [Serializable] public class MenuItemTemplate { [SerializeField] string key; /// /// Key. /// public string Key { get { return key; } private set { key = value; } } [SerializeField] MenuItemView template; /// /// Template. /// public MenuItemView Template { get { return template; } private set { template = value; } } [SerializeField] [HideInInspector] List Cache = new List(); /// /// Initializes a new instance of the class. /// /// Key. /// Template. public MenuItemTemplate(string key, MenuItemView template) { if (template == null) { throw new ArgumentNullException("template"); } Key = key; Template = template; } /// /// Get item instance. /// /// Instance. public MenuItemView Instance() { MenuItemView item; if (Cache.Count > 0) { item = Cache[Cache.Count - 1]; Cache.RemoveAt(Cache.Count - 1); } else { item = Instantiate(Template); Utilities.FixInstantiated(Template, item); item.RectTransform.localPosition = Vector3.zero; } item.gameObject.SetActive(true); return item; } /// /// Return item instance to the cache. /// /// Item. public void Return(MenuItemView instance) { instance.transform.SetParent(Template.RectTransform.parent, false); instance.Index = -1; instance.Item = null; instance.gameObject.SetActive(false); Cache.Add(instance); } /// /// Clear cache. /// public void Clear() { for (int i = 0; i < Cache.Count; i++) { Destroy(Cache[i].gameObject); } Cache.Clear(); } } } }