Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }