From 3ef1abd0658a7ba3fd21622073f5892c1eac2836 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Mon, 3 Dec 2018 13:23:24 -0800 Subject: [PATCH] Removed 'Setup...' button Improved Print popup Made print popup always available issue: MatterHackers/MCCentral#4661 Unify 'Setup...' into 'Print' --- .../PartPreviewWindow/PopupButton.cs | 83 +++++---- .../View3D/Actions/SubtractObject3D.cs | 12 +- .../View3D/PrinterBar/PauseResumeButton.cs | 164 ------------------ .../View3D/PrinterBar/PrintPopupMenu.cs | 97 +++++++++-- .../View3D/PrinterBar/PrinterActionsBar.cs | 29 +++- .../PartPreviewWindow/ViewControls3D.cs | 7 +- Submodules/agg-sharp | 2 +- 7 files changed, 172 insertions(+), 222 deletions(-) delete mode 100644 MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs diff --git a/MatterControlLib/PartPreviewWindow/PopupButton.cs b/MatterControlLib/PartPreviewWindow/PopupButton.cs index 3d0486e09..f3e235f43 100644 --- a/MatterControlLib/PartPreviewWindow/PopupButton.cs +++ b/MatterControlLib/PartPreviewWindow/PopupButton.cs @@ -27,27 +27,20 @@ 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 System; namespace MatterHackers.MatterControl.PartPreviewWindow { public class PopupButton : GuiWidget, IIgnoredPopupChild, IMenuCreator { - public Color HoverColor { get; set; } = new Color(0, 0, 0, 40); - - public Color OpenColor { get; set; } = new Color(0, 0, 0, 40); - - public event EventHandler PopupWindowClosed; - public event EventHandler BeforePopup; - public event EventHandler ConfigurePopup; - protected GuiWidget buttonView; - - private bool menuVisibileAtMouseDown = false; protected bool menuVisible = false; + private bool menuVisibileAtMouseDown = false; private PopupWidget popupWidget; + private bool overridePopupHAnchor = false; + private bool overridePopupVAnchor = false; public PopupButton() { @@ -63,14 +56,12 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.AddChild(buttonView); } - public bool AlignToRightEdge { get; set; } - public virtual Func DynamicPopupContent { get; set; } - public IPopupLayoutEngine PopupLayoutEngine { get; set; } - public Direction PopDirection { get; set; } = Direction.Down; - public bool MakeScrollable { get; set; } = true; - public virtual GuiWidget PopupContent { get; set; } + public event EventHandler BeforePopup; - public Color PopupBorderColor { get; set; } = Color.Transparent; + public event EventHandler PopupWindowClosed; + + public bool AlignToRightEdge { get; set; } + public bool AlwaysKeepOpen { get; set; } public override Color BackgroundColor { @@ -78,12 +69,38 @@ namespace MatterHackers.MatterControl.PartPreviewWindow set => base.BackgroundColor = value; } - public override void OnMouseDown(MouseEventArgs mouseEvent) + public virtual Func DynamicPopupContent { get; set; } + public Color HoverColor { get; set; } = new Color(0, 0, 0, 40); + + public bool KeepMenuOpen => menuVisible || this.AlwaysKeepOpen; + public bool MakeScrollable { get; set; } = true; + public Color OpenColor { get; set; } = new Color(0, 0, 0, 40); + public Direction PopDirection { get; set; } = Direction.Down; + public Color PopupBorderColor { get; set; } = Color.Transparent; + public virtual GuiWidget PopupContent { get; set; } + private HAnchor _popupHAnchor; + public HAnchor PopupHAnchor { - // Store the menu state at the time of mousedown - menuVisibileAtMouseDown = menuVisible; - base.OnMouseDown(mouseEvent); + get => _popupHAnchor; + set + { + overridePopupHAnchor = true; + _popupHAnchor = value; + } } + public IPopupLayoutEngine PopupLayoutEngine { get; set; } + private VAnchor _popupVAnchor; + public VAnchor PopupVAnchor + { + get => _popupVAnchor; + set + { + overridePopupVAnchor = true; + _popupVAnchor = value; + } + } + + public void CloseMenu() => popupWidget?.CloseMenu(); public override void OnClick(MouseEventArgs mouseEvent) { @@ -101,6 +118,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow base.OnClosed(e); } + public override void OnMouseDown(MouseEventArgs mouseEvent) + { + // Store the menu state at the time of mousedown + menuVisibileAtMouseDown = menuVisible; + base.OnMouseDown(mouseEvent); + } + public void ShowPopup() { if (PopupLayoutEngine == null) @@ -139,20 +163,21 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.PopupWindowClosed?.Invoke(this, null); }; - ConfigurePopup?.Invoke(this, popupWidget); + if (overridePopupHAnchor) + { + popupWidget.HAnchor = PopupHAnchor; + } + if (overridePopupVAnchor) + { + popupWidget.VAnchor = PopupVAnchor; + } popupWidget.Focus(); } - public void CloseMenu() => popupWidget?.CloseMenu(); - protected virtual void OnBeforePopup() { this.BeforePopup?.Invoke(this, null); } - - public bool AlwaysKeepOpen { get; set; } - - public bool KeepMenuOpen => menuVisible || this.AlwaysKeepOpen; } } \ No newline at end of file diff --git a/MatterControlLib/PartPreviewWindow/View3D/Actions/SubtractObject3D.cs b/MatterControlLib/PartPreviewWindow/View3D/Actions/SubtractObject3D.cs index 817fe953a..6922cd906 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/Actions/SubtractObject3D.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/Actions/SubtractObject3D.cs @@ -138,7 +138,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D cancellationToken.ThrowIfCancellationRequested(); progressStatus.Status = status; - progressStatus.Progress0To1 = percentCompleted + amountPerOperation * progress0To1; + progressStatus.Progress0To1 = percentCompleted + (amountPerOperation * progress0To1); reporter.Report(progressStatus); }, cancellationToken); @@ -149,7 +149,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D cancellationToken.ThrowIfCancellationRequested(); progressStatus.Status = status; - progressStatus.Progress0To1 = percentCompleted + amountPerOperation * progress0To1; + progressStatus.Progress0To1 = percentCompleted + (amountPerOperation * progress0To1); reporter?.Report(progressStatus); }, cancellationToken); @@ -160,7 +160,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D cancellationToken.ThrowIfCancellationRequested(); progressStatus.Status = status; - progressStatus.Progress0To1 = percentCompleted + amountPerOperation * progress0To1; + progressStatus.Progress0To1 = percentCompleted + (amountPerOperation * progress0To1); reporter.Report(progressStatus); }, cancellationToken); } @@ -180,9 +180,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D { positionIndex.Add(key, i); var position = Vector3.Transform(vertex.Position, matrix); - va[i * 3 + 0] = position.X; - va[i * 3 + 1] = position.Y; - va[i * 3 + 2] = position.Z; + va[(i * 3) + 0] = position.X; + va[(i * 3) + 1] = position.Y; + va[(i * 3) + 2] = position.Z; i++; } } diff --git a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs b/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs deleted file mode 100644 index c47cf48fe..000000000 --- a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs +++ /dev/null @@ -1,164 +0,0 @@ -/* -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 System.Threading; -using MatterHackers.Agg; -using MatterHackers.Agg.UI; -using MatterHackers.Localizations; -using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling; -using MatterHackers.MatterControl.CustomWidgets; -using MatterHackers.MatterControl.PrinterCommunication; -using MatterHackers.MatterControl.SlicerConfiguration; - -namespace MatterHackers.MatterControl.PartPreviewWindow -{ - public class PrintButton : FlowLayoutWidget - { - private GuiWidget finishSetupButton; - private GuiWidget startPrintButton; - - private PrinterConfig printer; - private ThemeConfig theme; - - public PrintButton(PrinterConfig printer, ThemeConfig theme) - { - this.printer = printer; - this.theme = theme; - - // add the finish setup button - finishSetupButton = new TextButton("Setup...".Localize(), theme) - { - Name = "Finish Setup Button", - ToolTipText = "Run setup configuration for printer.".Localize(), - Margin = theme.ButtonSpacing, - }; - finishSetupButton.Click += (s, e) => - { - UiThread.RunOnIdle(async () => - { - await ApplicationController.Instance.PrintPart( - printer.Bed.EditContext, - printer, - null, - CancellationToken.None); - }); - }; - this.AddChild(finishSetupButton); - - // add the start print button - this.AddChild(startPrintButton = new PrintPopupMenu(printer, theme) - { - Margin = theme.ButtonSpacing - }); - - // Register listeners - printer.Connection.CommunicationStateChanged += Connection_CommunicationStateChanged; - printer.Settings.SettingChanged += Printer_SettingChanged; - - SetButtonStates(); - } - - public override void OnClosed(EventArgs e) - { - // Unregister listeners - printer.Connection.CommunicationStateChanged -= Connection_CommunicationStateChanged; - printer.Settings.SettingChanged -= Printer_SettingChanged; - - base.OnClosed(e); - } - - protected void SetButtonStates() - { - // If we don't have leveling data and we need it - bool showSetupButton = ApplicationController.PrinterNeedsToRunSetup(printer); - - switch (printer.Connection.CommunicationState) - { - case CommunicationStates.FinishedPrint: - case CommunicationStates.Connected: - if(showSetupButton) - { - startPrintButton.Visible = false; - finishSetupButton.Visible = true; - finishSetupButton.Enabled = true; - theme.ApplyPrimaryActionStyle(finishSetupButton); - } - else - { - startPrintButton.Visible = true; - startPrintButton.Enabled = true; - finishSetupButton.Visible = false; - theme.ApplyPrimaryActionStyle(startPrintButton); - } - break; - - case CommunicationStates.PrintingFromSd: - case CommunicationStates.Printing: - case CommunicationStates.Paused: - default: - if (showSetupButton) - { - startPrintButton.Visible = false; - finishSetupButton.Visible = true; - finishSetupButton.Enabled = false; - theme.RemovePrimaryActionStyle(finishSetupButton); - } - else - { - startPrintButton.Visible = true; - startPrintButton.Enabled = false; - finishSetupButton.Visible = false; - theme.RemovePrimaryActionStyle(startPrintButton); - } - break; - } - } - - private void Connection_CommunicationStateChanged(object s, EventArgs e) - { - UiThread.RunOnIdle(SetButtonStates); - } - - private void Printer_SettingChanged(object s, EventArgs e) - { - if (e is StringEventArgs stringEvent - && (stringEvent.Data == SettingsKey.z_probe_z_offset - || stringEvent.Data == SettingsKey.print_leveling_data - || stringEvent.Data == SettingsKey.print_leveling_solution - || stringEvent.Data == SettingsKey.bed_temperature - || stringEvent.Data == SettingsKey.print_leveling_enabled - || stringEvent.Data == SettingsKey.print_leveling_required_to_print - || stringEvent.Data == SettingsKey.filament_has_been_loaded)) - { - SetButtonStates(); - } - } - } -} \ No newline at end of file diff --git a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrintPopupMenu.cs b/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrintPopupMenu.cs index c00e671f5..cf1822ab0 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrintPopupMenu.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrintPopupMenu.cs @@ -62,6 +62,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow settingsContext = new SettingsContext(printer, null, NamedSettingsLayers.All); + this.PopupHAnchor = HAnchor.Fit; + this.PopupVAnchor = VAnchor.Fit; + this.MakeScrollable = false; + this.DynamicPopupContent = () => { var menuTheme = ApplicationController.Instance.MenuTheme; @@ -106,7 +110,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Margin = new BorderDouble(2, 0) }; - var sectionWidget = new SectionWidget("Advanced", subPanel, menuTheme, expanded: true) + bool anySettingOverridden = false; + anySettingOverridden |= printer.Settings.GetValue(SettingsKey.spiral_vase); + anySettingOverridden |= !string.IsNullOrWhiteSpace(printer.Settings.GetValue(SettingsKey.layer_to_pause)); + + var sectionWidget = new SectionWidget("Advanced", subPanel, menuTheme, expanded: anySettingOverridden) { Name = "Advanced Section", HAnchor = HAnchor.Stretch, @@ -115,15 +123,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; column.AddChild(sectionWidget); - bool anySettingOverridden = false; - anySettingOverridden |= printer.Settings.GetValue(SettingsKey.spiral_vase); - anySettingOverridden |= !string.IsNullOrWhiteSpace(printer.Settings.GetValue(SettingsKey.layer_to_pause)); - - sectionWidget.Load += (s, e) => - { - sectionWidget.Checkbox.Checked = anySettingOverridden; - }; - foreach (var key in new[] { SettingsKey.spiral_vase, SettingsKey.layer_to_pause }) { subPanel.AddChild( @@ -142,13 +141,45 @@ namespace MatterHackers.MatterControl.PartPreviewWindow sectionWidget.ContentPanel.Children().First().Border = new BorderDouble(0, 1); sectionWidget.ContentPanel.Children().Last().Border = 0; - var button = new TextButton("Start Print".Localize(), menuTheme) + var printerReadyToTakeCommands = printer.Connection.CommunicationState == PrinterCommunication.CommunicationStates.FinishedPrint + || printer.Connection.CommunicationState == PrinterCommunication.CommunicationStates.Connected; + + var printerIsConnected = printer.Connection.CommunicationState != PrinterCommunication.CommunicationStates.Disconnected; + var printerNeedsToRunSetup = ApplicationController.PrinterNeedsToRunSetup(printer); + + // add the start print button + var setupRow = new FlowLayoutWidget() + { + HAnchor = HAnchor.Stretch + }; + + var printingMessage = ""; + + if (!printerIsConnected) + { + printingMessage = "Need to connect before printing".Localize(); + } + else if(printerNeedsToRunSetup) + { + printingMessage = "Setup needs to be run before printing".Localize(); + } + + if (!string.IsNullOrEmpty(printingMessage)) + { + setupRow.AddChild(new TextWidget(printingMessage, textColor: menuTheme.TextColor) + { + VAnchor = VAnchor.Center, + AutoExpandBoundsToText = true, + }); + } + + var startPrintButton = new TextButton("Start Print".Localize(), menuTheme) { Name = "Start Print Button", - HAnchor = HAnchor.Right, - VAnchor = VAnchor.Absolute, + Enabled = printerIsConnected && !printerNeedsToRunSetup }; - button.Click += (s, e) => + + startPrintButton.Click += (s, e) => { // Exit if the bed is not GCode and the bed has no printable items if ((printer.Bed.EditContext.SourceItem as ILibraryAsset)?.ContentType != "gcode" @@ -169,9 +200,43 @@ namespace MatterHackers.MatterControl.PartPreviewWindow CancellationToken.None); }); }; - column.AddChild(button); + setupRow.AddChild(new HorizontalSpacer()); + setupRow.AddChild(startPrintButton); - theme.ApplyPrimaryActionStyle(button); + column.AddChild(setupRow); + + if (!printerNeedsToRunSetup) + { + theme.ApplyPrimaryActionStyle(startPrintButton); + } + + // put in setup if needed + if (printerNeedsToRunSetup && printerIsConnected) + { + // add the finish setup button + var finishSetupButton = new TextButton("Setup...".Localize(), theme) + { + Name = "Finish Setup Button", + ToolTipText = "Run setup configuration for printer.".Localize(), + Margin = theme.ButtonSpacing, + Enabled = printerReadyToTakeCommands, + HAnchor = HAnchor.Right, + VAnchor = VAnchor.Absolute, + }; + theme.ApplyPrimaryActionStyle(finishSetupButton); + finishSetupButton.Click += (s, e) => + { + UiThread.RunOnIdle(async () => + { + await ApplicationController.Instance.PrintPart( + printer.Bed.EditContext, + printer, + null, + CancellationToken.None); + }); + }; + column.AddChild(finishSetupButton); + } return column; }; diff --git a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrinterActionsBar.cs b/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrinterActionsBar.cs index f5e6beaab..c8e9d2e68 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrinterActionsBar.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrinterActionsBar.cs @@ -92,7 +92,34 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } this.AddChild(new PrinterConnectButton(printer, theme)); - this.AddChild(new PrintButton(printer, theme)); + + // add the start print button + GuiWidget startPrintButton; + this.AddChild(startPrintButton = new PrintPopupMenu(printer, theme) + { + Margin = theme.ButtonSpacing + }); + + void SetPrintButtonStyle(object s, EventArgs e) + { + switch (printer.Connection.CommunicationState) + { + case CommunicationStates.FinishedPrint: + case CommunicationStates.Connected: + theme.ApplyPrimaryActionStyle(startPrintButton); + break; + + default: + theme.RemovePrimaryActionStyle(startPrintButton); + break; + } + } + // make sure the buttons state is set correctly + printer.Connection.CommunicationStateChanged += SetPrintButtonStyle; + startPrintButton.Closed += (s, e) => printer.Connection.CommunicationStateChanged -= SetPrintButtonStyle; + + // and set the style right now + SetPrintButtonStyle(this, null); this.AddChild(new SliceButton(printer, printerTabPage, theme) { diff --git a/MatterControlLib/PartPreviewWindow/ViewControls3D.cs b/MatterControlLib/PartPreviewWindow/ViewControls3D.cs index ee7151c21..770797bcc 100644 --- a/MatterControlLib/PartPreviewWindow/ViewControls3D.cs +++ b/MatterControlLib/PartPreviewWindow/ViewControls3D.cs @@ -652,11 +652,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Margin = theme.ButtonSpacing, }; - libraryPopup.ConfigurePopup += (s, e) => - { - e.HAnchor = HAnchor.Fit; - e.VAnchor = VAnchor.Fit; - }; + libraryPopup.PopupHAnchor = HAnchor.Fit; + libraryPopup.PopupVAnchor = VAnchor.Fit; return libraryPopup; } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 471501d30..b08557083 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 471501d30de9b18ce59951aba08819e5bef88e66 +Subproject commit b0855708309d04c1c2c0373cba8382b4c82f84b4