From dccc9c86249a96acf9daedc078410bab91015c2f Mon Sep 17 00:00:00 2001 From: John Lewin Date: Wed, 20 Sep 2017 12:06:53 -0700 Subject: [PATCH] Show widget tree, directly handle draw, revise size & position --- MatterControlApplication.cs | 2 + Utilities/InspectForm.Designer.cs | 10 +-- Utilities/InspectForm.cs | 108 ++++++++++++++++++++++++------ 3 files changed, 93 insertions(+), 27 deletions(-) diff --git a/MatterControlApplication.cs b/MatterControlApplication.cs index 5addb9904..1d57dee91 100644 --- a/MatterControlApplication.cs +++ b/MatterControlApplication.cs @@ -769,6 +769,8 @@ namespace MatterHackers.MatterControl { // Otherwise open inspectForm = new InspectForm(this); + inspectForm.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + inspectForm.Location = new System.Drawing.Point(0, 0); inspectForm.FormClosed += (s, e2) => { inspectForm = null; diff --git a/Utilities/InspectForm.Designer.cs b/Utilities/InspectForm.Designer.cs index 8cf373d53..e690490c6 100644 --- a/Utilities/InspectForm.Designer.cs +++ b/Utilities/InspectForm.Designer.cs @@ -58,8 +58,8 @@ this.splitContainer1.Panel2.Controls.Add(this.toolStrip1); this.splitContainer1.Panel2.Controls.Add(this.propertyGrid1); this.splitContainer1.Panel2.Padding = new System.Windows.Forms.Padding(0, 27, 0, 0); - this.splitContainer1.Size = new System.Drawing.Size(951, 632); - this.splitContainer1.SplitterDistance = 589; + this.splitContainer1.Size = new System.Drawing.Size(440, 632); + this.splitContainer1.SplitterDistance = 169; this.splitContainer1.SplitterWidth = 3; this.splitContainer1.TabIndex = 0; // @@ -72,7 +72,7 @@ this.treeView1.Location = new System.Drawing.Point(0, 0); this.treeView1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.treeView1.Name = "treeView1"; - this.treeView1.Size = new System.Drawing.Size(589, 632); + this.treeView1.Size = new System.Drawing.Size(169, 632); this.treeView1.TabIndex = 0; this.treeView1.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(this.treeView1_DrawNode); this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect); @@ -119,7 +119,7 @@ this.propertyGrid1.Location = new System.Drawing.Point(0, 27); this.propertyGrid1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.propertyGrid1.Name = "propertyGrid1"; - this.propertyGrid1.Size = new System.Drawing.Size(359, 605); + this.propertyGrid1.Size = new System.Drawing.Size(268, 605); this.propertyGrid1.TabIndex = 0; this.propertyGrid1.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.propertyGrid1_PropertyValueChanged); // @@ -127,7 +127,7 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(951, 632); + this.ClientSize = new System.Drawing.Size(440, 632); this.Controls.Add(this.splitContainer1); this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.Name = "InspectForm"; diff --git a/Utilities/InspectForm.cs b/Utilities/InspectForm.cs index 87326e2e3..33c6cb046 100644 --- a/Utilities/InspectForm.cs +++ b/Utilities/InspectForm.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.Linq; using System.Windows.Forms; using MatterHackers.Agg; @@ -27,6 +28,10 @@ namespace MatterHackers.MatterControl inspectedSystemWindow.MouseMove += systemWindow_MouseMove; inspectedSystemWindow.AfterDraw += systemWindow_AfterDraw; inspectedSystemWindow.Invalidate(); + + treeView1.SuspendLayout(); + this.AddTree(inspectedSystemWindow, null, "SystemWindow"); + treeView1.ResumeLayout(); } public bool Inspecting { get; set; } = true; @@ -49,6 +54,8 @@ namespace MatterHackers.MatterControl } } + private HashSet ancestryTree = new HashSet(); + private GuiWidget _inspectedWidget; private GuiWidget InspectedWidget { @@ -74,6 +81,9 @@ namespace MatterHackers.MatterControl if (_inspectedWidget != null) { + ancestryTree = new HashSet(_inspectedWidget.Parents()); + ancestryTree.Add(_inspectedWidget); + propertyGrid1.SelectedObject = _inspectedWidget; _inspectedWidget.DebugShowBounds = true; @@ -100,27 +110,30 @@ namespace MatterHackers.MatterControl if (treeNodes.TryGetValue(_inspectedWidget, out TreeNode treeNode)) { treeView1.SelectedNode = treeNode; + treeNode.EnsureVisible(); activeTreeNode = treeNode; - activeTreeNode.Checked = true; + treeView1.Invalidate(); } _inspectedWidget.Invalidate(); } + } + private Font boldFont; + private void inspectedWidget_MouseUp(object sender, Agg.UI.MouseEventArgs e) { // Stop listing on click this.Inspecting = false; } - private void AddItem(GuiWidget widget, string text = null, TreeNode childNode = null) + private void AddItem(GuiWidget widget, string text = null, TreeNode childNode = null, bool showAllParents = true) { - if (text == null) { - text = BuildName(widget); + text = BuildDefaultName(widget); } if (treeNodes.TryGetValue(widget, out TreeNode existingNode)) @@ -138,6 +151,11 @@ namespace MatterHackers.MatterControl Tag = widget }; + if (boldFont == null) + { + boldFont = new Font(node.NodeFont, FontStyle.Bold); + } + if (childNode != null) { node.Nodes.Add(childNode); @@ -145,35 +163,56 @@ namespace MatterHackers.MatterControl } treeNodes.Add(widget, node); - var parent = widget.Parent; - if (parent == null) + if (showAllParents) { - treeView1.Nodes.Add(node); + var parent = widget.Parent; + if (parent == null) + { + treeView1.Nodes.Add(node); + } + else + { + AddItem(parent, parent.Text, node); + } } else { - AddItem(parent, parent.Text, node); + treeView1.Nodes.Add(node); } } } - public void RebuildUI(List namedChildren) + private TreeNode AddItem(GuiWidget widget, TreeNode parentNode, string overrideText = null) { - treeView1.Nodes.Clear(); - treeNodes.Clear(); - - treeView1.SuspendLayout(); - - for (int i = 0; i < namedChildren.Count; i++) + var node = new TreeNode(overrideText ?? BuildDefaultName(widget)) { - var child = namedChildren[i]; - AddItem(child.widget); + Tag = widget + }; + treeNodes.Add(widget, node); + + if (parentNode == null) + { + treeView1.Nodes.Add(node); + } + else + { + parentNode.Nodes.Add(node); } - treeView1.ResumeLayout(); + return node; } - private string BuildName(GuiWidget widget) + private void AddTree(GuiWidget widget, TreeNode parent, string text = null, TreeNode childNode = null) + { + var node = AddItem(widget, parent); + + foreach(var child in widget.Children) + { + AddTree(child, node); + } + } + + private string BuildDefaultName(GuiWidget widget) { string nameToWrite = _inspectedWidget == widget ? "* " : ""; if (!string.IsNullOrEmpty(widget.Name)) @@ -240,8 +279,6 @@ namespace MatterHackers.MatterControl if (namedChildren.LastOrDefault()?.widget is GuiWidget firstUnderMouse && firstUnderMouse != this.InspectedWidget) { - RebuildUI(namedChildren); - this.InspectedWidget = firstUnderMouse; } } @@ -283,7 +320,34 @@ namespace MatterHackers.MatterControl private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) { - e.DrawDefault = true; + var node = e.Node; + + if (node.IsVisible) + { + Brush brush; + if (node == activeTreeNode) + { + brush = SystemBrushes.Highlight; + } + else if (ancestryTree.Contains(node.Tag as GuiWidget)) + { + brush = Brushes.LightBlue; + } + else + { + brush = Brushes.Transparent; + } + + e.Graphics.FillRectangle(brush, e.Node.Bounds); + + TextRenderer.DrawText( + e.Graphics, + node.Text, + node == activeTreeNode ? boldFont : node.NodeFont, + new Point(node.Bounds.Left, node.Bounds.Top), + Color.Black, + Color.Transparent); + } } } }