From ca2843e5be6b6cfcd403d061aefffff5f4ba3742 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Fri, 24 Mar 2023 17:23:05 -0700 Subject: [PATCH] refactoring treeview --- .../DesignTools/PublicPropertyEditor.cs | 1 - .../Library/Widgets/AddMaterialWidget.cs | 57 +--- .../Library/Widgets/AddPrinterWidget.cs | 64 +--- .../Library/Widgets/SearchableTreePanel.cs | 310 ++++++++++-------- MatterControlLib/SetupWizard/HelpTreePanel.cs | 71 ++-- StaticData/Translations/Master.txt | 3 + Submodules/agg-sharp | 2 +- 7 files changed, 224 insertions(+), 284 deletions(-) diff --git a/MatterControlLib/DesignTools/PublicPropertyEditor.cs b/MatterControlLib/DesignTools/PublicPropertyEditor.cs index fce2967fb..34bd4e5c7 100644 --- a/MatterControlLib/DesignTools/PublicPropertyEditor.cs +++ b/MatterControlLib/DesignTools/PublicPropertyEditor.cs @@ -44,7 +44,6 @@ using MatterHackers.DataConverters3D; using MatterHackers.ImageProcessing; using MatterHackers.Localizations; using MatterHackers.MatterControl.CustomWidgets; -using MatterHackers.MatterControl.DataStorage; using MatterHackers.MatterControl.DesignTools.EditableTypes; using MatterHackers.MatterControl.DesignTools.Operations; using MatterHackers.MatterControl.Library.Widgets; diff --git a/MatterControlLib/Library/Widgets/AddMaterialWidget.cs b/MatterControlLib/Library/Widgets/AddMaterialWidget.cs index 6397f35ce..daecccfda 100644 --- a/MatterControlLib/Library/Widgets/AddMaterialWidget.cs +++ b/MatterControlLib/Library/Widgets/AddMaterialWidget.cs @@ -66,14 +66,14 @@ namespace MatterHackers.MatterControl.Library.Widgets horizontalSplitter.Panel2.Padding = theme.DefaultContainerPadding; - treeView.AfterSelect += this.TreeView_AfterSelect; + TreeView.AfterSelect += this.TreeView_AfterSelect; - treeView.NodeMouseDoubleClick += (s, e) => + TreeView.NodeMouseDoubleClick += (s, e) => { if (e is MouseEventArgs mouseEvent && mouseEvent.Button == MouseButtons.Left && mouseEvent.Clicks == 2 - && treeView?.SelectedNode is TreeNode treeNode) + && TreeView?.SelectedNode is TreeNode treeNode) { nextButton.InvokeClick(); } @@ -85,7 +85,7 @@ namespace MatterHackers.MatterControl.Library.Widgets { var rootNode = this.CreateTreeNode(rootDirectory); rootNode.Expandable = true; - rootNode.TreeView = treeView; + rootNode.TreeView = TreeView; contentPanel.AddChild(rootNode); } @@ -120,43 +120,10 @@ namespace MatterHackers.MatterControl.Library.Widgets horizontalSplitter.Panel2.AddChild(panel2Column); } - protected override bool FilterTree(TreeNode context, string filter, bool parentVisible, List matches) + protected override bool NodeMatchesFilter(TreeNode context, string filter) { - // Filter against make/model for printers or make for top level nodes - string itemText = context.Text; - - bool hasFilterText = itemText.IndexOf(filter, StringComparison.OrdinalIgnoreCase) != -1; - context.Visible = hasFilterText || parentVisible; - - if (context.Visible - && context.NodeParent != null) - { - context.NodeParent.Visible = true; - context.NodeParent.Expanded = true; - context.Expanded = true; - } - - if (context.NodeParent != null - && hasFilterText) - { - matches.Add(context); - } - - bool childMatched = false; - - foreach (var child in context.Nodes) - { - childMatched |= FilterTree(child, filter, hasFilterText || parentVisible, matches); - } - - bool hasMatch = childMatched || hasFilterText; - - if (hasMatch) - { - context.Visible = context.Expanded = true; - } - - return hasMatch; + // check if the node matches the filter + return context.Text.IndexOf(filter, StringComparison.OrdinalIgnoreCase) != -1; } private static void SetImage(TreeNode node, ImageBuffer image) @@ -216,15 +183,15 @@ namespace MatterHackers.MatterControl.Library.Widgets private void TreeView_AfterSelect(object sender, TreeNode e) { - if (treeView.SelectedNode?.Tag != null) + if (TreeView.SelectedNode?.Tag != null) { UiThread.RunOnIdle(() => { - if (treeView.SelectedNode != null) + if (TreeView.SelectedNode != null) { - string printerName = treeView.SelectedNode.Tag.ToString(); + string printerName = TreeView.SelectedNode.Tag.ToString(); - this.SelectedMaterial = treeView.SelectedNode.Tag as MaterialInfo; + this.SelectedMaterial = TreeView.SelectedNode.Tag as MaterialInfo; materialInfo.CloseChildren(); var printerDetails = new PrinterDetails( @@ -266,7 +233,7 @@ namespace MatterHackers.MatterControl.Library.Widgets printerDetails.ProductDataContainer.AddChild(settingsBackground); }; - nextButtonEnabled(treeView.SelectedNode != null); + nextButtonEnabled(TreeView.SelectedNode != null); } }); } diff --git a/MatterControlLib/Library/Widgets/AddPrinterWidget.cs b/MatterControlLib/Library/Widgets/AddPrinterWidget.cs index 7970690ef..ef6de2f2e 100644 --- a/MatterControlLib/Library/Widgets/AddPrinterWidget.cs +++ b/MatterControlLib/Library/Widgets/AddPrinterWidget.cs @@ -59,14 +59,14 @@ namespace MatterHackers.MatterControl.Library.Widgets horizontalSplitter.Panel2.Padding = theme.DefaultContainerPadding; - treeView.AfterSelect += this.TreeView_AfterSelect; + TreeView.AfterSelect += this.TreeView_AfterSelect; - treeView.NodeMouseDoubleClick += (s, e) => + TreeView.NodeMouseDoubleClick += (s, e) => { if (e is MouseEventArgs mouseEvent && mouseEvent.Button == MouseButtons.Left && mouseEvent.Clicks == 2 - && treeView?.SelectedNode is TreeNode treeNode) + && TreeView?.SelectedNode is TreeNode treeNode) { nextButton.InvokeClick(); } @@ -84,7 +84,7 @@ namespace MatterHackers.MatterControl.Library.Widgets var rootNode = this.CreateTreeNode(oem); rootNode.Expandable = true; - rootNode.TreeView = treeView; + rootNode.TreeView = TreeView; rootNode.Load += (s, e) => { var image = OemSettings.Instance.GetIcon(oem.Key, theme); @@ -226,45 +226,13 @@ namespace MatterHackers.MatterControl.Library.Widgets this.PrinterNameError.Visible = true; } - protected override bool FilterTree(TreeNode context, string filter, bool parentVisible, List matches) - { - // Filter against make/model for printers or make for top level nodes - string itemText = (context.Tag as MakeModelInfo)?.ToString() ?? context.Text; - - bool hasFilterText = itemText.IndexOf(filter, StringComparison.OrdinalIgnoreCase) != -1; - context.Visible = hasFilterText || parentVisible; - - if (context.Visible - && context.NodeParent != null) - { - context.NodeParent.Visible = true; - context.NodeParent.Expanded = true; - context.Expanded = true; - } - - if (context.NodeParent != null - && hasFilterText) - { - matches.Add(context); - } - - bool childMatched = false; - - foreach (var child in context.Nodes) - { - childMatched |= FilterTree(child, filter, hasFilterText || parentVisible, matches); - } - - bool hasMatch = childMatched || hasFilterText; - - if (hasMatch) - { - context.Visible = context.Expanded = true; - } - - return hasMatch; - } + protected override bool NodeMatchesFilter(TreeNode context, string filter) + { + // Filter against make/model for printers or make for top level nodes + string itemText = (context.Tag as MakeModelInfo)?.ToString() ?? context.Text; + return itemText.IndexOf(filter, StringComparison.OrdinalIgnoreCase) != -1; + } private void ClearError() { @@ -314,24 +282,24 @@ namespace MatterHackers.MatterControl.Library.Widgets private void TreeView_AfterSelect(object sender, TreeNode e) { - nameSection.Enabled = treeView.SelectedNode != null; + nameSection.Enabled = TreeView.SelectedNode != null; this.ClearError(); this.PrinterNameError.Visible = false; if (nameSection.Enabled - && treeView.SelectedNode.Tag != null) + && TreeView.SelectedNode.Tag != null) { UiThread.RunOnIdle(() => { if (usingDefaultName - && treeView.SelectedNode != null) + && TreeView.SelectedNode != null) { - string printerName = treeView.SelectedNode.Tag.ToString(); + string printerName = TreeView.SelectedNode.Tag.ToString(); printerNameInput.Text = Util.GetNonCollidingName(printerName, this.ExistingPrinterNames); - this.SelectedPrinter = treeView.SelectedNode.Tag as MakeModelInfo; + this.SelectedPrinter = TreeView.SelectedNode.Tag as MakeModelInfo; printerInfo.CloseChildren(); @@ -356,7 +324,7 @@ namespace MatterHackers.MatterControl.Library.Widgets }); } - nextButtonEnabled(treeView.SelectedNode != null + nextButtonEnabled(TreeView.SelectedNode != null && !string.IsNullOrWhiteSpace(printerNameInput.Text)); } }); diff --git a/MatterControlLib/Library/Widgets/SearchableTreePanel.cs b/MatterControlLib/Library/Widgets/SearchableTreePanel.cs index d6be44ef8..afd2864f5 100644 --- a/MatterControlLib/Library/Widgets/SearchableTreePanel.cs +++ b/MatterControlLib/Library/Widgets/SearchableTreePanel.cs @@ -27,177 +27,213 @@ of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. */ -using System; -using System.Collections.Generic; -using System.Linq; - using MatterHackers.Agg; using MatterHackers.Agg.Platform; using MatterHackers.Agg.UI; using MatterHackers.ImageProcessing; -using MatterHackers.MatterControl.CustomWidgets; +using System; +using System.Collections.Generic; +using System.Linq; namespace MatterHackers.MatterControl.Library.Widgets { - public abstract class SearchableTreePanel : FlowLayoutWidget - { - protected TextEditWithInlineCancel searchBox; - protected TreeView treeView; - protected Splitter horizontalSplitter; - protected ThemeConfig theme; - protected FlowLayoutWidget contentPanel; + public abstract class SearchableTreePanel : FlowLayoutWidget + { + protected FlowLayoutWidget contentPanel; + protected Splitter horizontalSplitter; + protected TextEditWithInlineCancel searchBox; + protected ThemeConfig theme; - public SearchableTreePanel(ThemeConfig theme) - : base(FlowDirection.TopToBottom) - { - this.theme = theme; - this.TreeLoaded = false; + public SearchableTreePanel(ThemeConfig theme) + : base(FlowDirection.TopToBottom) + { + this.theme = theme; + this.TreeLoaded = false; - var searchIcon = StaticData.Instance.LoadIcon("icon_search_24x24.png", 16, 16).SetToColor(theme.TextColor).AjustAlpha(0.3); + var searchIcon = StaticData.Instance.LoadIcon("icon_search_24x24.png", 16, 16).SetToColor(theme.TextColor).AjustAlpha(0.3); - searchBox = new TextEditWithInlineCancel(theme) - { - Name = "Search", - HAnchor = HAnchor.Stretch, - Margin = new BorderDouble(6), - }; + searchBox = new TextEditWithInlineCancel(theme) + { + Name = "Search", + HAnchor = HAnchor.Stretch, + Margin = new BorderDouble(6), + }; - searchBox.ResetButton.Visible = false; + searchBox.ResetButton.Visible = false; - var searchInput = searchBox.TextEditWidget; + var searchInput = searchBox.TextEditWidget; - searchInput.BeforeDraw += (s, e) => - { - if (!searchBox.ResetButton.Visible) - { - e.Graphics2D.Render( - searchIcon, - searchInput.Width - searchIcon.Width - 5, - searchInput.LocalBounds.Bottom + searchInput.Height / 2 - searchIcon.Height / 2); - } - }; + searchInput.BeforeDraw += (s, e) => + { + if (!searchBox.ResetButton.Visible) + { + e.Graphics2D.Render( + searchIcon, + searchInput.Width - searchIcon.Width - 5, + searchInput.LocalBounds.Bottom + searchInput.Height / 2 - searchIcon.Height / 2); + } + }; - searchBox.ResetButton.Click += (s, e) => - { - this.ClearSearch(); - }; + searchBox.ResetButton.Click += (s, e) => + { + this.ClearSearch(); + }; - searchBox.KeyDown += (s, e) => - { - if (e.KeyCode == Keys.Escape) - { - this.ClearSearch(); - e.Handled = true; - } - }; + searchBox.KeyDown += (s, e) => + { + if (e.KeyCode == Keys.Escape) + { + this.ClearSearch(); + e.Handled = true; + } + }; - searchBox.TextEditWidget.ActualTextEditWidget.TextChanged += (s, e) => - { - if (string.IsNullOrWhiteSpace(searchBox.Text)) - { - this.ClearSearch(); - } - else - { - this.PerformSearch(searchBox.Text); - } - }; + searchBox.TextEditWidget.ActualTextEditWidget.TextChanged += (s, e) => + { + if (string.IsNullOrWhiteSpace(searchBox.Text)) + { + this.ClearSearch(); + } + else + { + this.PerformSearch(searchBox.Text); + } + }; - horizontalSplitter = new Splitter() - { - SplitterDistance = Math.Max(UserSettings.Instance.LibraryViewWidth, 20), - SplitterSize = theme.SplitterWidth, - SplitterBackground = theme.SplitterBackground - }; - horizontalSplitter.AnchorAll(); + horizontalSplitter = new Splitter() + { + SplitterDistance = Math.Max(UserSettings.Instance.LibraryViewWidth, 20), + SplitterSize = theme.SplitterWidth, + SplitterBackground = theme.SplitterBackground + }; + horizontalSplitter.AnchorAll(); - horizontalSplitter.DistanceChanged += (s, e) => - { - UserSettings.Instance.LibraryViewWidth = Math.Max(horizontalSplitter.SplitterDistance, 20); - }; + horizontalSplitter.DistanceChanged += (s, e) => + { + UserSettings.Instance.LibraryViewWidth = Math.Max(horizontalSplitter.SplitterDistance, 20); + }; - this.AddChild(horizontalSplitter); + this.AddChild(horizontalSplitter); - var leftPanel = new FlowLayoutWidget(FlowDirection.TopToBottom) - { - HAnchor = HAnchor.Stretch, - VAnchor = VAnchor.Stretch - }; + var leftPanel = new FlowLayoutWidget(FlowDirection.TopToBottom) + { + HAnchor = HAnchor.Stretch, + VAnchor = VAnchor.Stretch + }; - leftPanel.AddChild(searchBox); + leftPanel.AddChild(searchBox); - treeView = new TreeView(theme) - { - HAnchor = HAnchor.Stretch, - VAnchor = VAnchor.Stretch, - }; - leftPanel.AddChild(treeView); + TreeView = new TreeView(theme) + { + HAnchor = HAnchor.Stretch, + VAnchor = VAnchor.Stretch, + }; + leftPanel.AddChild(TreeView); - horizontalSplitter.Panel1.AddChild(leftPanel); + horizontalSplitter.Panel1.AddChild(leftPanel); - contentPanel = new FlowLayoutWidget(FlowDirection.TopToBottom) - { - HAnchor = HAnchor.Fit, - VAnchor = VAnchor.Fit, - Margin = new BorderDouble(left: 2) - }; - treeView.AddChild(contentPanel); - } + contentPanel = new FlowLayoutWidget(FlowDirection.TopToBottom) + { + HAnchor = HAnchor.Fit, + VAnchor = VAnchor.Fit, + Margin = new BorderDouble(left: 2) + }; + TreeView.AddChild(contentPanel); + } - protected virtual void PerformSearch(string filter) - { - var matches = new List(); + public bool TreeLoaded { get; protected set; } + + public TreeView TreeView { get; set; } - Console.WriteLine("Filter for: " + filter); + protected abstract bool NodeMatchesFilter(TreeNode context, string filter); - foreach (var rootNode in contentPanel.Children.OfType()) - { - FilterTree(rootNode, filter, false, matches); - } + protected virtual void OnClearSearch() + { + } - if (matches.Count == 1) - { - treeView.SelectedNode = matches.First(); - } - else - { - treeView.SelectedNode = null; - } + protected virtual void PerformSearch(string filter) + { + var matches = new List(); - searchBox.ResetButton.Visible = true; - } + Console.WriteLine("Filter for: " + filter); - private void ClearSearch() - { - foreach (var rootNode in contentPanel.Children.OfType()) - { - ResetTree(rootNode); - } + foreach (var rootNode in contentPanel.Children.OfType()) + { + FilterTree(rootNode, filter, false, matches); + } - searchBox.Text = ""; - searchBox.ResetButton.Visible = false; - treeView.SelectedNode = null; + if (matches.Count == 1) + { + TreeView.SelectedNode = matches.First(); + } + else + { + TreeView.SelectedNode = null; + } - this.OnClearSearch(); - } + searchBox.ResetButton.Visible = true; + } - protected abstract bool FilterTree(TreeNode context, string filter, bool parentVisible, List matches); + private void ClearSearch() + { + foreach (var rootNode in contentPanel.Children.OfType()) + { + ResetTree(rootNode); + } - private void ResetTree(TreeNode context) - { - context.Visible = true; - context.Expanded = false; + searchBox.Text = ""; + searchBox.ResetButton.Visible = false; + TreeView.SelectedNode = null; - foreach (var child in context.Nodes) - { - ResetTree(child); - } - } + this.OnClearSearch(); + } - protected virtual void OnClearSearch() - { - } + private bool FilterTree(TreeNode context, string filter, bool parentVisible, List matches) + { + var hasFilterText = NodeMatchesFilter(context, filter); - public bool TreeLoaded { get; protected set; } - } -} + context.Visible = hasFilterText || parentVisible; + + if (context.Visible + && context.NodeParent != null) + { + context.NodeParent.Visible = true; + context.NodeParent.Expanded = true; + context.Expanded = true; + } + + if (context.NodeParent != null + && hasFilterText) + { + matches.Add(context); + } + + bool childMatched = false; + + foreach (var child in context.Nodes) + { + childMatched |= FilterTree(child, filter, hasFilterText || parentVisible, matches); + } + + bool hasMatch = childMatched || hasFilterText; + + if (hasMatch) + { + context.Visible = context.Expanded = true; + } + + return hasMatch; + } + + private void ResetTree(TreeNode context) + { + context.Visible = true; + context.Expanded = false; + + foreach (var child in context.Nodes) + { + ResetTree(child); + } + } + } +} \ No newline at end of file diff --git a/MatterControlLib/SetupWizard/HelpTreePanel.cs b/MatterControlLib/SetupWizard/HelpTreePanel.cs index 91db50c6c..c3b72a051 100644 --- a/MatterControlLib/SetupWizard/HelpTreePanel.cs +++ b/MatterControlLib/SetupWizard/HelpTreePanel.cs @@ -82,45 +82,12 @@ namespace MatterHackers.MatterControl base.PerformSearch(filter); } - protected override bool FilterTree(TreeNode context, string filter, bool parentVisible, List matches) - { - // Filter against make/model for printers or make for top level nodes - string path = (context as HelpArticleTreeNode)?.HelpArticle.Path; + protected override bool NodeMatchesFilter(TreeNode context, string filter) + { + string path = (context as HelpArticleTreeNode)?.HelpArticle.Path; - bool isSearchMatch = searchHits.Contains(path); - - context.Visible = isSearchMatch || parentVisible; - - if (context.Visible - && context.NodeParent != null) - { - context.NodeParent.Visible = true; - context.NodeParent.Expanded = true; - context.Expanded = true; - } - - if (context.NodeParent != null - && isSearchMatch) - { - matches.Add(context); - } - - bool childMatched = false; - - foreach (var child in context.Nodes) - { - childMatched |= FilterTree(child, filter, isSearchMatch || parentVisible, matches); - } - - bool hasMatch = childMatched || isSearchMatch; - - if (hasMatch) - { - context.Visible = context.Expanded = true; - } - - return hasMatch; - } + return searchHits.Contains(path); + } protected override void OnClearSearch() { @@ -268,7 +235,7 @@ namespace MatterHackers.MatterControl Padding = new BorderDouble(left: theme.DefaultContainerPadding / 2) }; - treeView.AfterSelect += (s, e) => + TreeView.AfterSelect += (s, e) => { // Hide all sibling content controls foreach (var child in horizontalSplitter.Panel2.Children) @@ -276,7 +243,7 @@ namespace MatterHackers.MatterControl child.Visible = false; } - if (treeView.SelectedNode?.Tag is HelpArticle article) + if (TreeView.SelectedNode?.Tag is HelpArticle article) { markdownWidget.MatchingText = this.MatchingText; @@ -296,34 +263,34 @@ namespace MatterHackers.MatterControl // Show Markdown help page markdownWidget.Visible = true; } - else if (treeView.SelectedNode?.Tag is GuiWidget widget) + else if (TreeView.SelectedNode?.Tag is GuiWidget widget) { // Show non-markdown page widget.Visible = true; } }; - treeView.Load += (s, e) => + TreeView.Load += (s, e) => { rootNode.Expanded = true; - if (treeView.SelectedNode == null) + if (TreeView.SelectedNode == null) { if (string.IsNullOrEmpty(guideKey)) { - treeView.SelectedNode = rootNode.Nodes.FirstOrDefault(); + TreeView.SelectedNode = rootNode.Nodes.FirstOrDefault(); } else { if (initialSelection != null) { - treeView.SelectedNode = initialSelection; + TreeView.SelectedNode = initialSelection; } // TODO: Implement or revise .Expanded - if (treeView.SelectedNode != null) + if (TreeView.SelectedNode != null) { - foreach (var ancestor in treeView.SelectedNode.Parents()) + foreach (var ancestor in TreeView.SelectedNode.Parents()) { ancestor.Expanded = true; } @@ -331,9 +298,9 @@ namespace MatterHackers.MatterControl } } - if (treeView.SelectedNode == null) + if (TreeView.SelectedNode == null) { - treeView.SelectedNode = rootNode; + TreeView.SelectedNode = rootNode; } }; @@ -348,7 +315,7 @@ namespace MatterHackers.MatterControl rootNode = ProcessTree(ApplicationController.Instance.HelpArticles); rootNode.Text = "Help"; - rootNode.TreeView = treeView; + rootNode.TreeView = TreeView; contentPanel.AddChild(rootNode); @@ -402,12 +369,12 @@ namespace MatterHackers.MatterControl public string ActiveNodePath { - get => treeView.SelectedNode?.Tag as string; + get => TreeView.SelectedNode?.Tag as string; set { if (nodesByPath.TryGetValue(value, out HelpArticleTreeNode treeNode)) { - treeView.SelectedNode = treeNode; + TreeView.SelectedNode = treeNode; } } } diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/Master.txt index cb5129ea4..ad9ba2246 100644 --- a/StaticData/Translations/Master.txt +++ b/StaticData/Translations/Master.txt @@ -691,6 +691,9 @@ Translated:Brim Extruder English:Build Height Translated:Build Height +English:Build Plates +Translated:Build Plates + English:BuildTak Translated:BuildTak diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 0c10c4ad5..0152308cc 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 0c10c4ad5d84538d71022c0342fe9cfba263da20 +Subproject commit 0152308cca0c9768f6cd4c2efddc0a1376026828