天津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.
 
 
 
 
 
 

155 lines
3.2 KiB

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
namespace UIWidgets {
/// <summary>
/// TreeViewDataSourceItem.
/// </summary>
[Serializable]
public class TreeViewDataSourceItem {
/// <summary>
/// The depth.
/// </summary>
[SerializeField]
public int Depth;
/// <summary>
/// The is visible.
/// </summary>
[SerializeField]
public bool IsVisible = true;
/// <summary>
/// The is expanded.
/// </summary>
[SerializeField]
public bool IsExpanded;
/// <summary>
/// The icon.
/// </summary>
[SerializeField]
public Sprite Icon;
/// <summary>
/// The name.
/// </summary>
[SerializeField]
public string Name;
/// <summary>
/// The value.
/// </summary>
[SerializeField]
public int Value;
/// <summary>
/// The tag.
/// </summary>
[SerializeField]
public object Tag;
}
/// <summary>
/// TreeViewDataSource.
/// </summary>
[AddComponentMenu("UI/UIWidgets/TreeViewDataSource")]
[RequireComponent(typeof(TreeView))]
public class TreeViewDataSource : MonoBehaviour
{
/// <summary>
/// The data.
/// </summary>
[SerializeField]
[HideInInspector]
protected List<TreeViewDataSourceItem> Data = new List<TreeViewDataSourceItem>();
bool isStarted;
/// <summary>
/// Start this instance.
/// </summary>
public virtual void Start()
{
if (isStarted)
{
return ;
}
isStarted = true;
SetDataSource();
}
/// <summary>
/// Sets the data source.
/// </summary>
public virtual void SetDataSource()
{
var tree = GetComponent<TreeView>();
tree.Start();
var nodes = new ObservableList<TreeNode<TreeViewItem>>();
List2Tree(nodes);
tree.Nodes = nodes;
}
/// <summary>
/// Convert flat list to tree.
/// </summary>
/// <param name="nodes">Nodes.</param>
public virtual void List2Tree(ObservableList<TreeNode<TreeViewItem>> nodes)
{
TreeNode<TreeViewItem> last_node = null;
for (int i = 0; i < Data.Count; i++)
{
var item = Data[i];
item.IsVisible = true;
//Debug.Log(item.Depth + " -> " + item.Name + " -> " + item.IsVisible);
if (item.Depth==0)
{
last_node = Item2Node(item);
nodes.Add(last_node);
}
else if (item.Depth==(Data[i-1].Depth+1))
{
var current_node = Item2Node(item);
last_node.Nodes.Add(current_node);
last_node = current_node;
}
else if (item.Depth <= Data[i-1].Depth)
{
int n = item.Depth - Data[i-1].Depth + 1;
for (int j = 0; j < n; j++)
{
last_node = last_node.Parent;
}
var current_node = Item2Node(item);
last_node.Nodes.Add(current_node);
last_node = current_node;
}
else
{
//Debug.LogWarning("Unknown case");
}
}
}
/// <summary>
/// Convert item to node.
/// </summary>
/// <returns>The node.</returns>
/// <param name="item">Item.</param>
protected virtual TreeNode<TreeViewItem> Item2Node(TreeViewDataSourceItem item)
{
var nodeItem = new TreeViewItem(item.Name, item.Icon);
nodeItem.Value = item.Value;
nodeItem.Tag = item.Tag;
return new TreeNode<TreeViewItem>(nodeItem, new ObservableList<TreeNode<TreeViewItem>>(), item.IsExpanded, item.IsVisible);
}
}
}