mattercontrol/InspectForm.cs

221 lines
4.8 KiB
C#
Raw Normal View History

2017-09-18 10:05:04 -07:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl
{
public partial class InspectForm : Form
{
private TreeNode activeTreeNode;
2017-09-18 10:05:04 -07:00
private GuiWidget inspectedWidget;
private GuiWidget InspectedWidget
{
get => inspectedWidget;
set
{
if (inspectedWidget != null)
{
inspectedWidget.DebugShowBounds = false;
inspectedWidget.MouseUp -= InspectedWidget_MouseUp;
inspectedWidget.MouseDown -= InspectedWidget_MouseUp;
2017-09-18 10:05:04 -07:00
}
inspectedWidget = value;
if (inspectedWidget != null)
{
propertyGrid1.SelectedObject = inspectedWidget;
inspectedWidget.DebugShowBounds = true;
// Hook to stop listing on click
inspectedWidget.MouseUp += InspectedWidget_MouseUp;
inspectedWidget.MouseDown += InspectedWidget_MouseUp;
2017-09-18 10:05:04 -07:00
}
if (activeTreeNode != null)
{
activeTreeNode.Checked = false;
}
if (treeNodes.TryGetValue(inspectedWidget, out TreeNode treeNode))
{
treeView1.SelectedNode = treeNode;
activeTreeNode = treeNode;
activeTreeNode.Checked = true;
}
inspectedWidget.Invalidate();
}
}
private GuiWidget inspectedSystemWindow;
private Vector2 mousePosition;
private Dictionary<GuiWidget, TreeNode> treeNodes = new Dictionary<GuiWidget, TreeNode>();
2017-09-18 10:05:04 -07:00
public InspectForm(GuiWidget inspectionSource)
{
InitializeComponent();
// Store position on move, invalidate in needed
2017-09-18 10:05:04 -07:00
inspectionSource.MouseMove += (s, e) =>
{
mousePosition = e.Position;
if (this.inspectedWidget?.FirstWidgetUnderMouse == false)
{
this.inspectedSystemWindow.Invalidate();
}
2017-09-18 10:05:04 -07:00
};
inspectionSource.AfterDraw += (s, e) =>
{
if (this.Inspecting && !inspectionSource.HasBeenClosed)
2017-09-18 10:05:04 -07:00
{
var namedChildren = new List<GuiWidget.WidgetAndPosition>();
inspectedSystemWindow.FindNamedChildrenRecursive(
"",
namedChildren,
new RectangleDouble(mousePosition.x, mousePosition.y, mousePosition.x + 1, mousePosition.y + 1),
GuiWidget.SearchType.Partial,
allowDisabledOrHidden: false);
// If the context changed, update the UI
if (namedChildren.LastOrDefault()?.widget is GuiWidget firstUnderMouse
&& firstUnderMouse != this.InspectedWidget)
{
RebuildUI(namedChildren);
this.InspectedWidget = firstUnderMouse;
}
}
};
this.inspectedSystemWindow = inspectionSource;
inspectionSource.Invalidate();
}
public bool Inspecting { get; set; }
private void InspectedWidget_MouseUp(object sender, Agg.UI.MouseEventArgs e)
{
// Stop listing on click
this.Inspecting = false;
}
2017-09-18 10:05:04 -07:00
private void AddItem(GuiWidget widget, string text, TreeNode childNode = null)
{
if (treeNodes.TryGetValue(widget, out TreeNode existingNode))
{
existingNode.Nodes.Add(childNode);
existingNode.Expand();
}
else
{
var node = new TreeNode(text)
{
Tag = widget
};
if (childNode != null)
{
node.Nodes.Add(childNode);
node.Expand();
}
treeNodes.Add(widget, node);
var parent = widget.Parent;
if (parent == null)
{
treeView1.Nodes.Add(node);
}
else
{
AddItem(parent, parent.Text, node);
}
}
}
public void RebuildUI(List<GuiWidget.WidgetAndPosition> namedChildren)
{
treeView1.Nodes.Clear();
treeNodes.Clear();
treeView1.SuspendLayout();
for (int i = 0; i < namedChildren.Count; i++)
{
var child = namedChildren[i];
AddItem(child.widget, BuildName(child.widget));
}
treeView1.ResumeLayout();
}
private string BuildName(GuiWidget widget)
{
string nameToWrite = inspectedWidget == widget ? "* " : "";
if (!string.IsNullOrEmpty(widget.Name))
{
nameToWrite += $"{widget.GetType().Name} --- {widget.Name}";
}
else
{
nameToWrite += $"{widget.GetType().Name}";
}
return nameToWrite;
}
int selectionIndex;
protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode == System.Windows.Forms.Keys.F2)
{
selectionIndex++;
}
else if (e.KeyCode == System.Windows.Forms.Keys.F2)
{
selectionIndex--;
}
base.OnKeyDown(e);
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
this.InspectedWidget = e.Node.Tag as GuiWidget;
}
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
this.InspectedWidget.Invalidate();
}
public void MoveUpTree()
{
if (activeTreeNode?.Parent is TreeNode parent)
{
this.InspectedWidget = parent.Tag as GuiWidget;
}
}
public void MoveDownTree()
{
if (activeTreeNode?.Nodes.Cast<TreeNode>().FirstOrDefault() is TreeNode firstChild)
{
this.InspectedWidget = firstChild.Tag as GuiWidget;
}
}
2017-09-18 10:05:04 -07:00
}
}