protected override void CompileList(List <TreeGumpNode> list) { foreach (var n in Nodes.Keys) { list.AddOrReplace(n); } var nodes = new List <TreeGumpNode>(list.Count); foreach (var n in list) { foreach (var p in n.GetParents()) { nodes.AddOrReplace(p); } nodes.AddOrReplace(n); } if (SelectedNode.HasParent) { nodes.AddOrReplace(SelectedNode.Parent); } var selectedParents = SelectedNode.GetParents().ToArray(); nodes.RemoveAll( c => { var parents = c.GetParents().ToArray(); if (parents.Length > 0) { if (parents.Length <= selectedParents.Length && c != SelectedNode && !parents.Contains(SelectedNode) && !selectedParents.Any(p => p == c || c.Parent == p)) { return(true); } if (parents.Length > selectedParents.Length && c.Parent != SelectedNode) { return(true); } } return(false); }); list.Clear(); list.AddRange(nodes); nodes.Free(true); base.CompileList(list); }
protected override void CompileList(List <TreeGumpNode> list) { foreach (var n in Nodes.Keys) { list.AddOrReplace(n); } var nodes = ListPool <TreeGumpNode> .AcquireObject(); var selected = ListPool <TreeGumpNode> .AcquireObject(); var parents = ListPool <TreeGumpNode> .AcquireObject(); nodes.Capacity = list.Count; foreach (var n in list) { foreach (var p in n.GetParents()) { nodes.AddOrReplace(p); } nodes.AddOrReplace(n); } if (SelectedNode.HasParent) { nodes.AddOrReplace(SelectedNode.Parent); } selected.AddRange(SelectedNode.GetParents()); nodes.RemoveAll( c => { parents.AddRange(c.GetParents()); var remove = false; if (parents.Count > 0) { if (parents.Count <= selected.Count && c != SelectedNode && !parents.Contains(SelectedNode) && !selected.Any(p => p == c || c.Parent == p)) { remove = true; } else if (parents.Count > selected.Count && c.Parent != SelectedNode) { remove = true; } } parents.Clear(); return(remove); }); list.Clear(); list.AddRange(nodes); ObjectPool.Free(ref nodes); ObjectPool.Free(ref selected); ObjectPool.Free(ref parents); base.CompileList(list); }