From 4ec57b97ca8017a241aa37d547c3ad7bd3c566df Mon Sep 17 00:00:00 2001 From: Kevin Pope Date: Sun, 23 Feb 2014 21:50:09 -0800 Subject: [PATCH] UI - Manual controls more compact. More clarify for automatic print leveling UI --- ActionBar/PrintStatusRow.cs | 4 +- PrinterControls/ManualPrinterControls.cs | 147 +++++++++++++----- .../{ruler.png => leveling-16x16.png} | Bin .../PrintStatusControls/leveling-24x24.png | Bin 0 -> 3262 bytes .../PrintStatusControls/terminal-24x24.png | Bin 0 -> 3152 bytes 5 files changed, 110 insertions(+), 41 deletions(-) rename StaticData/Icons/PrintStatusControls/{ruler.png => leveling-16x16.png} (100%) create mode 100644 StaticData/Icons/PrintStatusControls/leveling-24x24.png create mode 100644 StaticData/Icons/PrintStatusControls/terminal-24x24.png diff --git a/ActionBar/PrintStatusRow.cs b/ActionBar/PrintStatusRow.cs index 07c6251d3..43d7a4460 100644 --- a/ActionBar/PrintStatusRow.cs +++ b/ActionBar/PrintStatusRow.cs @@ -116,8 +116,8 @@ namespace MatterHackers.MatterControl.ActionBar private Button GetAutoLevelIndicator() { ImageButtonFactory imageButtonFactory = new ImageButtonFactory(); - string notifyIconPath = Path.Combine("Icons", "PrintStatusControls", "ruler.png"); - string notifyHoverIconPath = Path.Combine("Icons", "PrintStatusControls", "ruler.png"); + string notifyIconPath = Path.Combine("Icons", "PrintStatusControls", "leveling-16x16.png"); + string notifyHoverIconPath = Path.Combine("Icons", "PrintStatusControls", "leveling-16x16.png"); Button notifyButton = imageButtonFactory.Generate(notifyIconPath, notifyHoverIconPath); notifyButton.Cursor = Cursors.Hand; notifyButton.Margin = new Agg.BorderDouble(top: 3); diff --git a/PrinterControls/ManualPrinterControls.cs b/PrinterControls/ManualPrinterControls.cs index fc9cf33d4..243dbc127 100644 --- a/PrinterControls/ManualPrinterControls.cs +++ b/PrinterControls/ManualPrinterControls.cs @@ -118,6 +118,8 @@ namespace MatterHackers.MatterControl Button homeXButton; Button homeYButton; Button homeZButton; + Button enablePrintLevelingButton; + Button disablePrintLevelingButton; DisableableWidget extruderTemperatureControlWidget; DisableableWidget bedTemperatureControlWidget; @@ -201,14 +203,28 @@ namespace MatterHackers.MatterControl terminalCommunicationsContainer = new DisableableWidget(); terminalCommunicationsContainer.AddChild(CreateTerminalControlsContainer()); - controlsTopToBottomLayout.AddChild(terminalCommunicationsContainer); + AddTemperatureControls(controlsTopToBottomLayout); - AddMovementControls(controlsTopToBottomLayout); - printLevelContainer = new DisableableWidget(); - printLevelContainer.AddChild(CreatePrintLevelingControlsContainer()); - controlsTopToBottomLayout.AddChild(printLevelContainer); + FlowLayoutWidget centerControlsContainer = new FlowLayoutWidget (); + centerControlsContainer.HAnchor = HAnchor.ParentLeftRight; + + FlowLayoutWidget rightColumnContainer = new FlowLayoutWidget (FlowDirection.TopToBottom); + rightColumnContainer.AddChild (terminalCommunicationsContainer); + rightColumnContainer.Width = 230; + rightColumnContainer.VAnchor |= VAnchor.ParentTop; + + AddMovementControls(centerControlsContainer); + + AddFanControls(rightColumnContainer); + AddEePromControls(rightColumnContainer); + + centerControlsContainer.AddChild(rightColumnContainer); + + controlsTopToBottomLayout.AddChild (centerControlsContainer); + + sdCardManagerContainer = new DisableableWidget(); sdCardManagerContainer.AddChild(CreateSdCardManagerContainer()); @@ -221,17 +237,18 @@ namespace MatterHackers.MatterControl macroControls.AddChild(new MacroControls()); controlsTopToBottomLayout.AddChild(macroControls); - PutInFanControls(controlsTopToBottomLayout); - PutInEePromControls(controlsTopToBottomLayout); - AddAdjustmentControls(controlsTopToBottomLayout); + printLevelContainer = new DisableableWidget(); + printLevelContainer.AddChild(CreatePrintLevelingControlsContainer()); + controlsTopToBottomLayout.AddChild(printLevelContainer); + this.AddChild(controlsTopToBottomLayout); AddHandlers(); SetVisibleControls(); } - private void PutInFanControls(FlowLayoutWidget controlsTopToBottomLayout) + private void AddFanControls(FlowLayoutWidget controlsTopToBottomLayout) { GroupBox fanControlsGroupBox = new GroupBox(new LocalizedString("Fan Controls").Translated); @@ -263,28 +280,33 @@ namespace MatterHackers.MatterControl } } - private void PutInEePromControls(FlowLayoutWidget controlsTopToBottomLayout) + private void AddEePromControls(FlowLayoutWidget controlsTopToBottomLayout) { GroupBox eePromControlsGroupBox = new GroupBox(new LocalizedString("EEProm Settings").Translated); - eePromControlsGroupBox.Margin = new BorderDouble(0); + eePromControlsGroupBox.Margin = new BorderDouble(0); eePromControlsGroupBox.TextColor = ActiveTheme.Instance.PrimaryTextColor; eePromControlsGroupBox.BorderColor = ActiveTheme.Instance.PrimaryTextColor; eePromControlsGroupBox.HAnchor |= Agg.UI.HAnchor.ParentLeftRight; eePromControlsGroupBox.VAnchor = Agg.UI.VAnchor.FitToChildren; + eePromControlsGroupBox.Height = 68; { - FlowLayoutWidget eePromControlsLayout = new FlowLayoutWidget(FlowDirection.TopToBottom); - eePromControlsLayout.HAnchor = Agg.UI.HAnchor.ParentLeftRight; - eePromControlsLayout.VAnchor = Agg.UI.VAnchor.FitToChildren; - eePromControlsLayout.Padding = new BorderDouble(3, 5, 3, 0); + FlowLayoutWidget eePromControlsLayout = new FlowLayoutWidget(); + eePromControlsLayout.HAnchor |= HAnchor.ParentLeftRight; + eePromControlsLayout.VAnchor |= Agg.UI.VAnchor.ParentCenter; + eePromControlsLayout.Margin = new BorderDouble(3, 0, 3, 6); + eePromControlsLayout.Padding = new BorderDouble(0); { - Button openEePromWindow = textImageButtonFactory.Generate(new LocalizedString("CONFIGURE").Translated); - openEePromWindow.Margin = new BorderDouble(left: 6); - //openEePromWindow.VAnchor = VAnchor.ParentCenter; + Agg.Image.ImageBuffer eePromImage = new Agg.Image.ImageBuffer(); + ImageBMPIO.LoadImageData(Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath,"Icons", "PrintStatusControls", "leveling-24x24.png"), eePromImage); + ImageWidget eePromIcon = new ImageWidget(eePromImage); + eePromIcon.Margin = new BorderDouble (right: 6); + + Button openEePromWindow = textImageButtonFactory.Generate(new LocalizedString("CONFIGURE").Translated); openEePromWindow.Click += (sender, e) => { - switch(PrinterCommunication.Instance.FirmwareType) + switch(PrinterCommunication.Instance.FirmwareType) { case PrinterCommunication.FirmwareTypes.Repetier: new MatterHackers.MatterControl.EeProm.EePromRepetierWidget(); @@ -297,14 +319,14 @@ namespace MatterHackers.MatterControl default: UiThread.RunOnIdle((state) => { - string message = new LocalizedString("There is no eeprom mapping for your printer's firmware.").Translated; + string message = new LocalizedString("Oops! There is no eeprom mapping for your printer's firmware.").Translated; StyledMessageBox.ShowMessageBox(message, "Warning no eeprom mapping", StyledMessageBox.MessageType.OK); } ); break; } }; - + //eePromControlsLayout.AddChild(eePromIcon); eePromControlsLayout.AddChild(openEePromWindow); } @@ -347,13 +369,9 @@ namespace MatterHackers.MatterControl manualControlsLayout.Padding = new BorderDouble(3, 5, 3, 0); { manualControlsLayout.AddChild(GetHomeButtonBar()); - manualControlsLayout.AddChild(CreateSeparatorLine()); - manualControlsLayout.AddChild(new JogControls(new XYZColors())); - manualControlsLayout.AddChild(CreateSeparatorLine()); - //manualControlsLayout.AddChild(GetManualMoveBar()); } @@ -369,6 +387,7 @@ namespace MatterHackers.MatterControl { FlowLayoutWidget temperatureControlContainer = new FlowLayoutWidget(); temperatureControlContainer.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + temperatureControlContainer.Margin = new BorderDouble (top: 10); extruderTemperatureControlWidget = new DisableableWidget(); extruderTemperatureControlWidget.AddChild(new ExtruderTemperatureControlWidget()); @@ -544,6 +563,8 @@ namespace MatterHackers.MatterControl feedRateValue.Value = ((int)(PrinterCommunication.Instance.FeedRateRatio * 100 + .5)) / 100.0; } + TextWidget printLevelingStatusLabel; + private GuiWidget CreatePrintLevelingControlsContainer() { GroupBox printLevelingControlsContainer; @@ -570,10 +591,19 @@ namespace MatterHackers.MatterControl runPrintLevelingButton.Click += new ButtonBase.ButtonEventHandler(runPrintLeveling_Click); Agg.Image.ImageBuffer levelingImage = new Agg.Image.ImageBuffer(); - ImageBMPIO.LoadImageData(Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath,"Icons", "PrintStatusControls", "ruler.png"), levelingImage); + ImageBMPIO.LoadImageData(Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath,"Icons", "PrintStatusControls", "leveling-24x24.png"), levelingImage); ImageWidget levelingIcon = new ImageWidget(levelingImage); + levelingIcon.Margin = new BorderDouble (right: 6); - CheckBox enableLevelingCheckbox = textImageButtonFactory.GenerateCheckBoxButton("Disabled",pressedLabel:"Enabled"); + enablePrintLevelingButton = textImageButtonFactory.Generate(new LocalizedString("ENABLE").Translated); + enablePrintLevelingButton.Margin = new BorderDouble(left:6); + enablePrintLevelingButton.VAnchor = VAnchor.ParentCenter; + enablePrintLevelingButton.Click += new ButtonBase.ButtonEventHandler(enablePrintLeveling_Click); + + disablePrintLevelingButton = textImageButtonFactory.Generate(new LocalizedString("DISABLE").Translated); + disablePrintLevelingButton.Margin = new BorderDouble(left:6); + disablePrintLevelingButton.VAnchor = VAnchor.ParentCenter; + disablePrintLevelingButton.Click += new ButtonBase.ButtonEventHandler(disablePrintLeveling_Click); CheckBox doLevelingCheckBox = new CheckBox(new LocalizedString("Enable Automatic Print Leveling").Translated); doLevelingCheckBox.Margin = new BorderDouble(left: 3); @@ -581,9 +611,20 @@ namespace MatterHackers.MatterControl doLevelingCheckBox.VAnchor = VAnchor.ParentCenter; doLevelingCheckBox.Checked = ActivePrinterProfile.Instance.DoPrintLeveling; + printLevelingStatusLabel = new TextWidget (""); + printLevelingStatusLabel.AutoExpandBoundsToText = true; + printLevelingStatusLabel.TextColor = ActiveTheme.Instance.PrimaryTextColor; + printLevelingStatusLabel.VAnchor = VAnchor.ParentCenter; + + GuiWidget hSpacer = new GuiWidget (); + hSpacer.HAnchor = HAnchor.ParentLeftRight; + buttonBar.AddChild(levelingIcon); - buttonBar.AddChild(doLevelingCheckBox); - buttonBar.AddChild(enableLevelingCheckbox); + //buttonBar.AddChild(doLevelingCheckBox); + buttonBar.AddChild (printLevelingStatusLabel); + buttonBar.AddChild (hSpacer); + buttonBar.AddChild(enablePrintLevelingButton); + buttonBar.AddChild(disablePrintLevelingButton); buttonBar.AddChild(runPrintLevelingButton); doLevelingCheckBox.CheckedStateChanged += (sender, e) => { @@ -591,17 +632,13 @@ namespace MatterHackers.MatterControl }; ActivePrinterProfile.Instance.DoPrintLevelingChanged.RegisterEvent((sender, e) => { - doLevelingCheckBox.Checked = ActivePrinterProfile.Instance.DoPrintLeveling; - if (doLevelingCheckBox.Checked && ActivePrinterProfile.Instance.ActivePrinter.PrintLevelingProbePositions == null) - { - //OpenPrintLevelWizard(); - } + SetPrintLevelButtonVisiblity(); }, ref unregisterEvents); printLevelingControlsContainer.AddChild(buttonBar); } - + SetPrintLevelButtonVisiblity (); return printLevelingControlsContainer; } @@ -627,7 +664,7 @@ namespace MatterHackers.MatterControl GroupBox terminalControlsContainer; terminalControlsContainer = new GroupBox(new LocalizedString("Printer Communications").Translated); - terminalControlsContainer.Margin = new BorderDouble(top: 10); + terminalControlsContainer.Margin = new BorderDouble(0); terminalControlsContainer.TextColor = ActiveTheme.Instance.PrimaryTextColor; terminalControlsContainer.BorderColor = ActiveTheme.Instance.PrimaryTextColor; terminalControlsContainer.HAnchor = Agg.UI.HAnchor.ParentLeftRight; @@ -637,17 +674,24 @@ namespace MatterHackers.MatterControl FlowLayoutWidget buttonBar = new FlowLayoutWidget(); buttonBar.HAnchor |= HAnchor.ParentLeftRight; buttonBar.VAnchor |= Agg.UI.VAnchor.ParentCenter; - buttonBar.Margin = new BorderDouble(3, 0, 3, 6); + buttonBar.Margin = new BorderDouble(3, 0, 3, 6); buttonBar.Padding = new BorderDouble(0); this.textImageButtonFactory.FixedHeight = TallButtonHeight; + Agg.Image.ImageBuffer terminalImage = new Agg.Image.ImageBuffer(); + ImageBMPIO.LoadImageData(Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath,"Icons", "PrintStatusControls", "terminal-24x24.png"), terminalImage); + ImageWidget terminalIcon = new ImageWidget(terminalImage); + terminalIcon.Margin = new BorderDouble (right: 6); + Button showTerminal = textImageButtonFactory.Generate(new LocalizedString("SHOW TERMINAL").Translated); showTerminal.Margin = new BorderDouble(0); showTerminal.Click += (sender, e) => { OutputScrollWindow.Show(); }; + + //buttonBar.AddChild(terminalIcon); buttonBar.AddChild(showTerminal); terminalControlsContainer.AddChild(buttonBar); @@ -715,9 +759,9 @@ namespace MatterHackers.MatterControl bedTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); movementControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); fanControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); - eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); tuningAdjustmentControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); - terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); printLevelContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); sdCardManagerContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); macroControls.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); @@ -934,6 +978,31 @@ namespace MatterHackers.MatterControl this.Invalidate(); } + void enablePrintLeveling_Click(object sender, MouseEventArgs mouseEvent) + { + ActivePrinterProfile.Instance.DoPrintLeveling = true; + } + + void disablePrintLeveling_Click(object sender, MouseEventArgs mouseEvent) + { + ActivePrinterProfile.Instance.DoPrintLeveling = false; + } + + void SetPrintLevelButtonVisiblity() + { + enablePrintLevelingButton.Visible = !ActivePrinterProfile.Instance.DoPrintLeveling; + disablePrintLevelingButton.Visible = ActivePrinterProfile.Instance.DoPrintLeveling; + + if (ActivePrinterProfile.Instance.DoPrintLeveling) { + printLevelingStatusLabel.Text = new LocalizedString ("Automatic Print Leveling (enabled)").Translated; + } + else + { + printLevelingStatusLabel.Text = new LocalizedString ("Automatic Print Leveling (disabled)").Translated; + } + } + + void disableMotors_Click(object sender, MouseEventArgs mouseEvent) { PrinterCommunication.Instance.ReleaseMotors(); diff --git a/StaticData/Icons/PrintStatusControls/ruler.png b/StaticData/Icons/PrintStatusControls/leveling-16x16.png similarity index 100% rename from StaticData/Icons/PrintStatusControls/ruler.png rename to StaticData/Icons/PrintStatusControls/leveling-16x16.png diff --git a/StaticData/Icons/PrintStatusControls/leveling-24x24.png b/StaticData/Icons/PrintStatusControls/leveling-24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4ee060bb2d3fd7f7fe62de9a3dc929a05e7e6e GIT binary patch literal 3262 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 E08y$q>;M1& literal 0 HcmV?d00001 diff --git a/StaticData/Icons/PrintStatusControls/terminal-24x24.png b/StaticData/Icons/PrintStatusControls/terminal-24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..af811b51feaa7bda3682fcace752faa050f17595 GIT binary patch literal 3152 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 literal 0 HcmV?d00001