diff --git a/CustomWidgets/InlineTitleEdit.cs b/CustomWidgets/InlineTitleEdit.cs new file mode 100644 index 000000000..83e8052c7 --- /dev/null +++ b/CustomWidgets/InlineTitleEdit.cs @@ -0,0 +1,129 @@ +/* +Copyright (c) 2017, Lars Brubaker, John Lewin +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using System; +using MatterHackers.Agg; +using MatterHackers.Agg.UI; +using MatterHackers.Localizations; +using MatterHackers.MatterControl.PartPreviewWindow; +using MatterHackers.MatterControl.PrintLibrary; + +namespace MatterHackers.MatterControl.CustomWidgets +{ + public class InlineTitleEdit : Toolbar + { + public event EventHandler TitleChanged; + + private TextWidget titleText; + private TextButton editButton; + private TextButton saveButton; + private SearchInputBox searchPanel; + + public InlineTitleEdit(string title, ThemeConfig theme) + : base(null) + { + this.Padding = theme.ToolbarPadding; + this.HAnchor = HAnchor.Stretch; + this.VAnchor = VAnchor.Fit; + + titleText = new TextWidget(title, textColor: ActiveTheme.Instance.PrimaryTextColor, pointSize: theme.DefaultFontSize) + { + VAnchor = VAnchor.Center, + AutoExpandBoundsToText = true, + EllipsisIfClipped = true, + Margin = new BorderDouble(left: 5) + }; + this.AddChild(titleText); + + this.ActionArea.VAnchor = VAnchor.Stretch; + this.ActionArea.MinimumSize = new VectorMath.Vector2(0, titleText.Height); + + saveButton = new TextButton("Save".Localize(), theme); + + searchPanel = new SearchInputBox() + { + Visible = false, + Margin = new BorderDouble(8, 0, saveButton.Width + 10, 0) + }; + searchPanel.searchInput.ActualTextEditWidget.EnterPressed += (s, e) => + { + this.Text = searchPanel.Text; + this.SetVisibility(showEditPanel: false); + }; + searchPanel.resetButton.Click += (s, e) => + { + this.SetVisibility(showEditPanel: false); + }; + this.AddChild(searchPanel); + + var rightPanel = new FlowLayoutWidget(); + editButton = new TextButton("Edit".Localize(), theme); + editButton.BackgroundColor = theme.MinimalShade; + editButton.Click += (s, e) => + { + searchPanel.Text = this.Text; + this.SetVisibility(showEditPanel: true); + }; + rightPanel.AddChild(editButton); + + saveButton.Visible = false; + saveButton.BackgroundColor = theme.MinimalShade; + saveButton.Click += (s, e) => + { + this.Text = searchPanel.Text; + this.SetVisibility(showEditPanel: false); + }; + rightPanel.AddChild(saveButton); + + this.SetRightAnchorItem(rightPanel); + } + + public override string Text + { + get => titleText.Text; + set + { + if (titleText.Text != value) + { + titleText.Text = value; + TitleChanged?.Invoke(this, null); + } + } + } + + public void SetVisibility(bool showEditPanel) + { + editButton.Visible = !showEditPanel; + titleText.Visible = !showEditPanel; + + saveButton.Visible = showEditPanel; + searchPanel.Visible = showEditPanel; + } + } +} \ No newline at end of file diff --git a/Library/Widgets/PrintLibraryWidget.cs b/Library/Widgets/PrintLibraryWidget.cs index 51c89f943..314af7949 100644 --- a/Library/Widgets/PrintLibraryWidget.cs +++ b/Library/Widgets/PrintLibraryWidget.cs @@ -872,5 +872,11 @@ namespace MatterHackers.MatterControl.PrintLibrary this.AddChild(resetButton); } + + public override string Text + { + get => searchInput.ActualTextEditWidget.Text; + set => searchInput.ActualTextEditWidget.Text = value; + } } } diff --git a/MatterControl.csproj b/MatterControl.csproj index 1afbd1f14..c06d12924 100644 --- a/MatterControl.csproj +++ b/MatterControl.csproj @@ -87,6 +87,7 @@ + diff --git a/PartPreviewWindow/SelectedObjectPanel.cs b/PartPreviewWindow/SelectedObjectPanel.cs index 2155fa451..4f0d729cd 100644 --- a/PartPreviewWindow/SelectedObjectPanel.cs +++ b/PartPreviewWindow/SelectedObjectPanel.cs @@ -45,7 +45,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private IObject3D item = new Object3D(); private FlowLayoutWidget scrollableContent; - private TextWidget itemName; private ThemeConfig theme; private View3DWidget view3DWidget; private InteractiveScene scene; @@ -54,6 +53,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private SectionWidget editorSection; private TextButton editButton; private GuiWidget editorPanel; + private InlineTitleEdit inlineTitleEdit; public SelectedObjectPanel(View3DWidget view3DWidget, InteractiveScene scene, ThemeConfig theme, PrinterConfig printer) : base(FlowDirection.TopToBottom) @@ -68,20 +68,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.scene = scene; this.printer = printer; - var firstPanel = new FlowLayoutWidget(FlowDirection.TopToBottom) + this.AddChild(inlineTitleEdit = new InlineTitleEdit("", theme)); + inlineTitleEdit.TitleChanged += (s, e) => { - Padding = 10, - HAnchor = HAnchor.Stretch, - VAnchor = VAnchor.Fit + if (item != null) + { + item.Name = inlineTitleEdit.Text; + } }; - this.AddChild(firstPanel); - - firstPanel.AddChild(itemName = new TextWidget("", textColor: ActiveTheme.Instance.PrimaryTextColor, pointSize: theme.DefaultFontSize) - { - AutoExpandBoundsToText = true, - EllipsisIfClipped = true, - Margin = new BorderDouble(bottom: 10) - }); scrollableContent = new FlowLayoutWidget(FlowDirection.TopToBottom) { @@ -238,7 +232,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow editButton.Enabled = (selectedItem.Children.Count > 0); - this.itemName.Text = selectedItem.Name ?? selectedItem.GetType().Name; + inlineTitleEdit.Text = selectedItem.Name ?? selectedItem.GetType().Name; this.item = selectedItem;