天津23维预案
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

223 lines
4.3 KiB

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
using System.Collections;
namespace UIWidgets {
public enum NodeToggle {
Rotate = 0,
ChangeSprite = 1,
}
/// <summary>
/// Node toggle event.
/// </summary>
[Serializable]
public class NodeToggleEvent : UnityEvent<int> {
}
/// <summary>
/// Tree view component base.
/// </summary>
public class TreeViewComponentBase<T> : ListViewItem {
/// <summary>
/// The icon.
/// </summary>
public Image Icon;
/// <summary>
/// The text.
/// </summary>
public Text Text;
/// <summary>
/// The toggle.
/// </summary>
public TreeNodeToggle Toggle;
Image toggleImage;
protected Image ToggleImage {
get {
if (toggleImage==null)
{
toggleImage = Toggle.GetComponent<Image>();
}
return toggleImage;
}
}
/// <summary>
/// The toggle event.
/// </summary>
public NodeToggleEvent ToggleEvent = new NodeToggleEvent();
/// <summary>
/// The filler.
/// </summary>
public LayoutElement Filler;
public NodeToggle OnNodeExpand = NodeToggle.Rotate;
/// <summary>
/// Is need animate arrow?
/// </summary>
public bool AnimateArrow;
public Sprite NodeOpened;
public Sprite NodeClosed;
/// <summary>
/// The node.
/// </summary>
public TreeNode<T> Node {
get;
protected set;
}
/// <summary>
/// The padding per level.
/// </summary>
public float PaddingPerLevel = 30;
/// <summary>
/// Set icon native size.
/// </summary>
public bool SetNativeSize = true;
/// <summary>
/// Start this instance.
/// </summary>
protected override void Start()
{
base.Start();
Toggle.OnClick.AddListener(ToggleNode);
}
/// <summary>
/// This function is called when the MonoBehaviour will be destroyed.
/// </summary>
protected override void OnDestroy()
{
if (Toggle!=null)
{
Toggle.OnClick.RemoveListener(ToggleNode);
}
base.OnDestroy();
}
/// <summary>
/// Toggles the node.
/// </summary>
protected virtual void ToggleNode()
{
if (AnimationCorutine!=null)
{
StopCoroutine(AnimationCorutine);
}
SetToggle(Node.IsExpanded);
ToggleEvent.Invoke(Index);
if (OnNodeExpand==NodeToggle.Rotate)
{
if (AnimateArrow)
{
AnimationCorutine = Node.IsExpanded ? CloseCorutine() : OpenCorutine();
StartCoroutine(AnimationCorutine);
}
}
else
{
SetToggle(Node.IsExpanded);
}
}
protected virtual void SeToggleSprite(bool isExpanded)
{
ToggleImage.sprite = isExpanded ? NodeOpened : NodeClosed;
}
/// <summary>
/// The animation corutine.
/// </summary>
protected IEnumerator AnimationCorutine;
/// <summary>
/// Animate arrow on open.
/// </summary>
/// <returns>The corutine.</returns>
protected virtual IEnumerator OpenCorutine()
{
var rect = Toggle.transform as RectTransform;
yield return StartCoroutine(Animations.RotateZ(rect, 0.2f, -90, 0));
}
/// <summary>
/// Animate arrow on close.
/// </summary>
/// <returns>The corutine.</returns>
protected virtual IEnumerator CloseCorutine()
{
var rect = Toggle.transform as RectTransform;
yield return StartCoroutine(Animations.RotateZ(rect, 0.2f, 0, -90));
}
/// <summary>
/// Sets the toggle rotation.
/// </summary>
/// <param name="isExpanded">If set to <c>true</c> is expanded.</param>
protected virtual void SetToggleRotation(bool isExpanded)
{
if (Toggle==null)
{
return ;
}
Toggle.transform.localRotation = Quaternion.Euler(0, 0, (isExpanded) ? -90 : 0);
}
protected virtual void SetToggle(bool isExpanded)
{
if (OnNodeExpand==NodeToggle.Rotate)
{
SetToggleRotation(isExpanded);
}
else
{
SeToggleSprite(isExpanded);
}
}
/// <summary>
/// Sets the data.
/// </summary>
/// <param name="node">Node.</param>
/// <param name="depth">Depth.</param>
public virtual void SetData(TreeNode<T> node, int depth)
{
if (node!=null)
{
Node = node;
SetToggle(Node.IsExpanded);
}
if (Filler!=null)
{
Filler.preferredWidth = depth * PaddingPerLevel;
}
if ((Toggle!=null) && (Toggle.gameObject!=null))
{
var toggle_active = (node.Nodes!=null) && (node.Nodes.Count>0);
if (Toggle.gameObject.activeSelf!=toggle_active)
{
Toggle.gameObject.SetActive(toggle_active);
}
}
}
}
}