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

412 lines
10 KiB

2 years ago
using UnityEngine;
using System.Collections.Generic;
using System;
using System.Linq;
using UIWidgets;
namespace UIWidgetsSamples {
public class TestTreeView : MonoBehaviour {
public TreeView Tree;
ObservableList<TreeNode<TreeViewItem>> nodes;
void Start()
{
Tree.Start();
Tree.Nodes = nodes;
//SetComparison();
//SetListeners();
}
public void SetComparison()
{
(nodes[0].Nodes as ObservableList<TreeNode<TreeViewItem>>).Comparison = comparisonDesc;
nodes.Comparison = comparisonDesc;
}
// add subnodes
public void AddSubNodes()
{
if (nodes.Count==0)
{
return ;
}
// get parent node
var node = nodes[0];
// or find parent node by name
// var node = nodes.Find(x => x.Item.Name = "Node 2");
if (node.Nodes==null)
{
node.Nodes = new ObservableList<TreeNode<TreeViewItem>>();
}
var new_item1 = new TreeViewItem("Subnode 1");
var new_node1 = new TreeNode<TreeViewItem>(new_item1);
var new_item2 = new TreeViewItem("Subnode 2");
var new_node2 = new TreeNode<TreeViewItem>(new_item2);
var new_item3 = new TreeViewItem("Subnode 3");
var new_node3 = new TreeNode<TreeViewItem>(new_item3);
node.Nodes.BeginUpdate();
node.Nodes.Add(new_node1);
node.Nodes.Add(new_node2);
node.Nodes.Add(new_node3);
node.Nodes.EndUpdate();
}
public void SetListeners()
{
Tree.NodeSelected.AddListener(NodeSelected);
Tree.NodeDeselected.AddListener(NodeDeselected);
}
// called when node selected
public void NodeSelected(TreeNode<TreeViewItem> node)
{
Debug.Log(node.Item.Name + " selected");
}
// called when node deselected
public void NodeDeselected(TreeNode<TreeViewItem> node)
{
Debug.Log(node.Item.Name + " deselected");
}
// get currently selected nodes
public void GetSelectedNodes()
{
Debug.Log(Tree.SelectedIndex);
Debug.Log(string.Join(",", Tree.SelectedIndicies.Select(x => x.ToString()).ToArray()));
var selectedNodes = Tree.SelectedNodes;
if (selectedNodes!=null)
{
selectedNodes.ForEach(node => Debug.Log(node.Item.Name));
}
}
public void GetNodePath()
{
var path = nodes[0].Nodes[0].Nodes[0].Path;
path.ForEach(node => Debug.Log(node.Item.Name));
}
public void SelectNodes()
{
if ((nodes.Count==0) || (nodes[0].Nodes.Count==0))
{
return ;
}
// replace on find node "Node 1 - 1"
var parent_node = nodes[0].Nodes[0];
var children = new List<TreeNode<TreeViewItem>>();
GetChildrenNodes(parent_node, children);
// add children to selected nodes
Tree.SelectedNodes = Tree.SelectedNodes.Union(children).ToList();
// select only children
//Tree.SelectedNodes = children;
}
public void DeselectNodes()
{
if ((nodes.Count==0) || (nodes[0].Nodes.Count==0))
{
return ;
}
// replace on find node "Node 1 - 1"
var parent_node = nodes[0].Nodes[0];
var children = new List<TreeNode<TreeViewItem>>();
GetChildrenNodes(parent_node, children);
// remove children from selected nodes
Tree.SelectedNodes = Tree.SelectedNodes.Except(children).ToList();
// deselect all
//Tree.SelectedNodes = new List<TreeNode<TreeViewItem>>();
}
void GetChildrenNodes(TreeNode<TreeViewItem> node, List<TreeNode<TreeViewItem>> children)
{
if (node.Nodes!=null)
{
children.AddRange(node.Nodes);
node.Nodes.ForEach(x => GetChildrenNodes(x, children));
}
}
// only one node can be selected
public void SetOnlyOnSelectable()
{
Tree.Multiple = false;
}
// many nodes can be selected at once
public void SetMultipleSelectable()
{
Tree.Multiple = true;
}
// Compare nodes by Name in ascending order
Comparison<TreeNode<TreeViewItem>> comparisonAsc = (x, y) => {
return (x.Item.LocalizedName ?? x.Item.Name).CompareTo(y.Item.LocalizedName ?? y.Item.Name);
};
// Compare nodes by Name in descending order
Comparison<TreeNode<TreeViewItem>> comparisonDesc = (x, y) => {
return -(x.Item.LocalizedName ?? x.Item.Name).CompareTo(y.Item.LocalizedName ?? y.Item.Name);
};
public void SortAsc()
{
nodes.BeginUpdate();
ApplyNodesSort(nodes, comparisonAsc);
nodes.EndUpdate();
}
public void SortDesc()
{
nodes.BeginUpdate();
ApplyNodesSort(nodes, comparisonDesc);
nodes.EndUpdate();
}
void ApplyNodesSort<T>(ObservableList<TreeNode<T>> nodes, Comparison<TreeNode<T>> comparison)
{
nodes.Sort(comparison);
nodes.ForEach(node => {
if (node.Nodes!=null)
{
ApplyNodesSort(node.Nodes as ObservableList<TreeNode<T>>, comparison);
}
});
}
public void TestRemove(string name)
{
RemoveByName(nodes, name);
}
public void RemoveByName(ObservableList<TreeNode<TreeViewItem>> nodes, string name)
{
Remove(nodes, x => x.Item.Name==name);
}
public bool Remove<T>(ObservableList<TreeNode<T>> nodes, Predicate<TreeNode<T>> match)
{
var findedNode = nodes.Find(match);
if (findedNode!=null)
{
findedNode.Parent = null;
//this.nodes.Add(findedNode as TreeNode<TreeViewItem>);
return true;
}
foreach (var node in nodes)
{
if (node.Nodes==null)
{
continue ;
}
if (Remove(node.Nodes as ObservableList<TreeNode<T>>, match))
{
return true;
}
}
return false;
}
public void TestReorder(string name)
{
ChangePositionByName(nodes, name, 0);
}
public void ChangePositionByName(ObservableList<TreeNode<TreeViewItem>> nodes, string name, int position)
{
ChangePosition(nodes, x => x.Item.Name==name, position);
}
public bool ChangePosition<T>(ObservableList<TreeNode<T>> nodes, Predicate<TreeNode<T>> match, int position)
{
var findedNode = nodes.Find(match);
if (findedNode!=null)
{
nodes.BeginUpdate();
nodes.Remove(findedNode);
nodes.Insert(position, findedNode);
nodes.EndUpdate();
return true;
}
foreach (var node in nodes)
{
if (node.Nodes==null)
{
continue ;
}
if (ChangePosition(node.Nodes as ObservableList<TreeNode<T>>, match, position))
{
return true;
}
}
return false;
}
public void Test10K()
{
var config = new List<int>() {10, 10, 10, 10};
nodes = GenerateTreeNodes(config, isExpanded: true);
Tree.Nodes = nodes;
}
public void LongNames()
{
var config = new List<int>() {2, 2, 2, 2, 2, 2, 2, 2, 2};
nodes = GenerateTreeNodes(config, isExpanded: true);
Tree.Nodes = nodes;
}
Dictionary<string,ObservableList<TreeNode<TreeViewItem>>> dNodes;
ObservableList<TreeNode<TreeViewItem>> nodes5k;
ObservableList<TreeNode<TreeViewItem>> nodes10k;
ObservableList<TreeNode<TreeViewItem>> nodes50k;
public TestTreeView()
{
//var config = new List<int>() {20, 10, 10, 10, 25};
//var config = new List<int>() {5, 5, 5, 5, 5};
//var config = new List<int>() {5, 4, 3};
//var config = new List<int>() {2, 2, 2, 2, 2, 2, 2, 2, 2};
//var config = new List<int>() {5, 10, 10, 10, };
//var config = new List<int>() {3, 3 };
var config = new List<int>() {5, 5, 2 };
nodes = GenerateTreeNodes(config, isExpanded: true);
}
public void PerformanceCheck(string k)
{
if (dNodes==null)
{
dNodes = new Dictionary<string, ObservableList<TreeNode<TreeViewItem>>>();
var config1k = new List<int>() {10, 10, 10 };
dNodes.Add("1k", GenerateTreeNodes(config1k, isExpanded: true));
var config5k = new List<int>() {5, 10, 10, 10 };
dNodes.Add("5k", GenerateTreeNodes(config5k, isExpanded: true));
var config10k = new List<int>() {10, 10, 10, 10 };
dNodes.Add("10k", GenerateTreeNodes(config10k, isExpanded: true));
var config50k = new List<int>() {5, 10, 10, 10, 10 };
dNodes.Add("50k", GenerateTreeNodes(config50k, isExpanded: true));
}
nodes = dNodes[k];
Tree.Nodes = dNodes[k];
}
public void SetTreeNodes()
{
Tree.Nodes = nodes;
nodes.BeginUpdate();
var test_item = new TreeViewItem("added");
var test_node = new TreeNode<TreeViewItem>(test_item);
nodes.Add(test_node);
nodes[1].IsVisible = false;
nodes[2].Nodes[1].IsVisible = false;
nodes.EndUpdate();
}
public void AddNode()
{
var test_item = new TreeViewItem("New node");
var test_node = new TreeNode<TreeViewItem>(test_item);
nodes.Add(test_node);
}
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();
}
void SetVisible(TreeNode<TreeViewItem> node)
{
if (node.Nodes!=null)
{
node.Nodes.ForEach(SetVisible);
}
node.IsVisible = true;
}
public void Filter(string nameContains)
{
nodes.BeginUpdate();
SampleFilter(nodes, x => x.Name.Contains(nameContains));
nodes.EndUpdate();
}
public void Clear()
{
//nodes.Clear();
nodes = new ObservableList<TreeNode<TreeViewItem>>();
Tree.Nodes = nodes;
}
bool SampleFilter(IObservableList<TreeNode<TreeViewItem>> nodes, Func<TreeViewItem,bool> filterFunc)
{
return nodes.Count(x => {
var have_visible_children = (x.Nodes==null) ? false : SampleFilter(x.Nodes, filterFunc);
x.IsVisible = have_visible_children || filterFunc(x.Item) ;
return x.IsVisible;
}) > 0;
}
static public ObservableList<TreeNode<TreeViewItem>> GenerateTreeNodes(List<int> items, string nameStartsWith = "Node ", bool isExpanded = true)
{
return Enumerable.Range(1, items[0]).Select(x => {
var item_name = nameStartsWith + x;
var item = new TreeViewItem(item_name, null);
var nodes = items.Count > 1
? GenerateTreeNodes(items.GetRange(1, items.Count - 1), item_name + " - ", isExpanded)
: null;
return new TreeNode<TreeViewItem>(item, nodes, isExpanded);
}).ToObservableList();
}
public void ReloadScene()
{
#if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2
Application.LoadLevel(Application.loadedLevel);
#else
UnityEngine.SceneManagement.SceneManager.LoadScene(UnityEngine.SceneManagement.SceneManager.GetActiveScene().buildIndex);
#endif
}
}
}