namespace UIWidgets.Menu { using System; using UIWidgets.l10n; using UIWidgets.Styles; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; /// /// Menu item view. /// public class MenuItemView : Selectable, IViewData, IPointerClickHandler, ISubmitHandler, IStylable { /// /// Index. /// [NonSerialized] public int Index = -1; /// /// Icon. /// [SerializeField] public Image Icon; /// /// Check mark. /// [SerializeField] public RectTransform Checkmark; /// /// Name. /// [SerializeField] public TextAdapter Name; /// /// Hot key. /// [SerializeField] public TextAdapter HotKey; /// /// Sub menu indicator. /// [SerializeField] public RectTransform SubmenuIndicator; /// /// Set icon native size. /// [SerializeField] public bool SetNativeSize = true; MenuItem item; /// /// Menu item. /// public MenuItem Item { get { return item; } set { if (item == value) { return; } if (item != null) { item.OnChange -= UpdateView; } item = value; if (item != null) { item.OnChange += UpdateView; } UpdateView(); } } /// /// Click event. /// [SerializeField] public MenuItemEvent OnClick = new MenuItemEvent(); /// /// Enter event. /// [SerializeField] public MenuItemOverEvent OnEnter = new MenuItemOverEvent(); /// /// Exit event. /// [SerializeField] public MenuItemOverEvent OnExit = new MenuItemOverEvent(); /// /// Move event. /// [SerializeField] public MenuItemMoveEvent OnAxisMove = new MenuItemMoveEvent(); RectTransform rectTransform; /// /// RectTransform. /// public RectTransform RectTransform { get { if (rectTransform == null) { rectTransform = transform as RectTransform; } return rectTransform; } } /// /// Process the destroy event. /// protected override void OnDestroy() { base.OnDestroy(); Item = null; } /// /// Process locale changes. /// public virtual void LocaleChanged() { UpdateName(); } /// /// Update display name. /// protected virtual void UpdateName() { if (Item == null) { return; } if (Name != null) { Name.text = Localization.GetTranslation(Item.Name); } } /// /// Update view. /// protected virtual void UpdateView() { if (Item == null) { if (Icon != null) { Icon.sprite = null; Icon.color = Color.clear; } return; } name = Item.Name; interactable = Item.Interactable; UpdateName(); if (Checkmark != null) { Checkmark.gameObject.SetActive(Item.Checked); } if (SubmenuIndicator != null) { SubmenuIndicator.gameObject.SetActive(Item.HasVisibleItems); } if (HotKey != null) { HotKey.gameObject.SetActive(Item.HotKey.Valid); HotKey.text = Item.HotKey.ToString(); } if (Icon != null) { Icon.sprite = Item.Icon; if (SetNativeSize) { Icon.SetNativeSize(); } // set transparent color if no icon Icon.color = (Icon.sprite == null) ? Color.clear : Color.white; } } /// /// Set data. /// /// Item. public void SetData(MenuItem item) { Item = item; UpdateView(); } /// /// Process the pointer enter event. /// /// Event data. public override void OnPointerEnter(PointerEventData eventData) { base.OnPointerEnter(eventData); OnEnter.Invoke(Index, true); } /// /// Process the pointer exit event. /// /// Event data. public override void OnPointerExit(PointerEventData eventData) { base.OnPointerExit(eventData); OnExit.Invoke(Index, true); } /// /// Process the move event. /// /// Event data. public override void OnMove(AxisEventData eventData) { base.OnMove(eventData); OnAxisMove.Invoke(Index, eventData); } /// /// Process the pointer click event. /// /// Event data. public void OnPointerClick(PointerEventData eventData) { OnClick.Invoke(Item); } /// /// Process the submit event. /// /// Event data. public void OnSubmit(BaseEventData eventData) { OnClick.Invoke(Item); } /// /// Process the select event. /// /// Event data. public override void OnSelect(BaseEventData eventData) { base.OnSelect(eventData); OnEnter.Invoke(Index, false); } /// /// Process the deselect event. /// /// Event data. public override void OnDeselect(BaseEventData eventData) { base.OnDeselect(eventData); OnExit.Invoke(Index, false); } /// public bool SetStyle(Style style) { style.ContextMenu.ItemBackground.ApplyTo(targetGraphic); style.ContextMenu.ItemBackgroundSelectable.ApplyTo(this); var selectables = GetComponents(); foreach (var s in selectables) { style.ContextMenu.ItemTextSelectable.ApplyTo(s); } if (Checkmark != null) { style.ContextMenu.ItemText.ApplyTo(Checkmark); } if (HotKey != null) { style.ContextMenu.ItemText.ApplyTo(HotKey.gameObject); } if (Name != null) { style.ContextMenu.ItemText.ApplyTo(Name.gameObject); } return true; } /// public bool GetStyle(Style style) { style.ContextMenu.ItemBackground.GetFrom(targetGraphic); style.ContextMenu.ItemBackgroundSelectable.GetFrom(this); var selectables = GetComponents(); foreach (var s in selectables) { style.ContextMenu.ItemTextSelectable.GetFrom(s); } if (Checkmark != null) { style.ContextMenu.ItemText.GetFrom(Checkmark); } if (HotKey != null) { style.ContextMenu.ItemText.GetFrom(HotKey.gameObject); } if (Name != null) { style.ContextMenu.ItemText.GetFrom(Name.gameObject); } return true; } /// /// Set delimiter style. /// /// Style. public void SetDelimiterStyle(StyleImage style) { style.ApplyTo(targetGraphic); } /// /// Set delimiter style options from widget properties. /// /// Style. public void GetDelimiterStyle(StyleImage style) { style.GetFrom(targetGraphic); } } }