From a74ddadd5912acfc84efaa6c2f70ef23eeb37958 Mon Sep 17 00:00:00 2001 From: Michael Vance Date: Thu, 30 Mar 2017 14:22:45 -0400 Subject: [PATCH] Improved TreeListView copy/paste support. - Fix sorting to respect visual ordering by ID, including parent. - Provide Ctrl-A to 'Select All'. Note that there is an extant bug with the redraw where renderdocui will not repaint when it gets focus back. --- .../Controls/TreeListView/TreeListNode.cs | 61 +++++++++++++------ .../Controls/TreeListView/TreeListView.cs | 11 ++++ .../Dialogs/ConstantBufferPreviewer.cs | 4 ++ 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/renderdocui/Controls/TreeListView/TreeListNode.cs b/renderdocui/Controls/TreeListView/TreeListNode.cs index 79db3d61f..605b28c08 100644 --- a/renderdocui/Controls/TreeListView/TreeListNode.cs +++ b/renderdocui/Controls/TreeListView/TreeListNode.cs @@ -328,21 +328,6 @@ namespace TreelistView { return GetRoot().Owner; } - public string GetId() - { - StringBuilder sb = new StringBuilder(32); - Node node = this; - while (node != null) - { - node.Owner.UpdateChildIds(false); - if (node.Parent != null) - sb.Insert(0, "." + node.Id.ToString()); - else - sb.Insert(0, node.Id.ToString()); - node = node.Parent; - } - return sb.ToString(); - } internal void InsertBefore(Node insertBefore, NodeCollection owner) { this.m_owner = owner; @@ -1100,11 +1085,53 @@ namespace TreelistView return m_nodesMap.ContainsKey(node); } + private class NodeSorter : IComparer + { + private Stack BuildIds(Node node) + { + Stack ids = new Stack(); + while (node != null) + { + node.Owner.UpdateChildIds(false); + ids.Push(node.Id); + node = node.Parent; + } + return ids; + } + private int NextId(Stack ids) + { + if (ids.Count > 0) + return ids.Pop(); + else + return -1; + } + public int Compare(Node left, Node right) + { + Stack leftIds = BuildIds(left); + Stack rightIds = BuildIds(right); + int deepest = Math.Max(leftIds.Count, rightIds.Count); + while(deepest > 0) + { + int lid = NextId(leftIds); + int rid = NextId(rightIds); + + if (lid < rid) + return -1; + else if (lid > rid) + return 1; + + deepest -= 1; + } + return 0; + } + } + public void Sort() { - SortedList list = new SortedList(); + NodeSorter Sorter = new NodeSorter(); + SortedList list = new SortedList(m_nodes.Count, Sorter); foreach (Node node in m_nodes) - list.Add(node.GetId(), node); + list.Add(node, node); m_nodes = new List(list.Values); } diff --git a/renderdocui/Controls/TreeListView/TreeListView.cs b/renderdocui/Controls/TreeListView/TreeListView.cs index 5ae85fde4..7ba47a898 100644 --- a/renderdocui/Controls/TreeListView/TreeListView.cs +++ b/renderdocui/Controls/TreeListView/TreeListView.cs @@ -410,6 +410,17 @@ namespace TreelistView m_nodesSelection.Sort(); } + public void SelectAll() + { + FocusedNode = null; + NodesSelection.Clear(); + foreach (Node node in NodeCollection.ForwardNodeIterator(m_firstVisibleNode, true)) + { + NodesSelection.Add(node); + } + Invalidate(); + } + [Browsable(false)] public Node SelectedNode { diff --git a/renderdocui/Windows/Dialogs/ConstantBufferPreviewer.cs b/renderdocui/Windows/Dialogs/ConstantBufferPreviewer.cs index b55cc6395..47ef66cb7 100644 --- a/renderdocui/Windows/Dialogs/ConstantBufferPreviewer.cs +++ b/renderdocui/Windows/Dialogs/ConstantBufferPreviewer.cs @@ -364,6 +364,10 @@ namespace renderdocui.Controls } } } + else if(e.KeyCode == Keys.A && e.Control) + { + variables.SelectAll(); + } } private BufferFormatSpecifier m_FormatSpecifier = null;