diff --git a/CustomWidgets/TreeView/TreeNode.cs b/CustomWidgets/TreeView/TreeNode.cs index d0acfd609..02a355d65 100644 --- a/CustomWidgets/TreeView/TreeNode.cs +++ b/CustomWidgets/TreeView/TreeNode.cs @@ -378,7 +378,14 @@ namespace MatterHackers.MatterControl.CustomWidgets.TreeView // A TreeView that represents the parent tree view that the // tree node is assigned to, or null if the node has not been assigned to a tree // view. - public virtual TreeView TreeView => NodeParent.TreeView; + + private TreeView _treeView; + + public virtual TreeView TreeView + { + get => _treeView ?? NodeParent.TreeView; + set => _treeView = value; + } private void OnImageChanged(EventArgs args) { diff --git a/CustomWidgets/TreeView/TreeView.cs b/CustomWidgets/TreeView/TreeView.cs index 8c7e36526..f3c98cfea 100644 --- a/CustomWidgets/TreeView/TreeView.cs +++ b/CustomWidgets/TreeView/TreeView.cs @@ -36,33 +36,22 @@ using MatterHackers.VectorMath; namespace MatterHackers.MatterControl.CustomWidgets.TreeView { - public class TopNode : TreeNode - { - internal TreeView treeView; - public override TreeView TreeView => treeView; - } - public class TreeView : ScrollableWidget { private ThemeConfig theme; - public TreeView(TopNode topNode, ThemeConfig theme) - : this(topNode, 0, 0, theme) + public TreeView(ThemeConfig theme) + : this(0, 0, theme) { } - public TreeView(TopNode topNode, int width, int height, ThemeConfig theme) + public TreeView(int width, int height, ThemeConfig theme) : base(width, height) { this.theme = theme; this.AutoScroll = true; this.HAnchor = HAnchor.Stretch; this.VAnchor = VAnchor.Stretch; - this.TopNode = topNode; - - topNode.treeView = this; - - this.AddChild(TopNode); } #region Events @@ -230,7 +219,6 @@ namespace MatterHackers.MatterControl.CustomWidgets.TreeView public bool ShowPlusMinus { get; set; } public bool ShowRootLines { get; set; } public bool Sorted { get; set; } - public TreeNode TopNode { get; } public IComparer TreeViewNodeSorter { get; set; } diff --git a/PartPreviewWindow/Object3DTreeBuilder.cs b/PartPreviewWindow/Object3DTreeBuilder.cs index 79bd12bbb..2edfad8e2 100644 --- a/PartPreviewWindow/Object3DTreeBuilder.cs +++ b/PartPreviewWindow/Object3DTreeBuilder.cs @@ -31,6 +31,7 @@ using MatterHackers.Agg.UI; using MatterHackers.DataConverters3D; using MatterHackers.MatterControl.CustomWidgets; using MatterHackers.MatterControl.CustomWidgets.TreeView; +using MatterHackers.MatterControl.DesignTools; using MatterHackers.MatterControl.Library; using MatterHackers.MatterControl.PartPreviewWindow.View3D; @@ -38,39 +39,12 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { public static class Object3DTreeBuilder { - public static TreeView GetPartTreeView(IObject3D rootItem, ThemeConfig theme) + public static TreeNode BuildTree(IObject3D rootItem, ThemeConfig theme) { - var topNode = new TopNode() - { - Text = BuildDefaultName(rootItem), - Tag = rootItem, - TextColor = theme.Colors.PrimaryTextColor, - PointSize = theme.DefaultFontSize - }; - - var treeView = new TreeView(topNode, theme) - { - TextColor = theme.Colors.PrimaryTextColor, - PointSize = theme.DefaultFontSize - }; - - treeView.SuspendLayout(); - - //selectionTreeNodes.Clear(); - //selectionTreeNodes.Add(rootItem, topNode); - - // add the children to the root node - foreach (var child in rootItem.Children) - { - AddTree(child, topNode, theme); - } - - treeView.ResumeLayout(); - - return treeView; + return AddTree(rootItem, null, theme); } - private static void AddTree(IObject3D item, TreeNode parent, ThemeConfig theme) + private static TreeNode AddTree(IObject3D item, TreeNode parent, ThemeConfig theme) { // Suppress MeshWrapper nodes in treeview - retain parent node as context reference var contextNode = (item is MeshWrapper) ? parent : AddItem(item, parent, theme); @@ -79,6 +53,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { AddTree(child, contextNode, theme); } + + return contextNode; } private static TreeNode AddItem(IObject3D item, TreeNode parentNode, ThemeConfig theme) @@ -115,8 +91,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; } - parentNode.Nodes.Add(node); - parentNode.Expanded = true; + if (parentNode != null) + { + parentNode.Nodes.Add(node); + parentNode.Expanded = true; + } return node; } diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 3c73cef96..38a457e37 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -192,7 +192,18 @@ namespace MatterHackers.MatterControl.PartPreviewWindow modelViewSidePanel.AddChild(treeSection); // add the tree view - this.RebuildTreeSection(new Object3D(), theme); + treeView = new TreeView(theme) + { + TextColor = theme.Colors.PrimaryTextColor, + PointSize = theme.DefaultFontSize, + HAnchor =HAnchor.Stretch, + VAnchor = VAnchor.Stretch + }; + treeView.AfterSelect += (s, e) => + { + selectedObjectPanel.SetActiveItem((IObject3D)treeView.SelectedNode.Tag); + }; + treeSection.AddChild(treeView); modelViewSidePanel.AddChild(selectedObjectPanel); splitContainer.AddChild(modelViewSidePanel); @@ -236,24 +247,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } - private void RebuildTreeSection(IObject3D selection, ThemeConfig theme) - { - treeSection.CloseAllChildren(); - - treeView = Object3DTreeBuilder.GetPartTreeView(selection, theme); - treeSection.AddChild(treeView); - treeView.AfterSelect += (s, e) => - { - selectedObjectPanel.SetActiveItem((IObject3D)treeView.SelectedNode.Tag); - }; - - if (this.Parent != null) - { - treeView.TopNode.Padding = treeView.TopNode.Padding.Clone(left: 8, top: 8); - treeView.SelectedNode = treeView.TopNode; - } - } - private void UpdateRenderView(object sender, EventArgs e) { TrackballTumbleWidget.CenterOffsetX = -modelViewSidePanel.Width; @@ -1222,9 +1215,20 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } // Top level selection only - rebuild tree - if (Scene.Children.Contains(Scene.SelectedItem)) + var selection = Scene.SelectedItem; + if (Scene.Children.Contains(selection)) { - this.RebuildTreeSection(Scene.SelectedItem, theme); + treeView.ScrollArea.CloseAllChildren(); + + var rootNode = Object3DTreeBuilder.BuildTree(selection, theme); + treeView.AddChild(rootNode); + rootNode.TreeView = treeView; + + if (this.Parent != null) + { + rootNode.Padding = rootNode.Padding.Clone(left: 8, top: 8); + treeView.SelectedNode = rootNode; + } } } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index a38d5e68b..21532f82c 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit a38d5e68bcaace904d1dc18e416ea9ace6756ac2 +Subproject commit 21532f82c733e0adc9db8b82f2f10cb66b60ed52