From 69e83b3dd9c27bc7c9d25db3b2eb3afcbb9667c2 Mon Sep 17 00:00:00 2001 From: John Lewin Date: Tue, 23 May 2017 19:03:30 -0700 Subject: [PATCH] Continue migrating features to new layout - Create toolbar for printer - Migrate ActionBarPlus code to new toolbar - Migrate printer specific actions from Options to new toolbar - Consolidate and reuse theme factory instances - Restore F1 reporting of unnamed widgets, useful for finding types --- ActionBar/ActionBarPlus.cs | 1 - ActionBar/PrintActionRow.cs | 36 ++--- ActionBar/PrintStatusRow.cs | 65 ++------ ActionBar/PrinterConnectAndSelectControl.cs | 36 +---- ApplicationView/ApplicationController.cs | 74 +++++++++ .../PrinterSettings/PrinterSettingsView.cs | 151 ------------------ MatterControl.csproj | 1 + MatterControlApplication.cs | 4 +- .../BaseClasses/PartPreview3DWidget.cs | 2 +- PartPreviewWindow/View3D/PrinterActionsBar.cs | 128 +++++++++++++++ PartPreviewWindow/View3D/View3DWidget.cs | 7 +- PartPreviewWindow/ViewControls3D.cs | 2 + PartPreviewWindow/ViewGcodeBasic.cs | 1 + StaticData/OEMSettings/bedimage.png | Bin 0 -> 13750 bytes StaticData/OEMSettings/watermark.png | Bin 726 -> 1550 bytes Submodules/agg-sharp | 2 +- 16 files changed, 243 insertions(+), 267 deletions(-) create mode 100644 PartPreviewWindow/View3D/PrinterActionsBar.cs create mode 100644 StaticData/OEMSettings/bedimage.png diff --git a/ActionBar/ActionBarPlus.cs b/ActionBar/ActionBarPlus.cs index 58424472d..67e08b713 100644 --- a/ActionBar/ActionBarPlus.cs +++ b/ActionBar/ActionBarPlus.cs @@ -30,7 +30,6 @@ either expressed or implied, of the FreeBSD Project. using MatterHackers.Agg; using MatterHackers.Agg.UI; using MatterHackers.MatterControl.ActionBar; -using MatterHackers.MatterControl.PrintQueue; namespace MatterHackers.MatterControl { diff --git a/ActionBar/PrintActionRow.cs b/ActionBar/PrintActionRow.cs index e9208260b..89f257a3e 100644 --- a/ActionBar/PrintActionRow.cs +++ b/ActionBar/PrintActionRow.cs @@ -70,27 +70,12 @@ namespace MatterHackers.MatterControl.ActionBar private Button skipButton; private Button startButton; private Button finishSetupButton; - private TextImageButtonFactory textImageButtonFactory; private EventHandler unregisterEvents; public PrintActionRow() { this.HAnchor = HAnchor.ParentLeftRight; - textImageButtonFactory = new TextImageButtonFactory() - { - normalTextColor = RGBA_Bytes.White, - disabledTextColor = RGBA_Bytes.LightGray, - hoverTextColor = RGBA_Bytes.White, - pressedTextColor = RGBA_Bytes.White, - AllowThemeToAdjustImage = false, - borderWidth = 1, - FixedHeight = 52 * GuiWidget.DeviceScale, - fontSize = 14, - normalBorderColor = new RGBA_Bytes(255, 255, 255, 100), - hoverBorderColor = new RGBA_Bytes(255, 255, 255, 100) - }; - AddChildElements(); // Add Handlers @@ -101,7 +86,9 @@ namespace MatterHackers.MatterControl.ActionBar protected void AddChildElements() { - addButton = textImageButtonFactory.GenerateTooltipButton("Add".Localize(), StaticData.Instance.LoadIcon("icon_circle_plus.png",32,32).InvertLightness()); + var buttonFactory = ApplicationController.Instance.Theme.ActionRowButtonFactory; + + addButton = buttonFactory.GenerateTooltipButton("Add".Localize(), StaticData.Instance.LoadIcon("icon_circle_plus.png",32,32).InvertLightness()); addButton.ToolTipText = "Add a file to be printed".Localize(); addButton.Margin = new BorderDouble(6, 6, 6, 3); addButton.Click += (s, e) => @@ -109,21 +96,21 @@ namespace MatterHackers.MatterControl.ActionBar UiThread.RunOnIdle(AddButtonOnIdle); }; - startButton = textImageButtonFactory.GenerateTooltipButton("Print".Localize(), StaticData.Instance.LoadIcon("icon_play_32x32.png",32,32).InvertLightness()); + startButton = buttonFactory.GenerateTooltipButton("Print".Localize(), StaticData.Instance.LoadIcon("icon_play_32x32.png",32,32).InvertLightness()); startButton.Name = "Start Print Button"; startButton.ToolTipText = "Begin printing the selected item.".Localize(); startButton.Margin = new BorderDouble(6, 6, 6, 3); startButton.Click += onStartButton_Click; - finishSetupButton = textImageButtonFactory.GenerateTooltipButton("Finish Setup...".Localize()); + finishSetupButton = buttonFactory.GenerateTooltipButton("Finish Setup...".Localize()); finishSetupButton.Name = "Finish Setup Button"; finishSetupButton.ToolTipText = "Run setup configuration for printer.".Localize(); finishSetupButton.Margin = new BorderDouble(6, 6, 6, 3); finishSetupButton.Click += onStartButton_Click; - touchScreenConnectButton = textImageButtonFactory.GenerateTooltipButton("Connect".Localize(), StaticData.Instance.LoadIcon("connect.png", 32,32).InvertLightness()); + touchScreenConnectButton = buttonFactory.GenerateTooltipButton("Connect".Localize(), StaticData.Instance.LoadIcon("connect.png", 32,32).InvertLightness()); touchScreenConnectButton.ToolTipText = "Connect to the printer".Localize(); - touchScreenConnectButton.Margin = new BorderDouble(6, 6, 6, 3); + touchScreenConnectButton.Margin = new BorderDouble(0, 6, 6, 3); touchScreenConnectButton.Click += (s, e) => { if (ActiveSliceSettings.Instance.PrinterSelected) @@ -144,7 +131,7 @@ namespace MatterHackers.MatterControl.ActionBar } }; - addPrinterButton = textImageButtonFactory.GenerateTooltipButton("Add Printer".Localize()); + addPrinterButton = buttonFactory.GenerateTooltipButton("Add Printer".Localize()); addPrinterButton.ToolTipText = "Select and add a new printer.".Localize(); addPrinterButton.Margin = new BorderDouble(6, 6, 6, 3); addPrinterButton.Click += (s, e) => @@ -152,7 +139,7 @@ namespace MatterHackers.MatterControl.ActionBar UiThread.RunOnIdle(() => WizardWindow.ShowPrinterSetup(true)); }; - selectPrinterButton = textImageButtonFactory.GenerateTooltipButton("Select Printer".Localize()); + selectPrinterButton = buttonFactory.GenerateTooltipButton("Select Printer".Localize()); selectPrinterButton.ToolTipText = "Select an existing printer.".Localize(); selectPrinterButton.Margin = new BorderDouble(6, 6, 6, 3); selectPrinterButton.Click += (s, e) => @@ -160,7 +147,7 @@ namespace MatterHackers.MatterControl.ActionBar WizardWindow.Show("/SetupOptions", "Setup Wizard"); }; - resetConnectionButton = textImageButtonFactory.GenerateTooltipButton("Reset".Localize(), StaticData.Instance.LoadIcon("e_stop4.png", 32,32).InvertLightness()); + resetConnectionButton = buttonFactory.GenerateTooltipButton("Reset".Localize(), StaticData.Instance.LoadIcon("e_stop4.png", 32,32).InvertLightness()); resetConnectionButton.ToolTipText = "Reboots the firmware on the controller".Localize(); resetConnectionButton.Margin = new BorderDouble(6, 6, 6, 3); resetConnectionButton.Click += (s, e) => UiThread.RunOnIdle(PrinterConnectionAndCommunication.Instance.RebootBoard); @@ -289,9 +276,10 @@ namespace MatterHackers.MatterControl.ActionBar protected Button makeButton(string buttonText, string buttonToolTip = "") { - Button button = textImageButtonFactory.GenerateTooltipButton(buttonText); + Button button = ApplicationController.Instance.Theme.ActionRowButtonFactory.GenerateTooltipButton(buttonText); button.ToolTipText = buttonToolTip; button.Margin = new BorderDouble(0, 6, 6, 3); + return button; } diff --git a/ActionBar/PrintStatusRow.cs b/ActionBar/PrintStatusRow.cs index 97f93030d..7fffbc808 100644 --- a/ActionBar/PrintStatusRow.cs +++ b/ActionBar/PrintStatusRow.cs @@ -43,9 +43,7 @@ namespace MatterHackers.MatterControl.ActionBar { public class PrintStatusRow : FlowLayoutWidget { - private TextWidget activePrintLabel; private TextWidget activePrintName; - private PartThumbnailWidget activePrintPreviewImage; private TextWidget activePrintStatus; private TemperatureWidgetBase bedTemperatureWidget; private TemperatureWidgetBase extruderTemperatureWidget; @@ -55,7 +53,8 @@ namespace MatterHackers.MatterControl.ActionBar { UiThread.RunOnIdle(OnIdle); - this.Margin = new BorderDouble(6, 3, 6, 6); + this.Margin = 0; + this.Padding = 0; this.HAnchor = HAnchor.ParentLeftRight; AddChildElements(); @@ -75,31 +74,16 @@ namespace MatterHackers.MatterControl.ActionBar { UpdatePrintStatus(); }, ref unregisterEvents); - - PrinterConnectionAndCommunication.Instance.ActivePrintItemChanged.RegisterEvent(onActivePrintItemChanged, ref unregisterEvents); - - onActivePrintItemChanged(null, null); } public override void OnClosed(ClosedEventArgs e) { - if (activePrintPreviewImage.ItemWrapper != null) - { - activePrintPreviewImage.ItemWrapper.SlicingOutputMessage -= PrintItem_SlicingOutputMessage; - } - unregisterEvents?.Invoke(this, null); base.OnClosed(e); } private void AddChildElements() { - activePrintPreviewImage = new PartThumbnailWidget(null, "part_icon_transparent_100x100.png", "building_thumbnail_100x100.png", PartThumbnailWidget.ImageSizes.Size115x115); - activePrintPreviewImage.VAnchor = VAnchor.ParentTop; - activePrintPreviewImage.Padding = new BorderDouble(0); - activePrintPreviewImage.HoverBackgroundColor = new RGBA_Bytes(); - activePrintPreviewImage.BorderWidth = 3; - FlowLayoutWidget temperatureWidgets = new FlowLayoutWidget(FlowDirection.TopToBottom); { extruderTemperatureWidget = new TemperatureWidgetExtruder(); @@ -123,7 +107,6 @@ namespace MatterHackers.MatterControl.ActionBar iconContainer.Margin = new BorderDouble(top: 3); iconContainer.AddChild(GetAutoLevelIndicator()); - this.AddChild(activePrintPreviewImage); this.AddChild(printStatusContainer); this.AddChild(iconContainer); this.AddChild(temperatureWidgets); @@ -134,30 +117,21 @@ namespace MatterHackers.MatterControl.ActionBar private FlowLayoutWidget CreateActivePrinterInfoWidget() { - FlowLayoutWidget container = new FlowLayoutWidget(FlowDirection.TopToBottom); - container.Margin = new BorderDouble(6, 0, 6, 0); - container.HAnchor = HAnchor.ParentLeftRight; - container.VAnchor |= VAnchor.ParentTop; - - FlowLayoutWidget topRow = new FlowLayoutWidget(); - topRow.Name = "PrintStatusRow.ActivePrinterInfo.TopRow"; - topRow.HAnchor = HAnchor.ParentLeftRight; - - activePrintLabel = getPrintStatusLabel("Next Print".Localize() + ":", pointSize: 11); - activePrintLabel.VAnchor = VAnchor.ParentTop; - - topRow.AddChild(activePrintLabel); + var container = new FlowLayoutWidget(FlowDirection.TopToBottom) + { + Margin = new BorderDouble(6, 0, 6, 0), + HAnchor = HAnchor.ParentLeftRight, + VAnchor = VAnchor.ParentBottom | VAnchor.FitToChildren, + }; activePrintName = getPrintStatusLabel("this is the biggest name we will allow", pointSize: 14); activePrintName.AutoExpandBoundsToText = false; + container.AddChild(activePrintName); activePrintStatus = getPrintStatusLabel("this is the biggest label we will allow - bigger", pointSize: 11); activePrintStatus.AutoExpandBoundsToText = false; activePrintStatus.Text = ""; activePrintStatus.Margin = new BorderDouble(top: 3); - - container.AddChild(topRow); - container.AddChild(activePrintName); container.AddChild(activePrintStatus); return container; @@ -168,6 +142,7 @@ namespace MatterHackers.MatterControl.ActionBar ImageButtonFactory imageButtonFactory = new ImageButtonFactory(); imageButtonFactory.InvertImageColor = false; ImageBuffer levelingImage = StaticData.Instance.LoadIcon("leveling_32x32.png", 16, 16).InvertLightness(); + Button autoLevelButton = imageButtonFactory.Generate(levelingImage, levelingImage); autoLevelButton.Margin = new Agg.BorderDouble(top: 3); autoLevelButton.ToolTipText = "Print leveling is enabled.".Localize(); @@ -191,25 +166,6 @@ namespace MatterHackers.MatterControl.ActionBar return widget; } - private void onActivePrintItemChanged(object sender, EventArgs e) - { - // first we have to remove any link to an old part (the part currently in the view) - if (activePrintPreviewImage.ItemWrapper != null) - { - activePrintPreviewImage.ItemWrapper.SlicingOutputMessage -= PrintItem_SlicingOutputMessage; - } - - activePrintPreviewImage.ItemWrapper = PrinterConnectionAndCommunication.Instance.ActivePrintItem; - - // then hook up our new part - if (activePrintPreviewImage.ItemWrapper != null) - { - activePrintPreviewImage.ItemWrapper.SlicingOutputMessage += PrintItem_SlicingOutputMessage; - } - - activePrintPreviewImage.Invalidate(); - } - private void OnIdle() { if (PrinterConnectionAndCommunication.Instance.PrinterIsPrinting) @@ -340,7 +296,6 @@ namespace MatterHackers.MatterControl.ActionBar printerStatus = "Press 'Add' to choose an item to print".Localize(); } - activePrintLabel.Text = printLabel; activePrintStatus.Text = printerStatus; } } diff --git a/ActionBar/PrinterConnectAndSelectControl.cs b/ActionBar/PrinterConnectAndSelectControl.cs index 7da1b8314..cbd489898 100644 --- a/ActionBar/PrinterConnectAndSelectControl.cs +++ b/ActionBar/PrinterConnectAndSelectControl.cs @@ -43,7 +43,6 @@ namespace MatterHackers.MatterControl.ActionBar { public class PrinterConnectAndSelectControl : FlowLayoutWidget { - private TextImageButtonFactory actionBarButtonFactory = new TextImageButtonFactory(); private Button connectPrinterButton; private Button editPrinterButton; private string disconnectAndCancelTitle = "Disconnect and stop the current print?".Localize(); @@ -59,18 +58,6 @@ namespace MatterHackers.MatterControl.ActionBar { this.HAnchor = HAnchor.ParentLeftRight; - actionBarButtonFactory.normalTextColor = ActiveTheme.Instance.PrimaryTextColor; - actionBarButtonFactory.hoverTextColor = ActiveTheme.Instance.PrimaryTextColor; - actionBarButtonFactory.pressedTextColor = ActiveTheme.Instance.PrimaryTextColor; - - actionBarButtonFactory.disabledTextColor = ActiveTheme.Instance.TabLabelUnselected; - actionBarButtonFactory.disabledFillColor = ActiveTheme.Instance.PrimaryBackgroundColor; - actionBarButtonFactory.disabledBorderColor = ActiveTheme.Instance.SecondaryBackgroundColor; - - actionBarButtonFactory.hoverFillColor = ActiveTheme.Instance.PrimaryBackgroundColor; - - actionBarButtonFactory.invertImageLocation = true; - actionBarButtonFactory.borderWidth = 0; this.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; AddChildElements(); @@ -84,27 +71,16 @@ namespace MatterHackers.MatterControl.ActionBar protected void AddChildElements() { - actionBarButtonFactory.invertImageLocation = false; - actionBarButtonFactory.borderWidth = 1; - if (ActiveTheme.Instance.IsDarkTheme) - { - actionBarButtonFactory.normalBorderColor = new RGBA_Bytes(77, 77, 77); - } - else - { - actionBarButtonFactory.normalBorderColor = new RGBA_Bytes(190, 190, 190); - } - actionBarButtonFactory.hoverBorderColor = new RGBA_Bytes(128, 128, 128); - + var buttonFactory = ApplicationController.Instance.Theme.PrinterConnectButtonFactory; // connect and disconnect buttons { var normalImage = StaticData.Instance.LoadIcon("connect.png", 32, 32); // Create the image button with the normal and disabled ImageBuffers - connectPrinterButton = actionBarButtonFactory.Generate("Connect".Localize().ToUpper(), normalImage); + connectPrinterButton = buttonFactory.Generate("Connect".Localize().ToUpper(), normalImage); connectPrinterButton.Name = "Connect to printer button"; connectPrinterButton.ToolTipText = "Connect to the currently selected printer".Localize(); - connectPrinterButton.Margin = new BorderDouble(6, 0, 3, 3); + connectPrinterButton.Margin = new BorderDouble(0, 0, 3, 3); connectPrinterButton.VAnchor = VAnchor.ParentTop; connectPrinterButton.Cursor = Cursors.Hand; @@ -120,7 +96,7 @@ namespace MatterHackers.MatterControl.ActionBar } }; - disconnectPrinterButton = actionBarButtonFactory.Generate("Disconnect".Localize().ToUpper(), StaticData.Instance.LoadIcon("connect.png", 32, 32)); + disconnectPrinterButton = buttonFactory.Generate("Disconnect".Localize().ToUpper(), StaticData.Instance.LoadIcon("connect.png", 32, 32)); disconnectPrinterButton.Name = "Disconnect from printer button"; disconnectPrinterButton.ToolTipText = "Disconnect from current printer".Localize(); disconnectPrinterButton.Margin = new BorderDouble(6, 0, 3, 3); @@ -128,8 +104,6 @@ namespace MatterHackers.MatterControl.ActionBar disconnectPrinterButton.Cursor = Cursors.Hand; disconnectPrinterButton.Click += (s, e) => UiThread.RunOnIdle(OnIdleDisconnect); - actionBarButtonFactory.invertImageLocation = true; - this.AddChild(connectPrinterButton); this.AddChild(disconnectPrinterButton); } @@ -179,7 +153,7 @@ namespace MatterHackers.MatterControl.ActionBar // reset connection button { string resetConnectionText = "Reset\nConnection".Localize().ToUpper(); - Button resetConnectionButton = actionBarButtonFactory.Generate(resetConnectionText, "e_stop4.png"); + Button resetConnectionButton = buttonFactory.Generate(resetConnectionText, "e_stop4.png"); resetConnectionButton.Margin = new BorderDouble(6, 0, 3, 3); this.AddChild(resetConnectionButton); diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index 46beb3aed..830d0a0a4 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -57,6 +57,80 @@ namespace MatterHackers.MatterControl public class ApplicationController { + public class ThemeConfig + { + protected readonly int fizedHeightA = (int)(25 * GuiWidget.DeviceScale + .5); + protected readonly int fontSizeA = 11; + + protected readonly double fizedHeightB = 52 * GuiWidget.DeviceScale; + protected readonly int fontSizeB = 14; + + protected readonly int borderWidth = 1; + + public TextImageButtonFactory ImageButtonFactory { get; private set; } + public TextImageButtonFactory ActionRowButtonFactory { get; private set; } + public TextImageButtonFactory PrinterConnectButtonFactory { get; private set; } + + TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory(); + private EventHandler unregisterEvents; + + public ThemeConfig() + { + ActiveTheme.ThemeChanged.RegisterEvent((s, e) => RebuildTheme(), ref unregisterEvents); + RebuildTheme(); + } + + public void RebuildTheme() + { + this.ImageButtonFactory = new TextImageButtonFactory() + { + normalFillColor = RGBA_Bytes.Transparent, + normalBorderColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryTextColor, 200), + normalTextColor = ActiveTheme.Instance.SecondaryTextColor, + pressedTextColor = ActiveTheme.Instance.PrimaryTextColor, + hoverTextColor = ActiveTheme.Instance.PrimaryTextColor, + hoverBorderColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryTextColor, 200), + disabledFillColor = RGBA_Bytes.Transparent, + disabledBorderColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryTextColor, 100), + disabledTextColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryTextColor, 100), + FixedHeight = fizedHeightA, + fontSize = fontSizeA, + borderWidth = borderWidth + }; + + this.ActionRowButtonFactory = new TextImageButtonFactory() + { + normalTextColor = RGBA_Bytes.White, + disabledTextColor = RGBA_Bytes.LightGray, + hoverTextColor = RGBA_Bytes.White, + pressedTextColor = RGBA_Bytes.White, + AllowThemeToAdjustImage = false, + borderWidth = borderWidth, + FixedHeight = fizedHeightB, + fontSize = fontSizeB, + normalBorderColor = new RGBA_Bytes(255, 255, 255, 100), + hoverBorderColor = new RGBA_Bytes(255, 255, 255, 100) + }; + + this.PrinterConnectButtonFactory = new TextImageButtonFactory() + { + normalTextColor = ActiveTheme.Instance.PrimaryTextColor, + normalBorderColor = (ActiveTheme.Instance.IsDarkTheme) ? new RGBA_Bytes(77, 77, 77) : new RGBA_Bytes(190, 190, 190), + hoverTextColor = ActiveTheme.Instance.PrimaryTextColor, + pressedTextColor = ActiveTheme.Instance.PrimaryTextColor, + disabledTextColor = ActiveTheme.Instance.TabLabelUnselected, + disabledFillColor = ActiveTheme.Instance.PrimaryBackgroundColor, + disabledBorderColor = ActiveTheme.Instance.SecondaryBackgroundColor, + hoverFillColor = ActiveTheme.Instance.PrimaryBackgroundColor, + hoverBorderColor = new RGBA_Bytes(128, 128, 128), + invertImageLocation = false, + borderWidth = 1 + }; + } + } + + public ThemeConfig Theme { get; set; } = new ThemeConfig(); + public Action RedeemDesignCode; public Action EnterShareCode; diff --git a/ConfigurationPage/PrinterSettings/PrinterSettingsView.cs b/ConfigurationPage/PrinterSettings/PrinterSettingsView.cs index b91b39952..85bfd8eca 100644 --- a/ConfigurationPage/PrinterSettings/PrinterSettingsView.cs +++ b/ConfigurationPage/PrinterSettings/PrinterSettingsView.cs @@ -16,28 +16,13 @@ namespace MatterHackers.MatterControl.ConfigurationPage { public class HardwareSettingsWidget : SettingsViewBase { - private Button openGcodeTerminalButton; private Button openCameraButton; - private DisableableWidget eePromControlsContainer; - private DisableableWidget terminalCommunicationsContainer; - private EventHandler unregisterEvents; public HardwareSettingsWidget() : base("Hardware".Localize()) { - eePromControlsContainer = new DisableableWidget(); - eePromControlsContainer.AddChild(GetEEPromControl()); - terminalCommunicationsContainer = new DisableableWidget(); - terminalCommunicationsContainer.AddChild(GetGcodeTerminalControl()); - - mainContainer.AddChild(new HorizontalLine(50)); - mainContainer.AddChild(eePromControlsContainer); - mainContainer.AddChild(new HorizontalLine(50)); - - mainContainer.AddChild(terminalCommunicationsContainer); - DisableableWidget cameraContainer = new DisableableWidget(); cameraContainer.AddChild(GetCameraControl()); @@ -112,76 +97,6 @@ namespace MatterHackers.MatterControl.ConfigurationPage return buttonRow; } - private FlowLayoutWidget GetGcodeTerminalControl() - { - FlowLayoutWidget buttonRow = new FlowLayoutWidget(); - buttonRow.HAnchor = HAnchor.ParentLeftRight; - buttonRow.Margin = new BorderDouble(0, 4); - - ImageBuffer terminalSettingsImage = StaticData.Instance.LoadIcon("terminal-24x24.png", 24, 24).InvertLightness(); - terminalSettingsImage.SetRecieveBlender(new BlenderPreMultBGRA()); - int iconSize = (int)(24 * GuiWidget.DeviceScale); - - if (!ActiveTheme.Instance.IsDarkTheme) - { - terminalSettingsImage.InvertLightness(); - } - - ImageWidget terminalIcon = new ImageWidget(terminalSettingsImage); - terminalIcon.Margin = new BorderDouble(right: 6, bottom: 6); - - TextWidget gcodeTerminalLabel = new TextWidget("G-Code Terminal".Localize()); - gcodeTerminalLabel.AutoExpandBoundsToText = true; - gcodeTerminalLabel.TextColor = ActiveTheme.Instance.PrimaryTextColor; - gcodeTerminalLabel.VAnchor = VAnchor.ParentCenter; - - openGcodeTerminalButton = textImageButtonFactory.Generate("Show Terminal".Localize().ToUpper()); - openGcodeTerminalButton.Name = "Show Terminal Button"; - openGcodeTerminalButton.Click += openGcodeTerminalButton_Click; - - buttonRow.AddChild(terminalIcon); - buttonRow.AddChild(gcodeTerminalLabel); - buttonRow.AddChild(new HorizontalSpacer()); - buttonRow.AddChild(openGcodeTerminalButton); - - return buttonRow; - } - - private static EePromMarlinWindow openEePromMarlinWidget = null; - private static EePromRepetierWindow openEePromRepetierWidget = null; - private string noEepromMappingMessage = "Oops! There is no eeprom mapping for your printer's firmware.".Localize() + "\n\n" + "You may need to wait a minute for your printer to finish initializing.".Localize(); - private string noEepromMappingTitle = "Warning - No EEProm Mapping".Localize(); - - private FlowLayoutWidget GetEEPromControl() - { - FlowLayoutWidget buttonRow = new FlowLayoutWidget(); - buttonRow.HAnchor = HAnchor.ParentLeftRight; - buttonRow.Margin = new BorderDouble(0, 4); - - TextWidget notificationSettingsLabel = new TextWidget("EEProm".Localize()); - notificationSettingsLabel.AutoExpandBoundsToText = true; - notificationSettingsLabel.TextColor = ActiveTheme.Instance.PrimaryTextColor; - notificationSettingsLabel.VAnchor = VAnchor.ParentCenter; - - ImageBuffer levelingImage = StaticData.Instance.LoadIcon("leveling_32x32.png", 24, 24); - - if (!ActiveTheme.Instance.IsDarkTheme) - { - levelingImage.InvertLightness(); - } - ImageWidget levelingIcon = new ImageWidget(levelingImage); - levelingIcon.Margin = new BorderDouble(right: 6); - - Button configureEePromButton = textImageButtonFactory.Generate("Configure".Localize().ToUpper()); - configureEePromButton.Click += configureEePromButton_Click; - - //buttonRow.AddChild(eePromIcon); - buttonRow.AddChild(notificationSettingsLabel); - buttonRow.AddChild(new HorizontalSpacer()); - buttonRow.AddChild(configureEePromButton); - - return buttonRow; - } private void AddHandlers() { @@ -194,66 +109,10 @@ namespace MatterHackers.MatterControl.ConfigurationPage MatterControlApplication.Instance.OpenCameraPreview(); } - private void configureEePromButton_Click(object sender, EventArgs mouseEvent) - { - UiThread.RunOnIdle(()=> - { -#if false // This is to force the creation of the repetier window for testing when we don't have repetier firmware. - new MatterHackers.MatterControl.EeProm.EePromRepetierWidget(); -#else - switch (PrinterConnectionAndCommunication.Instance.FirmwareType) - { - case PrinterConnectionAndCommunication.FirmwareTypes.Repetier: - if (openEePromRepetierWidget != null) - { - openEePromRepetierWidget.BringToFront(); - } - else - { - openEePromRepetierWidget = new EePromRepetierWindow(); - openEePromRepetierWidget.Closed += (RepetierWidget, RepetierEvent) => - { - openEePromRepetierWidget = null; - }; - } - break; - - case PrinterConnectionAndCommunication.FirmwareTypes.Marlin: - if (openEePromMarlinWidget != null) - { - openEePromMarlinWidget.BringToFront(); - } - else - { - openEePromMarlinWidget = new EePromMarlinWindow(); - openEePromMarlinWidget.Closed += (marlinWidget, marlinEvent) => - { - openEePromMarlinWidget = null; - }; - } - break; - - default: - PrinterConnectionAndCommunication.Instance.SendLineToPrinterNow("M115"); - StyledMessageBox.ShowMessageBox(null, noEepromMappingMessage, noEepromMappingTitle, StyledMessageBox.MessageType.OK); - break; - } -#endif - }); - } - - private void openGcodeTerminalButton_Click(object sender, EventArgs mouseEvent) - { - UiThread.RunOnIdle(TerminalWindow.Show); - } - private void SetEnabledStates() { if (!ActiveSliceSettings.Instance.PrinterSelected) { - // no printer selected - eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); - terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); //cloudMonitorContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); } else // we at least have a printer selected @@ -266,19 +125,13 @@ namespace MatterHackers.MatterControl.ConfigurationPage case PrinterConnectionAndCommunication.CommunicationStates.Disconnected: case PrinterConnectionAndCommunication.CommunicationStates.AttemptingToConnect: case PrinterConnectionAndCommunication.CommunicationStates.FailedToConnect: - eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); - terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); break; case PrinterConnectionAndCommunication.CommunicationStates.FinishedPrint: case PrinterConnectionAndCommunication.CommunicationStates.Connected: - eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); - terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); break; case PrinterConnectionAndCommunication.CommunicationStates.PrintingFromSd: - eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); - terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); break; case PrinterConnectionAndCommunication.CommunicationStates.PreparingToPrint: @@ -289,8 +142,6 @@ namespace MatterHackers.MatterControl.ConfigurationPage case PrinterConnectionAndCommunication.DetailedPrintingState.HeatingBed: case PrinterConnectionAndCommunication.DetailedPrintingState.HeatingExtruder: case PrinterConnectionAndCommunication.DetailedPrintingState.Printing: - eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); - terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); break; default: @@ -299,8 +150,6 @@ namespace MatterHackers.MatterControl.ConfigurationPage break; case PrinterConnectionAndCommunication.CommunicationStates.Paused: - eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); - terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); break; default: diff --git a/MatterControl.csproj b/MatterControl.csproj index 9c9d39165..59f5c8e78 100644 --- a/MatterControl.csproj +++ b/MatterControl.csproj @@ -205,6 +205,7 @@ + diff --git a/MatterControlApplication.cs b/MatterControlApplication.cs index bc4b62476..d45dad8e4 100644 --- a/MatterControlApplication.cs +++ b/MatterControlApplication.cs @@ -928,8 +928,8 @@ namespace MatterHackers.MatterControl } else { - //e.graphics2D.DrawString($"{child.widget.GetType().Name} -- -", start.x, start.y, backgroundColor: RGBA_Bytes.White, drawFromHintedCach: true); - //start.y += lineHeight; + e.graphics2D.DrawString($"{child.widget.GetType().Name} -- -", start.x, start.y, backgroundColor: RGBA_Bytes.White, drawFromHintedCach: true); + start.y += lineHeight; } } } diff --git a/PartPreviewWindow/BaseClasses/PartPreview3DWidget.cs b/PartPreviewWindow/BaseClasses/PartPreview3DWidget.cs index c5b8e2f20..4a15fe800 100644 --- a/PartPreviewWindow/BaseClasses/PartPreview3DWidget.cs +++ b/PartPreviewWindow/BaseClasses/PartPreview3DWidget.cs @@ -165,7 +165,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { // this is to add an image to the bed string imagePathAndFile = Path.Combine("OEMSettings", "bedimage.png"); - if (allowAutoRotate && StaticData.Instance.FileExists(imagePathAndFile)) + if (StaticData.Instance.FileExists(imagePathAndFile)) { if (wattermarkImage == null) { diff --git a/PartPreviewWindow/View3D/PrinterActionsBar.cs b/PartPreviewWindow/View3D/PrinterActionsBar.cs new file mode 100644 index 000000000..98ecfaa15 --- /dev/null +++ b/PartPreviewWindow/View3D/PrinterActionsBar.cs @@ -0,0 +1,128 @@ +/* +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.ActionBar; +using MatterHackers.MatterControl.EeProm; +using MatterHackers.MatterControl.PrinterCommunication; + +namespace MatterHackers.MatterControl.PartPreviewWindow +{ + + public partial class View3DWidget : PartPreview3DWidget + { + public class PrinterActionsBar : FlowLayoutWidget + { + private static EePromMarlinWindow openEePromMarlinWidget = null; + private static EePromRepetierWindow openEePromRepetierWidget = null; + private string noEepromMappingMessage = "Oops! There is no eeprom mapping for your printer's firmware.".Localize() + "\n\n" + "You may need to wait a minute for your printer to finish initializing.".Localize(); + private string noEepromMappingTitle = "Warning - No EEProm Mapping".Localize(); + + public PrinterActionsBar() + { + this.Padding = new BorderDouble(0, 0, 10, 0); + this.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + this.HAnchor = HAnchor.ParentLeftRight; + this.VAnchor = VAnchor.FitToChildren; + + var buttonFactory = ApplicationController.Instance.Theme.PrinterConnectButtonFactory; + + //ImageBuffer terminalSettingsImage = StaticData.Instance.LoadIcon("terminal-24x24.png", 24, 24).InvertLightness(); + var terminalButton = buttonFactory.Generate("Terminal".Localize().ToUpper()); + terminalButton.Name = "Show Terminal Button"; + terminalButton.Click += (s, e) => UiThread.RunOnIdle(TerminalWindow.Show); + this.AddChild(terminalButton); + + /* + ImageBuffer levelingImage = StaticData.Instance.LoadIcon("leveling_32x32.png", 24, 24); + if (!ActiveTheme.Instance.IsDarkTheme) + { + levelingImage.InvertLightness(); + }*/ + Button configureEePromButton = buttonFactory.Generate("EEProm".Localize().ToUpper()); + configureEePromButton.Click += configureEePromButton_Click; + this.AddChild(configureEePromButton); + + this.AddChild(new PrinterConnectAndSelectControl()); + + this.AddChild(new PrintStatusRow()); + } + + private void configureEePromButton_Click(object sender, EventArgs mouseEvent) + { + UiThread.RunOnIdle(() => + { +#if false // This is to force the creation of the repetier window for testing when we don't have repetier firmware. + new MatterHackers.MatterControl.EeProm.EePromRepetierWidget(); +#else + switch (PrinterConnectionAndCommunication.Instance.FirmwareType) + { + case PrinterConnectionAndCommunication.FirmwareTypes.Repetier: + if (openEePromRepetierWidget != null) + { + openEePromRepetierWidget.BringToFront(); + } + else + { + openEePromRepetierWidget = new EePromRepetierWindow(); + openEePromRepetierWidget.Closed += (RepetierWidget, RepetierEvent) => + { + openEePromRepetierWidget = null; + }; + } + break; + + case PrinterConnectionAndCommunication.FirmwareTypes.Marlin: + if (openEePromMarlinWidget != null) + { + openEePromMarlinWidget.BringToFront(); + } + else + { + openEePromMarlinWidget = new EePromMarlinWindow(); + openEePromMarlinWidget.Closed += (marlinWidget, marlinEvent) => + { + openEePromMarlinWidget = null; + }; + } + break; + + default: + PrinterConnectionAndCommunication.Instance.SendLineToPrinterNow("M115"); + StyledMessageBox.ShowMessageBox(null, noEepromMappingMessage, noEepromMappingTitle, StyledMessageBox.MessageType.OK); + break; + } +#endif + }); + } + } + } +} \ No newline at end of file diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 206448b81..3f6da0b27 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -236,6 +236,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } } + protected FlowLayoutWidget editPlateButtonsContainer; public View3DWidget(PrintItemWrapper printItemWrapper, Vector3 viewerVolume, Vector2 bedCenter, BedShape bedShape, WindowMode windowType, AutoRotate autoRotate, OpenMode openMode = OpenMode.Viewing) @@ -252,10 +253,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow mainContainerTopToBottom.HAnchor = Agg.UI.HAnchor.Max_FitToChildren_ParentWidth; mainContainerTopToBottom.VAnchor = Agg.UI.VAnchor.Max_FitToChildren_ParentHeight; - FlowLayoutWidget centerPartPreviewAndControls = new FlowLayoutWidget(FlowDirection.LeftToRight); + var centerPartPreviewAndControls = new FlowLayoutWidget(FlowDirection.LeftToRight); centerPartPreviewAndControls.Name = "centerPartPreviewAndControls"; centerPartPreviewAndControls.AnchorAll(); + var textImageButtonFactory = ApplicationController.Instance.Theme.ImageButtonFactory; + + mainContainerTopToBottom.AddChild(new PrinterActionsBar()); + GuiWidget viewArea = new GuiWidget(); viewArea.AnchorAll(); { diff --git a/PartPreviewWindow/ViewControls3D.cs b/PartPreviewWindow/ViewControls3D.cs index 5a25fb1f9..873d10ef6 100644 --- a/PartPreviewWindow/ViewControls3D.cs +++ b/PartPreviewWindow/ViewControls3D.cs @@ -190,6 +190,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Margin = new BorderDouble(5); HAnchor |= Agg.UI.HAnchor.ParentLeft; VAnchor = Agg.UI.VAnchor.ParentTop; + + Margin = new BorderDouble(0, 0, 0, 72); rotateButton.Checked = true; BackgroundColor = new RGBA_Bytes(0, 0, 0, 120); diff --git a/PartPreviewWindow/ViewGcodeBasic.cs b/PartPreviewWindow/ViewGcodeBasic.cs index 3e20f31d2..7e8404f26 100644 --- a/PartPreviewWindow/ViewGcodeBasic.cs +++ b/PartPreviewWindow/ViewGcodeBasic.cs @@ -309,6 +309,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; viewControls3D = new ViewControls3D(meshViewerWidget); + viewControls3D.Margin = new BorderDouble(0, 0, 0, 40); viewControls3D.PartSelectVisible = false; AddChild(viewControls3D); diff --git a/StaticData/OEMSettings/bedimage.png b/StaticData/OEMSettings/bedimage.png new file mode 100644 index 0000000000000000000000000000000000000000..fecbb60145d149de60e77b09db4615fecca35bbe GIT binary patch literal 13750 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 literal 0 HcmV?d00001 diff --git a/StaticData/OEMSettings/watermark.png b/StaticData/OEMSettings/watermark.png index a7d28c8c25ee13bae719b7e4c8e69fa71a4e5e75..ce4ae57b54edb27282e39b4eabf9c50102dcc94f 100644 GIT binary patch delta 1522 zcmcb{+Q&0NoXdfOje&t-Rc7J6iF(rYLJSPtLX4O0*8O2%U|=ut^mS#w%gG}ssmy4Y zxs`!|L9)a(q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&(O>zbNyEa2G$Bs7srr_xVN(_ z{qJ}P9NjrdplE_Or-19tf{e*JmSt0m8_y~_-AFmic4GPS><|1>g>T+RrmlXw<@VwF zgvZI1moAr-hn9w4-*Wt2+1Y@(7B)6}a*qBN@9XQ+GyJ*z1A7g-y6=@-gNuecIJR>f z>Ys6CJ3k*^-Sf{)E6ccjie{X=+a7%Up5DE;Sp zAFTH_YUzH-9rI+h)i&vWkbC;7PF~^xSIjv+IpLZ6dRkpB(b?&y;d4mC7qb_1z7gJ&tG1l$ z*#2`j-fy-$>axtbKkUp$`PGKISi@^&yHA*X`~Lm8#`QY?W7DfYcwaj{&IH&E0GLyD(A2sa7moQx?l-I!t&_J zW!;=F^?%Ih>EjCyGAmfnEbu0a-{BPF>(~0i)s25zk1w0@aizHugO&UTxmsoUR{PwN zQ&RJ*{xWX(_smC?_15y@FS|t<%Cg@3sQ`5#|)ruO>py~hyX-?v3$xgPVrzt{WT$j^}37x2!9p|1GU$yA5f z@BdPM3iHfmQ@=N%v=2$h)@NRhb7NTNI9L4GoA;``T~k>d-quvz zS6sATPLk=AI^Tf<2?xBG9e(F5vsHTAJyCJNox2Qg-o4A}o^7>diJlt!x+%K_86^Du zYE^$%y|PO5ODQ<(BDmtUX|zsuE`!?!`R>fKf@Ni8K}Iu9Npqa+<9^fs{nN5F3|BaP zrS{7^%D$}6|5UP4WX`{Pv5Ri}Vla4kMaJdU7p}cOD%QSbJdplYcanVI^ey%VTWhx1 zGW@W9_v`(n&<{7Re0s>)uxo$by`c+X7}H@ z?{%%ZeoFA)p2| z&-(b7uWrtZ$b;Ngx@SJPeT(FqadKr-;bajjyUDdKFB2GSdudw+WOcy;FErTMZ)xFEoKf!`K6f~>ZYohpI>`swp(}3(U8@w%$h4J&pvPI zSo38`+OOGMy`BLk&(^FA=dWk$oir;^qcu--p2o_VbzPH;x4xPexGv?YXj9{F&#bUZ zmo`qCbuoPZ`Gghsm+sxWH|@_%rgSgQEVuCMJHx^>V)yN=Uw&|7ri544wQpBuUs>aM z@Irp~JX@)Wb0k^#+&s_Le4BdZ%<^@gRp-y^$my2fc}z83jOjS{*j_tX=vm-WV z=IcEdPtI&jP&&9IP5$Eb(zrdv*}^jd3|2H=O_Pd-sf|AONhM8L#7?|8VT^vI)oZrrT>)&i3a4b=O z*2<5Q^9}#~ub&~6F^TvEm54m(V_4NLm^sJB9>;22GR@ovF78`G5OkAU% zp!Ra=!S{hSRl@)4ADm!S5O^q+HYZLpphf&6f7iqtyd0l6)8@uW`Y4`T`h&f7BBP}9 zDV9)%Amu|sN;cj1XN7+1Esu_u?|mHUwA<%d;TpB2_L1{l-zYQOKE?8~d{*2_l^6dT z`QGhqyx6r_U-?U=eqCQ6^Qi}n*IGiWQV+~3P~9ia8fdw;RJVEavijQl%R&QK4=9{J za@HkcSvZ?;ykLsi)}C9E+jt}rH!Ob?%(AXhS6HLz^1FuL7N56DUKi3!z8>cISD@Lp z{pJ$6rvJBUI6hdW$3*vUZ4GStKC|*#gS!>)c{R@|dk(KEoMPE`-2Txs6HW(<8U7#l zx*quJQ+%j_*S0u z{3}a1j^1sYnQ&Y7T|(}`{ayFDYgiOw_|zX=*JaN=|2Fo+k#L5jC3;Ppbla8o^32;J zxS%Pe$+zVmo4=J{LkGvvrw4pqmVQ`b%*fHCtJhw6zgc}QmxGG1-FL-`OFJ1@4%XLq z+^*iHbihuKMZh|ui6M#ITfpH>LZPLgRe8`8ZtKw(m)}R!_&>NW zuXpxuM2*LrZibju|8uooiAR+C{@<2m#gKVqG25AhHH;MpqykpP#+KaS3TNEryMhsF uC?`|LUDjLcx2{>a{}xl@y3R%RM_YxsYQM`FtY%