using System; using System.Collections.Generic; using System.Linq; using UIWidgets; using UnityEngine; using UnityEngine.SceneManagement; namespace UIWidgetsSamples { public class TestTreeView : MonoBehaviour { public TreeView Tree; private ObservableList> nodes; private Comparison> comparisonAsc = (TreeNode x, TreeNode y) => (x.Item.LocalizedName ?? x.Item.Name).CompareTo(y.Item.LocalizedName ?? y.Item.Name); private Comparison> comparisonDesc = (TreeNode x, TreeNode y) => -(x.Item.LocalizedName ?? x.Item.Name).CompareTo(y.Item.LocalizedName ?? y.Item.Name); private Dictionary>> dNodes; private ObservableList> nodes5k; private ObservableList> nodes10k; private ObservableList> nodes50k; public TestTreeView() { List items = new List { 5, 5, 2 }; nodes = GenerateTreeNodes(items); } private void Start() { Tree.Start(); Tree.Nodes = nodes; } public void SetComparison() { (nodes[0].Nodes as ObservableList>).Comparison = comparisonDesc; nodes.Comparison = comparisonDesc; } public void AddSubNodes() { if (nodes.Count != 0) { TreeNode treeNode = nodes[0]; if (treeNode.Nodes == null) { treeNode.Nodes = new ObservableList>(); } TreeViewItem nodeItem = new TreeViewItem("Subnode 1"); TreeNode item = new TreeNode(nodeItem); TreeViewItem nodeItem2 = new TreeViewItem("Subnode 2"); TreeNode item2 = new TreeNode(nodeItem2); TreeViewItem nodeItem3 = new TreeViewItem("Subnode 3"); TreeNode item3 = new TreeNode(nodeItem3); treeNode.Nodes.BeginUpdate(); treeNode.Nodes.Add(item); treeNode.Nodes.Add(item2); treeNode.Nodes.Add(item3); treeNode.Nodes.EndUpdate(); } } public void SetListeners() { Tree.NodeSelected.AddListener(NodeSelected); Tree.NodeDeselected.AddListener(NodeDeselected); } public void NodeSelected(TreeNode node) { Debug.Log(node.Item.Name + " selected"); } public void NodeDeselected(TreeNode node) { Debug.Log(node.Item.Name + " deselected"); } public void GetSelectedNodes() { List> selectedNodes = Tree.SelectedNodes; if (selectedNodes != null) { selectedNodes.ForEach(delegate(TreeNode node) { Debug.Log(node.Item.Name); }); } } public void SetOnlyOnSelectable() { Tree.Multiple = false; } public void SetMultipleSelectable() { Tree.Multiple = true; } public void SortAsc() { nodes.BeginUpdate(); ApplyNodesSort(nodes, comparisonAsc); nodes.EndUpdate(); } public void SortDesc() { nodes.BeginUpdate(); ApplyNodesSort(nodes, comparisonDesc); nodes.EndUpdate(); } private void ApplyNodesSort(ObservableList> nodes, Comparison> comparison) { nodes.Sort(comparison); nodes.ForEach(delegate(TreeNode node) { if (node.Nodes != null) { ApplyNodesSort(node.Nodes as ObservableList>, comparison); } }); } public void TestRemove(string name) { RemoveByName(nodes, name); } public void RemoveByName(ObservableList> nodes, string name) { Remove(nodes, (TreeNode x) => x.Item.Name == name); } public bool Remove(ObservableList> nodes, Predicate> match) { TreeNode treeNode = nodes.Find(match); if (treeNode != null) { treeNode.Parent = null; return true; } foreach (TreeNode item in (IEnumerable>)nodes) { if (item.Nodes == null || !Remove(item.Nodes as ObservableList>, match)) { continue; } return true; } return false; } public void TestReorder(string name) { ChangePositionByName(nodes, name, 0); } public void ChangePositionByName(ObservableList> nodes, string name, int position) { ChangePosition(nodes, (TreeNode x) => x.Item.Name == name, position); } public bool ChangePosition(ObservableList> nodes, Predicate> match, int position) { TreeNode treeNode = nodes.Find(match); if (treeNode != null) { nodes.BeginUpdate(); nodes.Remove(treeNode); nodes.Insert(position, treeNode); nodes.EndUpdate(); return true; } foreach (TreeNode item in (IEnumerable>)nodes) { if (item.Nodes == null || !ChangePosition(item.Nodes as ObservableList>, match, position)) { continue; } return true; } return false; } public void Test10K() { List list = new List(); list.Add(10); list.Add(10); list.Add(10); list.Add(10); List items = list; nodes = GenerateTreeNodes(items); Tree.Nodes = nodes; } public void LongNames() { List list = new List(); list.Add(2); list.Add(2); list.Add(2); list.Add(2); list.Add(2); list.Add(2); list.Add(2); list.Add(2); list.Add(2); List items = list; nodes = GenerateTreeNodes(items); Tree.Nodes = nodes; } public void PerformanceCheck(string k) { if (dNodes == null) { dNodes = new Dictionary>>(); List list = new List(); list.Add(10); list.Add(10); list.Add(10); List items = list; dNodes.Add("1k", GenerateTreeNodes(items)); list = new List(); list.Add(5); list.Add(10); list.Add(10); list.Add(10); List items2 = list; dNodes.Add("5k", GenerateTreeNodes(items2)); list = new List(); list.Add(10); list.Add(10); list.Add(10); list.Add(10); List items3 = list; dNodes.Add("10k", GenerateTreeNodes(items3)); list = new List(); list.Add(5); list.Add(10); list.Add(10); list.Add(10); list.Add(10); List items4 = list; dNodes.Add("50k", GenerateTreeNodes(items4)); } nodes = dNodes[k]; Tree.Nodes = dNodes[k]; } public void SetTreeNodes() { Tree.Nodes = nodes; nodes.BeginUpdate(); TreeViewItem nodeItem = new TreeViewItem("added"); TreeNode item = new TreeNode(nodeItem); nodes.Add(item); nodes[1].IsVisible = false; nodes[2].Nodes[1].IsVisible = false; nodes.EndUpdate(); } public void AddNode() { TreeViewItem nodeItem = new TreeViewItem("New node"); TreeNode item = new TreeNode(nodeItem); nodes.Add(item); } public void ToggleNode() { nodes[0].Nodes[0].IsExpanded = !nodes[0].Nodes[0].IsExpanded; } public void ChangeNodesName() { nodes[0].Item.Name = "Node renamed from code"; nodes[0].Nodes[1].Item.Name = "Another node renamed from code"; } public void ResetFilter() { nodes.BeginUpdate(); nodes.ForEach(SetVisible); nodes.EndUpdate(); } private void SetVisible(TreeNode node) { if (node.Nodes != null) { node.Nodes.ForEach(SetVisible); } node.IsVisible = true; } public void Filter(string nameContains) { nodes.BeginUpdate(); SampleFilter(nodes, (TreeViewItem x) => x.Name.Contains(nameContains)); nodes.EndUpdate(); } public void Clear() { nodes = new ObservableList>(); Tree.Nodes = nodes; } private bool SampleFilter(IObservableList> nodes, Func filterFunc) { return nodes.Count(delegate(TreeNode x) { bool flag = x.Nodes != null && SampleFilter(x.Nodes, filterFunc); x.IsVisible = flag || filterFunc(x.Item); return x.IsVisible; }) > 0; } public static ObservableList> GenerateTreeNodes(List items, string nameStartsWith = "Node ", bool isExpanded = true) { return Enumerable.Range(1, items[0]).Select(delegate(int x) { string text = nameStartsWith + x; TreeViewItem nodeItem = new TreeViewItem(text); ObservableList> nodeNodes = ((items.Count <= 1) ? null : GenerateTreeNodes(items.GetRange(1, items.Count - 1), text + " - ", isExpanded)); return new TreeNode(nodeItem, nodeNodes, isExpanded); }).ToObservableList(); } public void ReloadScene() { SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); } } }