namespace UIWidgets { using System; using System.Collections; using UIWidgets.Styles; using UnityEngine; using UnityEngine.Serialization; using UnityEngine.UI; /// /// Node toggle type. /// public enum NodeToggle { /// /// Rotate. /// Rotate = 0, /// /// ChangeSprite. /// ChangeSprite = 1, } /// /// Tree view component base. /// /// Type of node item. public class TreeViewComponentBase : ListViewItem, IViewData> { /// /// Init graphics foreground. /// protected override void GraphicsForegroundInit() { if (GraphicsForegroundVersion == 0) { Foreground = new Graphic[] { UtilitiesUI.GetGraphic(TextAdapter), }; GraphicsForegroundVersion = 1; } } /// /// The icon. /// public Image Icon; /// /// The text. /// [SerializeField] [HideInInspector] [Obsolete("Replaced with TextAdapter.")] public Text Text; /// /// The text. /// [SerializeField] public TextAdapter TextAdapter; /// /// The toggle. /// public TreeNodeToggle Toggle; Image toggleImage; /// /// Gets the toggle image. /// /// The toggle image. protected Image ToggleImage { get { if (toggleImage == null) { toggleImage = Toggle.GetComponent(); } return toggleImage; } } /// /// The toggle event. /// public NodeToggleEvent ToggleEvent = new NodeToggleEvent(); /// /// Indentation. /// [FormerlySerializedAs("Filler")] public LayoutElement Indentation; /// /// Gets or sets the indentation. /// /// The indentation. [Obsolete("Use Indentation instead.")] public LayoutElement Filler { get { return Indentation; } set { Indentation = value; } } /// /// The on node expand. /// public NodeToggle OnNodeExpand = NodeToggle.Rotate; /// /// Is need animate arrow? /// public bool AnimateArrow; /// /// Sprite when node opened. /// public Sprite NodeOpened; /// /// Sprite when node closed. /// public Sprite NodeClosed; /// /// The node. /// public TreeNode Node { get; protected set; } /// /// The padding per level. /// public float PaddingPerLevel = 30; /// /// Set icon native size. /// public bool SetNativeSize = true; /// /// Start this instance. /// protected override void Start() { base.Start(); if (Toggle != null) { Toggle.OnClick.AddListener(ToggleNode); } } /// /// This function is called when the MonoBehaviour will be destroyed. /// protected override void OnDestroy() { if (Toggle != null) { Toggle.OnClick.RemoveListener(ToggleNode); } base.OnDestroy(); } /// /// Toggles the node. /// protected virtual void ToggleNode() { if (AnimationCoroutine != null) { Owner.StopCoroutine(AnimationCoroutine); } SetToggle(Node.IsExpanded); ToggleEvent.Invoke(Index); if (Owner != null) { Owner.ItemsEvents.NodeToggleClick.Invoke(Index, this); } if (OnNodeExpand == NodeToggle.Rotate) { if (AnimateArrow) { AnimationCoroutine = Node.IsExpanded ? CloseCoroutine() : OpenCoroutine(); Owner.StartCoroutine(AnimationCoroutine); } } else { SetToggle(Node.IsExpanded); } } /// /// Set the toggle sprite. /// /// If set to true is expanded. protected virtual void SetToggleSprite(bool isExpanded) { ToggleImage.sprite = isExpanded ? NodeOpened : NodeClosed; } /// /// The animation coroutine. /// protected IEnumerator AnimationCoroutine; /// /// Animate arrow on open. /// /// The coroutine. protected virtual IEnumerator OpenCoroutine() { var rect = Toggle.transform as RectTransform; yield return Owner.StartCoroutine(Animations.RotateZ(rect, 0.2f, -90, 0)); } /// /// Animate arrow on close. /// /// The coroutine. protected virtual IEnumerator CloseCoroutine() { var rect = Toggle.transform as RectTransform; yield return Owner.StartCoroutine(Animations.RotateZ(rect, 0.2f, 0, -90)); } /// /// Sets the toggle rotation. /// /// If set to true is expanded. protected virtual void SetToggleRotation(bool isExpanded) { if (Toggle == null) { return; } Toggle.transform.localRotation = Quaternion.Euler(0, 0, isExpanded ? -90 : 0); } /// /// Sets the toggle. /// /// If set to true is expanded. protected virtual void SetToggle(bool isExpanded) { if (OnNodeExpand == NodeToggle.Rotate) { SetToggleRotation(isExpanded); } else { SetToggleSprite(isExpanded); } } /// /// Set data. /// /// Item. public void SetData(ListNode item) { SetData(item.Node, item.Depth); } /// /// Sets the data. /// /// Node. /// Depth. public virtual void SetData(TreeNode node, int depth) { if (node != null) { Node = node; SetToggle(Node.IsExpanded); } if (Indentation != null) { Indentation.minWidth = depth * PaddingPerLevel; Indentation.preferredWidth = depth * PaddingPerLevel; Indentation.flexibleWidth = 0; } if ((Toggle != null) && (Toggle.gameObject != null)) { var toggle_active = (node != null) && (node.Nodes != null) && (node.Nodes.Count > 0); if (Toggle.gameObject.activeSelf != toggle_active) { Toggle.gameObject.SetActive(toggle_active); } } } /// /// Upgrade this instance. /// public override void Upgrade() { #pragma warning disable 0612, 0618 Utilities.GetOrAddComponent(Text, ref TextAdapter); #pragma warning restore 0612, 0618 } /// public override void SetStyle(StyleImage styleBackground, StyleText styleText, Style style) { base.SetStyle(styleBackground, styleText, style); PaddingPerLevel = style.TreeView.PaddingPerLevel; style.TreeView.Toggle.ApplyTo(ToggleImage); OnNodeExpand = style.TreeView.OnNodeExpand; AnimateArrow = style.TreeView.AnimateArrow; NodeOpened = style.TreeView.NodeOpened; NodeClosed = style.TreeView.NodeClosed; if (TextAdapter != null) { styleText.ApplyTo(TextAdapter.gameObject); } } /// public override void GetStyle(StyleImage styleBackground, StyleText styleText, Style style) { base.GetStyle(styleBackground, styleText, style); style.TreeView.PaddingPerLevel = Mathf.RoundToInt(PaddingPerLevel); style.TreeView.Toggle.GetFrom(ToggleImage); style.TreeView.OnNodeExpand = OnNodeExpand; style.TreeView.AnimateArrow = AnimateArrow; style.TreeView.NodeOpened = NodeOpened; style.TreeView.NodeClosed = NodeClosed; if (TextAdapter != null) { styleText.GetFrom(TextAdapter.gameObject); } } } }