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);
}
}
}
}