namespace UIWidgets { using System; using System.Collections.Generic; using UnityEngine; /// /// TreeViewDataSource. /// [AddComponentMenu("UI/New UI Widgets/Collections/TreeView DataSource")] [RequireComponent(typeof(TreeView))] [DisallowMultipleComponent] public class TreeViewDataSource : MonoBehaviour { /// /// The data. /// [SerializeField] [HideInInspector] protected List Data = new List(); bool isInited; /// /// Start this instance. /// public virtual void Start() { Init(); } /// /// Init this instance. /// public virtual void Init() { if (isInited) { return; } isInited = true; SetDataSource(); } /// /// Sets the data source. /// public virtual void SetDataSource() { var tree = GetComponent(); tree.Init(); var nodes = new ObservableList>(); List2Tree(nodes); tree.Nodes = nodes; } /// /// Convert flat list to tree. /// /// Nodes. public virtual void List2Tree(ObservableList> nodes) { TreeNode last_node = null; for (int i = 0; i < Data.Count; i++) { var item = Data[i]; item.IsVisible = true; 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) { var n = Data[i - 1].Depth + 1 - item.Depth; 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"); } } } /// /// Convert item to node. /// /// The node. /// Item. protected virtual TreeNode Item2Node(TreeViewDataSourceItem item) { var nodeItem = new TreeViewItem(item.Name, item.Icon) { Value = item.Value, Tag = item.Tag, }; return new TreeNode(nodeItem, new ObservableList>(), item.IsExpanded, item.IsVisible); } } }