From b54e6a14adcd7e27eb3db93fd5c5fc0f43dcc927 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Wed, 1 Jun 2016 18:17:11 -0700 Subject: [PATCH] Unified the android and desktop setup wizard classes --- ActionBar/ActionBarPlus.cs | 2 +- ActionBar/PrintActionRow.cs | 2 +- ActionBar/PrintStatusRow.cs | 544 ++++++++++++++++-- ActionBar/PrinterActionRow.cs | 21 +- ApplicationView/MenuRow/MenuOptionFile.cs | 2 +- MatterControl.csproj | 7 +- MatterControlApplication.cs | 10 + .../BaseConnectionWidget.cs | 19 +- .../PrinterConnections/ConnectionWindow.cs | 120 ---- .../SetupConnectionWidgetBase.cs | 6 +- .../PrinterConnections/SetupStepBaudRate.cs | 14 +- .../SetupStepComPortManual.cs | 4 +- .../PrinterConnections/SetupStepComPortOne.cs | 4 +- .../PrinterConnections/SetupStepComPortTwo.cs | 4 +- .../SetupStepConfigureConnection.cs | 4 +- .../SetupStepInstallDriver.cs | 6 +- .../SetupStepMakeModelName.cs | 5 +- SetupWizard/SetupWizardConnect.cs | 181 ++++++ SetupWizard/SetupWizardHome.cs | 298 ++++++++++ SetupWizard/SetupWizardTroubleshooting.cs | 308 ++++++++++ SetupWizard/SetupWizardWifi.cs | 88 +++ SetupWizard/WizardPanel.cs | 170 ++++++ SetupWizard/WizardWindow.cs | 226 ++++++++ StaticData/Translations/Master.txt | 30 + Submodules/agg-sharp | 2 +- 25 files changed, 1850 insertions(+), 227 deletions(-) delete mode 100644 PrinterControls/PrinterConnections/ConnectionWindow.cs create mode 100644 SetupWizard/SetupWizardConnect.cs create mode 100644 SetupWizard/SetupWizardHome.cs create mode 100644 SetupWizard/SetupWizardTroubleshooting.cs create mode 100644 SetupWizard/SetupWizardWifi.cs create mode 100644 SetupWizard/WizardPanel.cs create mode 100644 SetupWizard/WizardWindow.cs diff --git a/ActionBar/ActionBarPlus.cs b/ActionBar/ActionBarPlus.cs index f83954021..05e979b43 100644 --- a/ActionBar/ActionBarPlus.cs +++ b/ActionBar/ActionBarPlus.cs @@ -59,7 +59,7 @@ namespace MatterHackers.MatterControl { this.AddChild(new ActionBar.PrinterActionRow()); } - this.AddChild(new PrintStatusRow(queueDataView)); + this.AddChild(PrintStatusRow.Create(queueDataView)); this.Padding = new BorderDouble(bottom: 6); // Add Handlers diff --git a/ActionBar/PrintActionRow.cs b/ActionBar/PrintActionRow.cs index 1833aecc4..63715c2ff 100644 --- a/ActionBar/PrintActionRow.cs +++ b/ActionBar/PrintActionRow.cs @@ -437,7 +437,7 @@ namespace MatterHackers.MatterControl.ActionBar if (ActiveSliceSettings.Instance == null) { #if __ANDROID__ - SetupWizardWindow.Show(); + WizardWindow.Show(); #else PrinterActionRow.OpenConnectionWindow(true); #endif diff --git a/ActionBar/PrintStatusRow.cs b/ActionBar/PrintStatusRow.cs index b579453d0..035775d46 100644 --- a/ActionBar/PrintStatusRow.cs +++ b/ActionBar/PrintStatusRow.cs @@ -32,61 +32,22 @@ using MatterHackers.Agg.Image; using MatterHackers.Agg.ImageProcessing; using MatterHackers.Agg.PlatformAbstract; using MatterHackers.Agg.UI; -using MatterHackers.GuiAutomation; using MatterHackers.Localizations; -using MatterHackers.MatterControl.CustomWidgets; using MatterHackers.MatterControl.PrinterCommunication; using MatterHackers.MatterControl.PrintQueue; using MatterHackers.MatterControl.SlicerConfiguration; using MatterHackers.VectorMath; using System; +using System.Diagnostics; using System.Globalization; using System.IO; -using System.Threading.Tasks; namespace MatterHackers.MatterControl.ActionBar { public class PrintStatusRow : FlowLayoutWidget { - private static FlowLayoutWidget iconContainer; - - private TextWidget activePrintInfo; - - private TextWidget activePrintLabel; - - private TextWidget activePrintName; - - private PartThumbnailWidget activePrintPreviewImage; - - private TextWidget activePrintStatus; - - private TemperatureWidgetBase bedTemperatureWidget; - - private TemperatureWidgetBase extruderTemperatureWidget; - - private QueueDataView queueDataView; - - private TextInfo textInfo = new CultureInfo("en-US", false).TextInfo; - - public PrintStatusRow(QueueDataView queueDataView) - { - Initialize(); - - this.HAnchor = HAnchor.ParentLeftRight; - - this.queueDataView = queueDataView; - - AddChildElements(); - AddHandlers(); - - onActivePrintItemChanged(null, null); - - if (privateAddIconToPrintStatusRow != null) - { - privateAddIconToPrintStatusRow(iconContainer); - } - } - + protected static event Action privateAddIconToPrintStatusRow; + protected static FlowLayoutWidget iconContainer; public static event Action AddIconToPrintStatusRow { add @@ -102,9 +63,58 @@ namespace MatterHackers.MatterControl.ActionBar } } - private static event Action privateAddIconToPrintStatusRow; + public static GuiWidget Create(QueueDataView queueDataView) + { + if (ActiveTheme.Instance.IsTouchScreen) + { + return new TouchScreenPrintStatusRow(queueDataView); + } + else + { + return new DesktopPrintStatusRow(queueDataView); + } + } + + protected PrintStatusRow() + { + } + + protected void DoAddIconToPrintStatusRow() + { + privateAddIconToPrintStatusRow?.Invoke(iconContainer); + } + } + + public class DesktopPrintStatusRow : PrintStatusRow + { + private TextWidget activePrintInfo; + private TextWidget activePrintLabel; + private TextWidget activePrintName; + private PartThumbnailWidget activePrintPreviewImage; + private TextWidget activePrintStatus; + private TemperatureWidgetBase bedTemperatureWidget; + private TemperatureWidgetBase extruderTemperatureWidget; + private QueueDataView queueDataView; + private TextInfo textInfo = new CultureInfo("en-US", false).TextInfo; + + public DesktopPrintStatusRow(QueueDataView queueDataView) + { + Initialize(); + + this.HAnchor = HAnchor.ParentLeftRight; + + this.queueDataView = queueDataView; + + AddChildElements(); + AddHandlers(); + + onActivePrintItemChanged(null, null); + + DoAddIconToPrintStatusRow(); + } private event EventHandler unregisterEvents; + private string ActivePrintStatusText { set @@ -242,7 +252,7 @@ namespace MatterHackers.MatterControl.ActionBar autoLevelButton.Margin = new Agg.BorderDouble(top: 3); autoLevelButton.ToolTipText = "Print leveling is enabled.".Localize(); autoLevelButton.Cursor = Cursors.Hand; - autoLevelButton.Click += (s, e) => + autoLevelButton.Click += (s, e) => { UiNavigation.GoToPrintLevelSettings(); }; @@ -345,6 +355,7 @@ namespace MatterHackers.MatterControl.ActionBar StringEventArgs message = e as StringEventArgs; ActivePrintStatusText = message.Data; } + private void SetVisibleStatus() { if (ActiveSliceSettings.Instance != null) @@ -359,6 +370,7 @@ namespace MatterHackers.MatterControl.ActionBar } } } + private void UpdatePrintItemName() { if (PrinterConnectionAndCommunication.Instance.ActivePrintItem != null) @@ -475,4 +487,448 @@ namespace MatterHackers.MatterControl.ActionBar } } } + + public class TouchScreenPrintStatusRow : PrintStatusRow + { + private TextWidget activePrintInfo; + private TextWidget activePrintLabel; + private TextWidget activePrintName; + private PartThumbnailWidget activePrintPreviewImage; + private TextWidget activePrintStatus; + private TemperatureWidgetBase bedTemperatureWidget; + private TemperatureWidgetBase extruderTemperatureWidget; + private QueueDataView queueDataView; + private Button setupButton; + private TextInfo textInfo = new CultureInfo("en-US", false).TextInfo; + private Stopwatch timeSinceLastDrawTime = new Stopwatch(); + + public TouchScreenPrintStatusRow(QueueDataView queueDataView) + { + Initialize(); + + this.HAnchor = HAnchor.ParentLeftRight; + + this.queueDataView = queueDataView; + + AddChildElements(); + AddHandlers(); + + onActivePrintItemChanged(null, null); + } + + public delegate void AddIconToPrintStatusRowDelegate(GuiWidget iconContainer); + + private event EventHandler unregisterEvents; + private string ActivePrintStatusText + { + set + { + if (activePrintStatus.Text != value) + { + activePrintStatus.Text = value; + } + } + } + + public override void OnClosed(EventArgs e) + { + unregisterEvents?.Invoke(this, null); + base.OnClosed(e); + } + + public override void OnDraw(Graphics2D graphics2D) + { + timeSinceLastDrawTime.Restart(); + base.OnDraw(graphics2D); + } + + public override void OnMouseUp(MouseEventArgs mouseEvent) + { + int boxSize = 20; + + // Handle errors in the touch panel that push touch event positions to the screen edge by + // proxying all clicks in the target region back into the desired control + RectangleDouble topRightHitbox = new RectangleDouble(this.Width - boxSize, this.Height - boxSize, this.Width, this.Height); + if (topRightHitbox.Contains(mouseEvent.Position) && this.MouseCaptured) + { + setupButton.ClickButton(null); + return; + } + + base.OnMouseUp(mouseEvent); + } + + protected void AddHandlers() + { + PrinterConnectionAndCommunication.Instance.ActivePrintItemChanged.RegisterEvent(onPrintItemChanged, ref unregisterEvents); + PrinterConnectionAndCommunication.Instance.CommunicationStateChanged.RegisterEvent(onStateChanged, ref unregisterEvents); + PrinterConnectionAndCommunication.Instance.WroteLine.RegisterEvent((s, e) => UpdatePrintStatus(), ref unregisterEvents); + PrinterConnectionAndCommunication.Instance.ActivePrintItemChanged.RegisterEvent(onActivePrintItemChanged, ref unregisterEvents); + } + + protected void Initialize() + { + UiThread.RunOnIdle(OnIdle); + this.Margin = new BorderDouble(6, 3, 0, 0); + + // Use top and right padding rather than margin to position controls but still + // ensure corner click events can be caught in this control + this.Padding = new BorderDouble(0, 0, 6, 6); + } + + protected void onPrintItemChanged(object sender, EventArgs e) + { + UpdatePrintItemName(); + UpdatePrintStatus(); + } + + private void AddChildElements() + { + FlowLayoutWidget tempWidgets = new FlowLayoutWidget(); + tempWidgets.VAnchor = VAnchor.ParentBottomTop; + + tempWidgets.Width = 120; + + extruderTemperatureWidget = new TemperatureWidgetExtruder(); + //extruderTemperatureWidget.Margin = new BorderDouble(right: 6); + extruderTemperatureWidget.VAnchor = VAnchor.ParentTop; + + bedTemperatureWidget = new TemperatureWidgetBed(); + bedTemperatureWidget.VAnchor = VAnchor.ParentTop; + + tempWidgets.AddChild(extruderTemperatureWidget); + tempWidgets.AddChild(new GuiWidget(6, 6)); + if (ActiveSliceSettings.Instance.HasHeatedBed()) + { + tempWidgets.AddChild(bedTemperatureWidget); + } + tempWidgets.AddChild(new GuiWidget(6, 6)); + + FlowLayoutWidget printStatusContainer = CreateActivePrinterInfoWidget(); + + PrintActionRow printActionRow = new PrintActionRow(queueDataView); + printActionRow.VAnchor = VAnchor.ParentTop; + + ImageButtonFactory factory = new ImageButtonFactory(); + factory.InvertImageColor = false; + + setupButton = factory.Generate(StaticData.Instance.LoadIcon("icon_gear_dot.png").InvertLightness(), null); + setupButton.Margin = new BorderDouble(left: 6); + setupButton.VAnchor = VAnchor.ParentCenter; + setupButton.Click += (sender, e) => + { + WizardWindow.Show(true); + }; + + this.AddChild(printStatusContainer); + this.AddChild(printActionRow); + this.AddChild(tempWidgets); + this.AddChild(setupButton); + this.Height = 80; + + UpdatePrintStatus(); + UpdatePrintItemName(); + } + + private FlowLayoutWidget CreateActivePrinterInfoWidget() + { + FlowLayoutWidget container = new FlowLayoutWidget(FlowDirection.TopToBottom); + container.Margin = new BorderDouble(6, 0, 6, 0); + container.HAnchor = HAnchor.ParentLeftRight; + container.VAnchor = VAnchor.ParentCenter; + container.Height = 80; + + FlowLayoutWidget topRow = new FlowLayoutWidget(); + topRow.Name = "PrintStatusRow.ActivePrinterInfo.TopRow"; + topRow.HAnchor = HAnchor.ParentLeftRight; + + string nextPrintLabel = LocalizedString.Get("Next Print"); + string nextPrintLabelFull = string.Format("{0}:", nextPrintLabel); + activePrintLabel = getPrintStatusLabel(nextPrintLabelFull, pointSize: 11); + activePrintLabel.VAnchor = VAnchor.ParentTop; + + topRow.AddChild(activePrintLabel); + + FlowLayoutWidget bottomRow = new FlowLayoutWidget(); + + activePrintPreviewImage = new PartThumbnailWidget(null, "part_icon_transparent_100x100.png", "building_thumbnail_100x100.png", PartThumbnailWidget.ImageSizes.Size50x50); + activePrintPreviewImage.VAnchor = VAnchor.ParentTop; + activePrintPreviewImage.Padding = new BorderDouble(0); + activePrintPreviewImage.HoverBackgroundColor = new RGBA_Bytes(); + activePrintPreviewImage.BorderWidth = 3; + + FlowLayoutWidget labelContainer = new FlowLayoutWidget(FlowDirection.TopToBottom); + labelContainer.VAnchor |= VAnchor.ParentTop; + labelContainer.Margin = new BorderDouble(8, 0, 0, 4); + { + activePrintName = getPrintStatusLabel("this is the biggest name we will allow", pointSize: 14); + activePrintName.AutoExpandBoundsToText = false; + + activePrintStatus = getPrintStatusLabel("this is the biggest label we will allow - bigger", pointSize: 11); + activePrintStatus.AutoExpandBoundsToText = false; + activePrintStatus.Text = ""; + activePrintStatus.Margin = new BorderDouble(top: 3); + + activePrintInfo = getPrintStatusLabel("", pointSize: 11); + activePrintInfo.AutoExpandBoundsToText = true; + + labelContainer.AddChild(activePrintName); + labelContainer.AddChild(activePrintStatus); + } + + bottomRow.AddChild(activePrintPreviewImage); + bottomRow.AddChild(labelContainer); + + //PrintActionRow printActionRow = new PrintActionRow(queueDataView); + + container.AddChild(topRow); + container.AddChild(bottomRow); + //container.AddChild(activePrintInfo); + //container.AddChild(printActionRow); + //container.AddChild(new VerticalSpacer()); + //container.AddChild(new MessageActionRow()); + + return container; + } + + private Button GetAutoLevelIndicator() + { + ImageButtonFactory imageButtonFactory = new ImageButtonFactory(); + imageButtonFactory.InvertImageColor = false; + string notifyIconPath = Path.Combine("PrintStatusControls", "leveling-16x16.png"); + string notifyHoverIconPath = Path.Combine("PrintStatusControls", "leveling-16x16.png"); + Button autoLevelButton = imageButtonFactory.Generate(notifyIconPath, notifyHoverIconPath); + autoLevelButton.Cursor = Cursors.Hand; + autoLevelButton.Margin = new Agg.BorderDouble(top: 3); + autoLevelButton.ToolTipText = "Print leveling is enabled.".Localize(); + autoLevelButton.Visible = ActiveSliceSettings.Instance.DoPrintLeveling(); + + ActiveSliceSettings.ActivePrinterChanged.RegisterEvent((sender, e) => + { + autoLevelButton.Visible = ActiveSliceSettings.Instance.DoPrintLeveling(); + }, ref unregisterEvents); + + ActiveSliceSettings.Instance.DoPrintLevelingChanged.RegisterEvent((sender, e) => + { + autoLevelButton.Visible = ActiveSliceSettings.Instance.DoPrintLeveling(); + }, ref unregisterEvents); + + return autoLevelButton; + } + + private string getConnectionMessage() + { + if (ActiveSliceSettings.Instance == null) + { + return "Press 'Connect' to select a printer.".Localize(); + } + else + { + switch (PrinterConnectionAndCommunication.Instance.CommunicationState) + { + case PrinterConnectionAndCommunication.CommunicationStates.Disconnected: + return "Not connected. Press 'Connect' to enable printing.".Localize(); + + case PrinterConnectionAndCommunication.CommunicationStates.AttemptingToConnect: + return "Attempting to Connect".Localize() + "..."; + + case PrinterConnectionAndCommunication.CommunicationStates.ConnectionLost: + case PrinterConnectionAndCommunication.CommunicationStates.FailedToConnect: + return "Unable to communicate with printer.".Localize(); + + default: + return ""; + } + } + } + + private TextWidget getPrintStatusLabel(string text, int pointSize) + { + TextWidget widget = new TextWidget(text, pointSize: pointSize); + widget.TextColor = RGBA_Bytes.White; + widget.AutoExpandBoundsToText = true; + widget.MinimumSize = new Vector2(widget.Width, widget.Height); + 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) + { + if (!timeSinceLastDrawTime.IsRunning) + { + timeSinceLastDrawTime.Start(); + } + else if (timeSinceLastDrawTime.ElapsedMilliseconds > 999) + { + UpdatePrintStatus(); + timeSinceLastDrawTime.Restart(); + } + } + + if (!HasBeenClosed) + { + UiThread.RunOnIdle(OnIdle); + } + } + + private void onStateChanged(object sender, EventArgs e) + { + UpdatePrintStatus(); + } + + private void PrintItem_SlicingOutputMessage(object sender, EventArgs e) + { + StringEventArgs message = e as StringEventArgs; + ActivePrintStatusText = message.Data; + } + private void SetVisibleStatus() + { + if (ActiveSliceSettings.Instance != null) + { + if (ActiveSliceSettings.Instance.HasHeatedBed()) + { + bedTemperatureWidget.Visible = true; + } + else + { + bedTemperatureWidget.Visible = false; + } + } + } + private void UpdatePrintItemName() + { + if (PrinterConnectionAndCommunication.Instance.ActivePrintItem != null) + { + string labelName = textInfo.ToTitleCase(PrinterConnectionAndCommunication.Instance.ActivePrintItem.Name); + labelName = labelName.Replace('_', ' '); + this.activePrintName.Text = labelName; + } + else + { + this.activePrintName.Text = LocalizedString.Get("No items in the print queue"); + } + } + + private void UpdatePrintStatus() + { + if (PrinterConnectionAndCommunication.Instance.ActivePrintItem != null) + { + int totalSecondsInPrint = PrinterConnectionAndCommunication.Instance.TotalSecondsInPrint; + + int totalHoursInPrint = (int)(totalSecondsInPrint / (60 * 60)); + int totalMinutesInPrint = (int)(totalSecondsInPrint / 60 - totalHoursInPrint * 60); + totalSecondsInPrint = totalSecondsInPrint % 60; + + string totalTimeLabel = LocalizedString.Get("Est. Print Time"); + string calculatingLabel = LocalizedString.Get("Calculating..."); + string totalPrintTimeText; + + if (totalSecondsInPrint > 0) + { + if (totalHoursInPrint > 0) + { + totalPrintTimeText = string.Format("{3} {0}h {1:00}m {2:00}s", + totalHoursInPrint, + totalMinutesInPrint, + totalSecondsInPrint, + totalTimeLabel); + } + else + { + totalPrintTimeText = string.Format("{2} {0}m {1:00}s", + totalMinutesInPrint, + totalSecondsInPrint, + totalTimeLabel); + } + } + else + { + if (totalSecondsInPrint < 0) + { + totalPrintTimeText = string.Format("{0}", LocalizedString.Get("Streaming GCode...")); + } + else + { + totalPrintTimeText = string.Format("{0}: {1}", totalTimeLabel, calculatingLabel); + } + } + + //GC.WaitForFullGCComplete(); + + string printPercentRemainingText; + string printPercentCompleteText = LocalizedString.Get("complete"); + printPercentRemainingText = string.Format("{0:0.0}% {1}", PrinterConnectionAndCommunication.Instance.PercentComplete, printPercentCompleteText); + + switch (PrinterConnectionAndCommunication.Instance.CommunicationState) + { + case PrinterConnectionAndCommunication.CommunicationStates.PreparingToPrint: + string preparingPrintLabel = LocalizedString.Get("Preparing To Print"); + string preparingPrintLabelFull = string.Format("{0}:", preparingPrintLabel); + activePrintLabel.Text = preparingPrintLabelFull; + //ActivePrintStatusText = ""; // set by slicer + activePrintInfo.Text = ""; + break; + + case PrinterConnectionAndCommunication.CommunicationStates.Printing: + { + activePrintLabel.Text = PrinterConnectionAndCommunication.Instance.PrintingStateString; + ActivePrintStatusText = totalPrintTimeText; + } + break; + + case PrinterConnectionAndCommunication.CommunicationStates.Paused: + { + string activePrintLabelText = LocalizedString.Get("Printing Paused"); + string activePrintLabelTextFull = string.Format("{0}:", activePrintLabelText); + activePrintLabel.Text = activePrintLabelTextFull; + ActivePrintStatusText = totalPrintTimeText; + } + break; + + case PrinterConnectionAndCommunication.CommunicationStates.FinishedPrint: + string donePrintingText = LocalizedString.Get("Done Printing"); + string donePrintingTextFull = string.Format("{0}:", donePrintingText); + activePrintLabel.Text = donePrintingTextFull; + ActivePrintStatusText = totalPrintTimeText; + break; + + default: + string nextPrintLabelActive = LocalizedString.Get("Next Print"); + string nextPrintLabelActiveFull = string.Format("{0}: ", nextPrintLabelActive); + + activePrintLabel.Text = nextPrintLabelActiveFull; + ActivePrintStatusText = getConnectionMessage(); + break; + } + } + else + { + string nextPrintLabel = LocalizedString.Get("Next Print"); + string nextPrintLabelFull = string.Format("{0}:", nextPrintLabel); + + activePrintLabel.Text = nextPrintLabelFull; + ActivePrintStatusText = string.Format(LocalizedString.Get("Press 'Add' to choose an item to print")); + } + } + } } \ No newline at end of file diff --git a/ActionBar/PrinterActionRow.cs b/ActionBar/PrinterActionRow.cs index 5910781c1..b76ec4696 100644 --- a/ActionBar/PrinterActionRow.cs +++ b/ActionBar/PrinterActionRow.cs @@ -41,7 +41,6 @@ namespace MatterHackers.MatterControl.ActionBar { public class PrinterActionRow : ActionRowBase { - static private ConnectionWizard connectionWindow; private TextImageButtonFactory actionBarButtonFactory = new TextImageButtonFactory(); private Button connectPrinterButton; private string disconnectAndCancelMessage = "Disconnect and cancel the current print?".Localize(); @@ -60,19 +59,7 @@ namespace MatterHackers.MatterControl.ActionBar ActiveSliceSettings.ActivePrinterChanged.RegisterEvent(ConnectToActivePrinter, ref staticUnregisterEvents); } - if (connectionWindow == null) - { - connectionWindow = new ConnectionWizard(); - - connectionWindow.Closed += new EventHandler(ConnectionWindow_Closed); - } - else - { - if (connectionWindow != null) - { - connectionWindow.BringToFront(); - } - } + WizardWindow.Show(); } public override void OnClosed(EventArgs e) @@ -126,7 +113,7 @@ namespace MatterHackers.MatterControl.ActionBar selectActivePrinterButton = new PrinterSelector(); selectActivePrinterButton.HAnchor = HAnchor.ParentLeftRight; selectActivePrinterButton.Cursor = Cursors.Hand; - selectActivePrinterButton.AddPrinter += (s, e) => ConnectionWizard.Show(); + selectActivePrinterButton.AddPrinter += (s, e) => WizardWindow.Show(); if (ApplicationController.Instance.WidescreenMode) { selectActivePrinterButton.Margin = new BorderDouble(0, 6, 0, 3); @@ -214,10 +201,6 @@ namespace MatterHackers.MatterControl.ActionBar actionBarButtonFactory.borderWidth = 0; this.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; } - static private void ConnectionWindow_Closed(object sender, EventArgs e) - { - connectionWindow = null; - } static public void ConnectToActivePrinter(object sender, EventArgs e) { diff --git a/ApplicationView/MenuRow/MenuOptionFile.cs b/ApplicationView/MenuRow/MenuOptionFile.cs index dec64192d..5425a8d8e 100644 --- a/ApplicationView/MenuRow/MenuOptionFile.cs +++ b/ApplicationView/MenuRow/MenuOptionFile.cs @@ -34,7 +34,7 @@ namespace MatterHackers.MatterControl { return new List { - new MenuItemAction("Add Printer".Localize(), () => ConnectionWizard.Show()), + new MenuItemAction("Add Printer".Localize(), () => WizardWindow.Show()), new MenuItemAction("Add File To Queue".Localize(), importFile_Click), new MenuItemAction("Redeem Design Code".Localize(), () => RedeemDesignCode?.Invoke(this, null)), new MenuItemAction("Enter Share Code".Localize(), () => EnterShareCode?.Invoke(this, null)), diff --git a/MatterControl.csproj b/MatterControl.csproj index bb4c78554..1a9215571 100644 --- a/MatterControl.csproj +++ b/MatterControl.csproj @@ -245,6 +245,12 @@ + + + + + + @@ -329,7 +335,6 @@ - diff --git a/MatterControlApplication.cs b/MatterControlApplication.cs index e13fecb09..c5f120225 100644 --- a/MatterControlApplication.cs +++ b/MatterControlApplication.cs @@ -72,6 +72,11 @@ namespace MatterHackers.MatterControl private DataViewGraph msGraph; private string savePartsSheetExitAnywayMessage = "You are currently saving a parts sheet, are you sure you want to exit?".Localize(); private bool ShowMemoryUsed = false; + + public void ConfigureWifi() + { + } + private Stopwatch totalDrawTime = new Stopwatch(); #if true//!DEBUG @@ -798,5 +803,10 @@ namespace MatterHackers.MatterControl MatterHackers.MeshVisualizer.MeshViewerWidget.AssertDebugNotDefined(); MatterHackers.RenderOpenGl.GLMeshTrianglePlugin.AssertDebugNotDefined(); } + + public bool IsNetworkConnected() + { + return true; + } } } \ No newline at end of file diff --git a/PrinterControls/PrinterConnections/BaseConnectionWidget.cs b/PrinterControls/PrinterConnections/BaseConnectionWidget.cs index 35f23342e..1dd215aaf 100644 --- a/PrinterControls/PrinterConnections/BaseConnectionWidget.cs +++ b/PrinterControls/PrinterConnections/BaseConnectionWidget.cs @@ -37,17 +37,6 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections } } - public class BaudRateRadioButton : RadioButton - { - public int BaudRate; - - public BaudRateRadioButton(string label) - : base(label) - { - BaudRate = int.Parse(label); - } - } - public class PrinterSelectRadioButton : RadioButton { public PrinterInfo printer; @@ -242,7 +231,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections } } - public class ConnectionWidgetBase : GuiWidget + public class ConnectionWidgetBase : WizardPanel { private static Regex linuxDefaultUIFilter = new Regex("/dev/ttyS*\\d+", RegexOptions.CultureInvariant | RegexOptions.Compiled); protected List SerialPortButtonsList = new List(); @@ -273,11 +262,9 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections } } - protected ConnectionWizard connectionWizard; - - public ConnectionWidgetBase(ConnectionWizard wizard) + public ConnectionWidgetBase(WizardWindow wizard) + : base(wizard) { - this.connectionWizard = wizard; ActiveTheme.Instance.ThemeChanged.RegisterEvent((s,e) => this.Invalidate(), ref unregisterEvents); } diff --git a/PrinterControls/PrinterConnections/ConnectionWindow.cs b/PrinterControls/PrinterConnections/ConnectionWindow.cs deleted file mode 100644 index 8a2b3483b..000000000 --- a/PrinterControls/PrinterConnections/ConnectionWindow.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System; -using MatterHackers.Agg.UI; -using MatterHackers.Localizations; -using MatterHackers.MatterControl.DataStorage; -using MatterHackers.VectorMath; -using System.Collections.Generic; -using MatterHackers.Agg.PlatformAbstract; -using System.IO; -using MatterHackers.MatterControl.SlicerConfiguration; - -namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections -{ - public class ConnectionWizard : SystemWindow - { - protected PrinterInfo activePrinter; - private bool editMode = false; - - public ConnectionWizard() - : base(350 * GuiWidget.DeviceScale, 500 * GuiWidget.DeviceScale) - { - AlwaysOnTopOfMain = true; - string connectToPrinterTitle = LocalizedString.Get("MatterControl"); - string connectToPrinterTitleEnd = LocalizedString.Get("Connect to Printer"); - Title = string.Format("{0} - {1}", connectToPrinterTitle, connectToPrinterTitleEnd); - Name = "Printer Connection Window"; - - ChangeToAddPrinter(); - - BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; - - this.ShowAsSystemWindow(); - MinimumSize = new Vector2(350 * GuiWidget.DeviceScale, 400 * GuiWidget.DeviceScale); - } - - private static ConnectionWizard connectionWindow = null; - - public static void Show() - { - if (connectionWindow != null) - { - connectionWindow.BringToFront(); - } - else - { - connectionWindow = new ConnectionWizard(); - connectionWindow.Closed += (s, e) => connectionWindow = null; - } - } - - internal void ChangeToAddPrinter() - { - this.activePrinter = null; - ChangeToStep(new SetupStepMakeModelName(this)); - } - - private void ChangeToStep(GuiWidget nextStep) - { - UiThread.RunOnIdle(() => - { - this.RemoveAllChildren(); - this.AddChild(nextStep); - this.Invalidate(); - }); - } - - private int GetPrinterRecordCount() - { - return Datastore.Instance.RecordCount("Printer"); - } - - internal void ChangeToSetupBaudRate() - { - ChangeToStep(new SetupStepBaudRate(this)); - } - - internal void ChangeToInstallDriver() - { - ChangeToStep(new SetupStepInstallDriver(this)); - } - - internal void ChangeToSetupComPortOne() - { - ChangeToStep(new SetupStepComPortOne(this)); - } - - internal void ChangeToSetupCompPortTwo() - { - ChangeToStep(new SetupStepComPortTwo(this)); - } - - internal void ChangeToSetupComPortManual() - { - ChangeToStep(new SetupStepComPortManual(this)); - } - - internal void ChangeToInstallDriverOrComPortOne() - { - if (ActiveSliceSettings.Instance.PrinterDrivers().Count > 0) - { - ChangeToInstallDriver(); - } - else - { - ChangeToSetupComPortOne(); - } - } - - internal void ChangeToSetupBaudOrComPortOne() - { - if (string.IsNullOrEmpty(activePrinter.BaudRate)) - { - ChangeToSetupBaudRate(); - } - else - { - ChangeToSetupComPortOne(); - } - } - } -} \ No newline at end of file diff --git a/PrinterControls/PrinterConnections/SetupConnectionWidgetBase.cs b/PrinterControls/PrinterConnections/SetupConnectionWidgetBase.cs index 40dcb01f4..c49f6e3de 100644 --- a/PrinterControls/PrinterConnections/SetupConnectionWidgetBase.cs +++ b/PrinterControls/PrinterConnections/SetupConnectionWidgetBase.cs @@ -20,7 +20,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections protected TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory(); protected LinkButtonFactory linkButtonFactory = new LinkButtonFactory(); - public SetupConnectionWidgetBase(ConnectionWizard wizard) : base(wizard) + public SetupConnectionWidgetBase(WizardWindow wizard) : base(wizard) { SetDisplayAttributes(); @@ -75,7 +75,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections settings.SetName(ActivePrinter.Name); }); - UiThread.RunOnIdle(connectionWizard.Close); + UiThread.RunOnIdle(wizardWindow.Close); } private void SetDisplayAttributes() @@ -97,7 +97,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private void CancelButton_Click(object sender, EventArgs mouseEvent) { PrinterConnectionAndCommunication.Instance.HaltConnectionThread(); - UiThread.RunOnIdle(connectionWizard.Close); + UiThread.RunOnIdle(wizardWindow.Close); } } } \ No newline at end of file diff --git a/PrinterControls/PrinterConnections/SetupStepBaudRate.cs b/PrinterControls/PrinterConnections/SetupStepBaudRate.cs index f23416df8..244e2e03e 100644 --- a/PrinterControls/PrinterConnections/SetupStepBaudRate.cs +++ b/PrinterControls/PrinterConnections/SetupStepBaudRate.cs @@ -9,7 +9,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections { public class SetupStepBaudRate : SetupConnectionWidgetBase { - private List BaudRateButtonsList = new List(); + private List BaudRateButtonsList = new List(); private FlowLayoutWidget printerBaudRateContainer; private TextWidget printerBaudRateError; private GuiWidget baudRateWidget; @@ -19,7 +19,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private Button printerBaudRateHelpLink; private TextWidget printerBaudRateHelpMessage; - public SetupStepBaudRate(ConnectionWizard connectionWizard) : base(connectionWizard) + public SetupStepBaudRate(WizardWindow connectionWizard) : base(connectionWizard) { linkButtonFactory.fontSize = 8; @@ -100,7 +100,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections foreach (string baudRate in baudRates) { - BaudRateRadioButton baudOption = new BaudRateRadioButton(baudRate); + RadioButton baudOption = new RadioButton(baudRate); BaudRateButtonsList.Add(baudOption); baudOption.Margin = baudRateMargin; baudOption.TextColor = ActiveTheme.Instance.PrimaryTextColor; @@ -140,7 +140,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private void BindBaudRateHandlers() { otherBaudRateRadioButton.CheckedStateChanged += BindBaudRate_Select; - foreach (BaudRateRadioButton button in BaudRateButtonsList) + foreach (RadioButton button in BaudRateButtonsList) { button.CheckedStateChanged += BindBaudRate_Select; } @@ -161,7 +161,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private void MoveToNextWidget() { - connectionWizard.ChangeToInstallDriverOrComPortOne(); + wizardWindow.ChangeToInstallDriverOrComPortOne(); } private void NextButton_Click(object sender, EventArgs mouseEvent) @@ -211,11 +211,11 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private string GetSelectedBaudRate() { - foreach (BaudRateRadioButton button in BaudRateButtonsList) + foreach (RadioButton button in BaudRateButtonsList) { if (button.Checked) { - return button.BaudRate.ToString(); + return button.Text; } } if (otherBaudRateRadioButton.Checked) diff --git a/PrinterControls/PrinterConnections/SetupStepComPortManual.cs b/PrinterControls/PrinterConnections/SetupStepComPortManual.cs index e0f9aa421..8689da5c8 100644 --- a/PrinterControls/PrinterConnections/SetupStepComPortManual.cs +++ b/PrinterControls/PrinterConnections/SetupStepComPortManual.cs @@ -20,7 +20,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private event EventHandler unregisterEvents; - public SetupStepComPortManual(ConnectionWizard connectionWizard) : base(connectionWizard) + public SetupStepComPortManual(WizardWindow connectionWizard) : base(connectionWizard) { linkButtonFactory.fontSize = 8; @@ -125,7 +125,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private void MoveToNextWidget(object state) { - connectionWizard.ChangeToInstallDriverOrComPortOne(); + wizardWindow.ChangeToInstallDriverOrComPortOne(); } private void ConnectButton_Click(object sender, EventArgs mouseEvent) diff --git a/PrinterControls/PrinterConnections/SetupStepComPortOne.cs b/PrinterControls/PrinterConnections/SetupStepComPortOne.cs index 5fef29bb7..f2d0b50e7 100644 --- a/PrinterControls/PrinterConnections/SetupStepComPortOne.cs +++ b/PrinterControls/PrinterConnections/SetupStepComPortOne.cs @@ -11,7 +11,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections { private Button nextButton; - public SetupStepComPortOne(ConnectionWizard connectionWizard) : base(connectionWizard) + public SetupStepComPortOne(WizardWindow connectionWizard) : base(connectionWizard) { contentRow.AddChild(createPrinterConnectionMessageContainer()); { @@ -67,7 +67,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections Button manualLink = linkButtonFactory.Generate(LocalizedString.Get("Manually Configure Connection")); manualLink.Margin = new BorderDouble(0, 5); - manualLink.Click += (s, e) => connectionWizard.ChangeToSetupComPortManual(); + manualLink.Click += (s, e) => wizardWindow.ChangeToSetupComPortManual(); string printerMessageFourText = LocalizedString.Get("or"); TextWidget printerMessageFour = new TextWidget(printerMessageFourText, 0, 0, 10); diff --git a/PrinterControls/PrinterConnections/SetupStepComPortTwo.cs b/PrinterControls/PrinterConnections/SetupStepComPortTwo.cs index f5dfd148b..26c8c4c82 100644 --- a/PrinterControls/PrinterConnections/SetupStepComPortTwo.cs +++ b/PrinterControls/PrinterConnections/SetupStepComPortTwo.cs @@ -20,7 +20,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private event EventHandler unregisterEvents; - public SetupStepComPortTwo(ConnectionWizard windowController) : base(windowController) + public SetupStepComPortTwo(WizardWindow windowController) : base(windowController) { startingPortNames = FrostedSerialPort.GetPortNames(); contentRow.AddChild(createPrinterConnectionMessageContainer()); @@ -97,7 +97,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections Button manualLink = linkButtonFactory.Generate("Manual Configuration".Localize()); manualLink.Margin = new BorderDouble(0, 5); - manualLink.Click += (s, e) => connectionWizard.ChangeToSetupComPortManual(); + manualLink.Click += (s, e) => wizardWindow.ChangeToSetupComPortManual(); printerErrorMessage = new TextWidget("", 0, 0, 10); printerErrorMessage.AutoExpandBoundsToText = true; diff --git a/PrinterControls/PrinterConnections/SetupStepConfigureConnection.cs b/PrinterControls/PrinterConnections/SetupStepConfigureConnection.cs index e6ad997b8..a8a757bdc 100644 --- a/PrinterControls/PrinterConnections/SetupStepConfigureConnection.cs +++ b/PrinterControls/PrinterConnections/SetupStepConfigureConnection.cs @@ -36,7 +36,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections { public class SetupStepConfigureConnection : SetupConnectionWidgetBase { - public SetupStepConfigureConnection(ConnectionWizard connectionWizard) : base(connectionWizard) + public SetupStepConfigureConnection(WizardWindow connectionWizard) : base(connectionWizard) { BorderDouble elementMargin = new BorderDouble(top: 5); @@ -67,7 +67,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections //Construct buttons var nextButton = textImageButtonFactory.Generate("Connect"); - nextButton.Click += (s, e) => base.connectionWizard.ChangeToSetupBaudOrComPortOne(); + nextButton.Click += (s, e) => wizardWindow.ChangeToSetupBaudOrComPortOne(); var skipButton = textImageButtonFactory.Generate("Skip"); skipButton.Click += (s, e) => SaveAndExit(); diff --git a/PrinterControls/PrinterConnections/SetupStepInstallDriver.cs b/PrinterControls/PrinterConnections/SetupStepInstallDriver.cs index e5b288515..dfe165fca 100644 --- a/PrinterControls/PrinterConnections/SetupStepInstallDriver.cs +++ b/PrinterControls/PrinterConnections/SetupStepInstallDriver.cs @@ -19,7 +19,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private Button installButton; private Button skipButton; - public SetupStepInstallDriver(ConnectionWizard windowController) + public SetupStepInstallDriver(WizardWindow windowController) : base(windowController) { headerLabel.Text = string.Format(LocalizedString.Get("Install Communication Driver")); @@ -35,13 +35,13 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections bool canContinue = this.InstallDriver(); if (canContinue) { - connectionWizard.ChangeToSetupBaudOrComPortOne(); + wizardWindow.ChangeToSetupBaudOrComPortOne(); } }); }; skipButton = textImageButtonFactory.Generate(LocalizedString.Get("Skip")); - skipButton.Click += (s, e) => connectionWizard.ChangeToSetupBaudOrComPortOne(); + skipButton.Click += (s, e) => wizardWindow.ChangeToSetupBaudOrComPortOne(); //Add buttons to buttonContainer footerRow.AddChild(installButton); diff --git a/PrinterControls/PrinterConnections/SetupStepMakeModelName.cs b/PrinterControls/PrinterConnections/SetupStepMakeModelName.cs index 2ecdb796d..8e60854be 100644 --- a/PrinterControls/PrinterConnections/SetupStepMakeModelName.cs +++ b/PrinterControls/PrinterConnections/SetupStepMakeModelName.cs @@ -32,7 +32,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections private BoundDropList printerManufacturerSelector; private BoundDropList printerModelSelector; - public SetupStepMakeModelName(ConnectionWizard windowController) : base(windowController) + public SetupStepMakeModelName(WizardWindow windowController) : base(windowController) { var allManufacturers = StaticData.Instance.GetDirectories("PrinterSettings").Select(p => Path.GetFileName(p.TrimEnd(new[] { '/', '\\' }))); @@ -86,7 +86,8 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections bool canContinue = this.OnSave(); if (canContinue) { - UiThread.RunOnIdle(connectionWizard.Close); + wizardWindow.ChangeToSetupBaudRate(); + //UiThread.RunOnIdle(connectionWizard.Close); } }; diff --git a/SetupWizard/SetupWizardConnect.cs b/SetupWizard/SetupWizardConnect.cs new file mode 100644 index 000000000..85b2510a2 --- /dev/null +++ b/SetupWizard/SetupWizardConnect.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using MatterHackers.Agg; +using MatterHackers.Agg.PlatformAbstract; +using MatterHackers.Agg.UI; +using MatterHackers.Localizations; +using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling; +using MatterHackers.MatterControl.DataStorage; +using MatterHackers.MatterControl.CustomWidgets; +using MatterHackers.MatterControl.PrinterCommunication; +using MatterHackers.SerialPortCommunication.FrostedSerial; + +namespace MatterHackers.MatterControl +{ + //Normally step one of the setup process + public class SetupWizardConnect : WizardPanel + { + event EventHandler unregisterEvents; + + TextWidget generalError; + + Button connectButton; + Button skipButton; + Button nextButton; + Button retryButton; + Button troubleshootButton; + + TextWidget skipMessage; + + FlowLayoutWidget retryButtonContainer; + FlowLayoutWidget connectButtonContainer; + + public SetupWizardConnect(WizardWindow windowController) + : base(windowController) + { + string printerNameLabelTxt = LocalizedString.Get("Connect Your Device"); + string printerNameLabelTxtFull = string.Format ("{0}:", printerNameLabelTxt); + TextWidget printerNameLabel = new TextWidget(printerNameLabelTxtFull, 0, 0, labelFontSize); + printerNameLabel.TextColor = this.defaultTextColor; + printerNameLabel.Margin = new BorderDouble(bottom: 10); + + contentRow.AddChild(printerNameLabel); + + contentRow.AddChild(new TextWidget(LocalizedString.Get("Instructions:"), 0, 0, 12,textColor:ActiveTheme.Instance.PrimaryTextColor)); + contentRow.AddChild(new TextWidget(LocalizedString.Get("1. Power on your 3D Printer."), 0, 0, 12,textColor:ActiveTheme.Instance.PrimaryTextColor)); + contentRow.AddChild(new TextWidget(LocalizedString.Get("2. Attach your 3D Printer via USB."), 0, 0, 12,textColor:ActiveTheme.Instance.PrimaryTextColor)); + contentRow.AddChild(new TextWidget(LocalizedString.Get("3. Press 'Connect'."), 0, 0, 12,textColor:ActiveTheme.Instance.PrimaryTextColor)); + + //Add inputs to main container + PrinterConnectionAndCommunication.Instance.CommunicationStateChanged.RegisterEvent(communicationStateChanged, ref unregisterEvents); + + connectButtonContainer = new FlowLayoutWidget(); + connectButtonContainer.HAnchor = HAnchor.ParentLeftRight; + connectButtonContainer.Margin = new BorderDouble(0, 6); + + //Construct buttons + connectButton = whiteImageButtonFactory.Generate(LocalizedString.Get("Connect"),centerText:true); + connectButton.Margin = new BorderDouble(0,0,10,0); + connectButton.Click += new EventHandler(ConnectButton_Click); + + //Construct buttons + skipButton = whiteImageButtonFactory.Generate(LocalizedString.Get("Skip"), centerText:true); + skipButton.Click += new EventHandler(NextButton_Click); + + connectButtonContainer.AddChild(connectButton); + connectButtonContainer.AddChild(skipButton); + connectButtonContainer.AddChild(new HorizontalSpacer()); + + contentRow.AddChild(connectButtonContainer); + + skipMessage = new TextWidget(LocalizedString.Get("(Press 'Skip' to setup connection later)"), 0, 0, 10, textColor: ActiveTheme.Instance.PrimaryTextColor); + + contentRow.AddChild(skipMessage); + + generalError = new TextWidget("", 0, 0, errorFontSize); + generalError.TextColor = ActiveTheme.Instance.SecondaryAccentColor; + generalError.HAnchor = HAnchor.ParentLeftRight; + generalError.Visible = false; + generalError.Margin = new BorderDouble(top: 20); + + contentRow.AddChild(generalError); + + //Construct buttons + retryButton = whiteImageButtonFactory.Generate(LocalizedString.Get("Retry"), centerText:true); + retryButton.Click += new EventHandler(ConnectButton_Click); + retryButton.Margin = new BorderDouble(0,0,10,0); + + //Construct buttons + troubleshootButton = whiteImageButtonFactory.Generate(LocalizedString.Get("Troubleshoot"), centerText:true); + troubleshootButton.Click += new EventHandler(TroubleshootButton_Click); + + retryButtonContainer = new FlowLayoutWidget(); + retryButtonContainer.HAnchor = HAnchor.ParentLeftRight; + retryButtonContainer.Margin = new BorderDouble(0, 6); + retryButtonContainer.AddChild(retryButton); + retryButtonContainer.AddChild(troubleshootButton); + retryButtonContainer.AddChild(new HorizontalSpacer()); + retryButtonContainer.Visible = false; + + contentRow.AddChild(retryButtonContainer); + + //Construct buttons + nextButton = textImageButtonFactory.Generate(LocalizedString.Get("Continue")); + nextButton.Click += new EventHandler(NextButton_Click); + nextButton.Visible = false; + + GuiWidget hSpacer = new GuiWidget(); + hSpacer.HAnchor = HAnchor.ParentLeftRight; + + //Add buttons to buttonContainer + footerRow.AddChild(nextButton); + footerRow.AddChild(hSpacer); + footerRow.AddChild(cancelButton); + + updateControls(true); + } + + void ConnectButton_Click(object sender, EventArgs mouseEvent) + { + PrinterConnectionAndCommunication.Instance.ConnectToActivePrinter(); + } + + void TroubleshootButton_Click(object sender, EventArgs mouseEvent) + { + wizardWindow.ChangeToTroubleshooting(); + } + + void NextButton_Click(object sender, EventArgs mouseEvent) + { + this.generalError.Text = "Please wait..."; + this.generalError.Visible = true; + nextButton.Visible = false; + UiThread.RunOnIdle(this.wizardWindow.Close); + } + + private void communicationStateChanged(object sender, EventArgs args) + { + UiThread.RunOnIdle(() => updateControls(false)); + } + + private void updateControls(bool firstLoad) + { + connectButton.Visible = false; + skipMessage.Visible = false; + generalError.Visible = false; + nextButton.Visible = false; + + connectButtonContainer.Visible = false; + retryButtonContainer.Visible = false; + + if (PrinterConnectionAndCommunication.Instance.PrinterIsConnected) + { + generalError.Text = "{0}!".FormatWith ("Connection succeeded".Localize ()); + generalError.Visible = true; + nextButton.Visible = true; + } + else if (firstLoad || PrinterConnectionAndCommunication.Instance.CommunicationState == PrinterConnectionAndCommunication.CommunicationStates.Disconnected) + { + generalError.Text = ""; + connectButton.Visible = true; + connectButtonContainer.Visible = true; + } + else if (PrinterConnectionAndCommunication.Instance.CommunicationState == PrinterConnectionAndCommunication.CommunicationStates.AttemptingToConnect) + { + generalError.Text = "{0}...".FormatWith("Attempting to connect".Localize()); + generalError.Visible = true; + } + else + { + generalError.Text = "Uh-oh! Could not connect to printer.".Localize(); + generalError.Visible = true; + nextButton.Visible = false; + retryButtonContainer.Visible = true; + } + this.Invalidate(); + } + } +} diff --git a/SetupWizard/SetupWizardHome.cs b/SetupWizard/SetupWizardHome.cs new file mode 100644 index 000000000..8743366e9 --- /dev/null +++ b/SetupWizard/SetupWizardHome.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.ComponentModel; + +using MatterHackers.Agg; +using MatterHackers.Agg.PlatformAbstract; +using MatterHackers.Agg.UI; +using MatterHackers.Localizations; +using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling; +using MatterHackers.MatterControl.DataStorage; +using MatterHackers.MatterControl.CustomWidgets; +using MatterHackers.MatterControl.PrinterControls.PrinterConnections; +using MatterHackers.MatterControl.PrinterCommunication; +using MatterHackers.MatterControl.SlicerConfiguration; + +namespace MatterHackers.MatterControl +{ + //Normally step one of the setup process + public class SetupWizardHome : WizardPanel + { + TextImageButtonFactory setupButtonFactory = new TextImageButtonFactory(); + + Button addProfileButton; + Button editProfilesButton; + Button setupWifiButton; + Button troubleshootButton; + Button accountButton; + + public SetupWizardHome(WizardWindow windowController) + : base(windowController, unlocalizedTextForCancelButton: "Done") + { + headerLabel.Text = "Setup Options".Localize(); + SetButtonAttributes(); + + contentRow.AddChild(new SetupPrinterView(this.wizardWindow)); + contentRow.AddChild(new SetupAccountView(this.wizardWindow)); + + contentRow.AddChild(new EnterCodesView(this.wizardWindow)); + + GuiWidget hSpacer = new GuiWidget(); + hSpacer.HAnchor = HAnchor.ParentLeftRight; + + //Add buttons to buttonContainer + footerRow.AddChild(hSpacer); + footerRow.AddChild(cancelButton); + + cancelButton.Text = "Back".Localize(); + } + + private void SetButtonAttributes() + { + setupButtonFactory.normalTextColor = ActiveTheme.Instance.PrimaryTextColor; + setupButtonFactory.hoverTextColor = ActiveTheme.Instance.PrimaryTextColor; + setupButtonFactory.disabledTextColor = ActiveTheme.Instance.PrimaryTextColor; + setupButtonFactory.pressedTextColor = ActiveTheme.Instance.PrimaryTextColor; + setupButtonFactory.normalFillColor = ActiveTheme.Instance.PrimaryBackgroundColor; + setupButtonFactory.fontSize = 16; + setupButtonFactory.FixedWidth = 420; + setupButtonFactory.ImageSpacing = 20; + } + } + + public class EnterCodesView : SetupViewBase + { + public static EventHandler RedeemDesignCode; + public static EventHandler EnterShareCode; + + public EnterCodesView(WizardWindow windowController) + : base("", windowController) + { + FlowLayoutWidget buttonContainer = new FlowLayoutWidget(); + buttonContainer.HAnchor = HAnchor.ParentLeftRight; + buttonContainer.Margin = new BorderDouble(0, 14); + + mainContainer.AddChild(buttonContainer); + + if (ActiveTheme.Instance.IsTouchScreen) + { + // the redeem design code button + { + Button redeemPurchaseButton = textImageButtonFactory.Generate("Redeem Purchase".Localize()); + redeemPurchaseButton.Enabled = true; // The library selector (the first library selected) is protected so we can't add to it. + redeemPurchaseButton.Name = "Redeem Code Button"; + buttonContainer.AddChild(redeemPurchaseButton); + redeemPurchaseButton.Margin = new BorderDouble(0, 0, 10, 0); + redeemPurchaseButton.Click += (sender, e) => + { + if (RedeemDesignCode != null) + { + RedeemDesignCode(this, null); + } + }; + } + + // the redeem a share code button + { + Button redeemShareButton = textImageButtonFactory.Generate("Enter Share Code".Localize()); + redeemShareButton.Enabled = true; // The library selector (the first library selected) is protected so we can't add to it. + redeemShareButton.Name = "Enter Share Code"; + buttonContainer.AddChild(redeemShareButton); + redeemShareButton.Margin = new BorderDouble(0, 0, 3, 0); + redeemShareButton.Click += (sender, e) => + { + if (EnterShareCode != null) + { + EnterShareCode(this, null); + } + }; + } + } + } + } + + public class SetupPrinterView : SetupViewBase + { + Button disconnectButton; + + TextWidget connectionStatus; + + event EventHandler unregisterEvents; + + public SetupPrinterView(WizardWindow windowController) + : base("Printer Profile", windowController) + { + var buttonContainer = new FlowLayoutWidget() + { + HAnchor = HAnchor.ParentLeftRight, + Margin = new BorderDouble (0, 14) + }; + + var printerSelector = new PrinterSelector(); + printerSelector.AddPrinter += (s, e) => this.windowController.ChangeToSetupPrinterForm(); + buttonContainer.AddChild(printerSelector); + + disconnectButton = textImageButtonFactory.Generate("Disconnect"); + disconnectButton.Margin = new BorderDouble(left: 12); + disconnectButton.VAnchor = VAnchor.ParentCenter; + disconnectButton.Click += (sender, e) => + { + PrinterConnectionAndCommunication.Instance.Disable(); + windowController.ChangeToHome(); + }; + buttonContainer.AddChild(disconnectButton); + + mainContainer.AddChild(buttonContainer); + + connectionStatus = new TextWidget("Status:", pointSize: 12, textColor: ActiveTheme.Instance.PrimaryTextColor) + { + HAnchor = HAnchor.ParentLeftRight + }; + mainContainer.AddChild(connectionStatus); + + PrinterConnectionAndCommunication.Instance.CommunicationStateChanged.RegisterEvent(updateConnectedState, ref unregisterEvents); + updateConnectedState(null, null); + } + + private void updateConnectedState(object sender, EventArgs e) + { + if (disconnectButton != null) + { + disconnectButton.Visible = PrinterConnectionAndCommunication.Instance.PrinterIsConnected; + } + + if (connectionStatus != null) + { + connectionStatus.Text = string.Format ("{0}: {1}", "Status".Localize().ToUpper(), PrinterConnectionAndCommunication.Instance.PrinterConnectionStatusVerbose); + } + + this.Invalidate(); + } + } + + public class SetupAccountView : SetupViewBase + { + Button signInButton; + Button signOutButton; + event EventHandler unregisterEvents; + TextWidget statusMessage; + + public SetupAccountView(WizardWindow windowController) + : base("My Account", windowController) + { + bool signedIn = true; + string username = ApplicationController.Instance.GetSessionUsername(); + if (username == null) + { + signedIn = false; + username = "Not Signed In"; + } + + mainContainer.AddChild(new TextWidget(username, pointSize: 16, textColor: ActiveTheme.Instance.PrimaryTextColor)); + //mainContainer.AddChild(new TextWidget(statusDescription, pointSize: 12, textColor: ActiveTheme.Instance.PrimaryTextColor)); + + FlowLayoutWidget buttonContainer = new FlowLayoutWidget(); + buttonContainer.HAnchor = HAnchor.ParentLeftRight; + buttonContainer.Margin = new BorderDouble(0, 14); + + signInButton = textImageButtonFactory.Generate("Sign In"); + signInButton.Margin = new BorderDouble(left: 0); + signInButton.VAnchor = VAnchor.ParentCenter; + signInButton.Click += new EventHandler(signInButton_Click); + signInButton.Visible = !signedIn; + buttonContainer.AddChild(signInButton); + + signOutButton = textImageButtonFactory.Generate("Sign Out"); + signOutButton.Margin = new BorderDouble(left: 0); + signOutButton.VAnchor = VAnchor.ParentCenter; + signOutButton.Click += new EventHandler(signOutButton_Click); + signOutButton.Visible = signedIn; + + buttonContainer.AddChild(signOutButton); + + statusMessage = new TextWidget("Please wait...", pointSize: 12, textColor: ActiveTheme.Instance.SecondaryAccentColor); + statusMessage.Visible = false; + + buttonContainer.AddChild(statusMessage); + + mainContainer.AddChild(buttonContainer); + + ApplicationController.Instance.DoneReloadingAll.RegisterEvent(onDoneReloading, ref unregisterEvents); + + } + + void onDoneReloading(object sender, EventArgs e) + { + this.windowController.ChangeToHome(); + } + + void signInButton_Click(object sender, EventArgs e) + { + UiThread.RunOnIdle(() => + { + signInButton.Visible = false; + signOutButton.Visible = false; + statusMessage.Visible = true; + ApplicationController.Instance.StartLogin(); + }); + } + + void signOutButton_Click(object sender, EventArgs e) + { + UiThread.RunOnIdle(() => + { + signInButton.Visible = false; + signOutButton.Visible = false; + statusMessage.Visible = true; + ApplicationController.Instance.StartLogout(); + }); + } + } + + public class SetupViewBase : AltGroupBox + { + protected readonly int TallButtonHeight = 28; + protected TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory(); + protected LinkButtonFactory linkButtonFactory = new LinkButtonFactory(); + protected RGBA_Bytes separatorLineColor; + protected FlowLayoutWidget mainContainer; + protected WizardWindow windowController; + + public SetupViewBase(string title,WizardWindow windowController) + : base(title != "" ? new TextWidget(title, pointSize: 18, textColor: ActiveTheme.Instance.SecondaryAccentColor) : null) + { + this.windowController = windowController; + + SetDisplayAttributes(); + mainContainer = new FlowLayoutWidget(Agg.UI.FlowDirection.TopToBottom); + mainContainer.HAnchor = HAnchor.ParentLeftRight; + mainContainer.Margin = new BorderDouble(6,0,0,6); + AddChild(mainContainer); + } + + private void SetDisplayAttributes() + { + //this.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + this.separatorLineColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryTextColor, 100); + this.Margin = new BorderDouble(2, 10, 2, 0); + this.textImageButtonFactory.normalFillColor = RGBA_Bytes.Transparent; + this.textImageButtonFactory.disabledFillColor = RGBA_Bytes.White; + + this.textImageButtonFactory.FixedHeight = TallButtonHeight; + this.textImageButtonFactory.fontSize = 16; + this.textImageButtonFactory.borderWidth = 1; + this.textImageButtonFactory.normalBorderColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryTextColor, 200); + this.textImageButtonFactory.hoverBorderColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryTextColor, 200); + + this.textImageButtonFactory.disabledTextColor = RGBA_Bytes.DarkGray; + this.textImageButtonFactory.hoverTextColor = ActiveTheme.Instance.PrimaryTextColor; + this.textImageButtonFactory.normalTextColor = ActiveTheme.Instance.SecondaryTextColor; + this.textImageButtonFactory.pressedTextColor = ActiveTheme.Instance.PrimaryTextColor; + + this.linkButtonFactory.fontSize = 11; + } + } +} diff --git a/SetupWizard/SetupWizardTroubleshooting.cs b/SetupWizard/SetupWizardTroubleshooting.cs new file mode 100644 index 000000000..c95bef869 --- /dev/null +++ b/SetupWizard/SetupWizardTroubleshooting.cs @@ -0,0 +1,308 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using MatterHackers.Agg; +using MatterHackers.Agg.PlatformAbstract; +using MatterHackers.Agg.UI; +using MatterHackers.Localizations; +using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling; +using MatterHackers.MatterControl.DataStorage; +using MatterHackers.MatterControl.CustomWidgets; +using MatterHackers.MatterControl.PrinterCommunication; +using MatterHackers.SerialPortCommunication.FrostedSerial; +#if __ANDROID__ +using Com.Hoho.Android.Usbserial.Driver; +using Android.Hardware.Usb; +using Android.Content; +#endif + +namespace MatterHackers.MatterControl +{ + public class SetupWizardTroubleshooting : WizardPanel + { + private Button nextButton; + + private event EventHandler unregisterEvents; + + private CriteriaRow connectToPrinterRow; + +#if __ANDROID__ + private static UsbManager usbManager + { + get { return (UsbManager) Android.App.Application.Context.ApplicationContext.GetSystemService(Context.UsbService); } + } +#endif + + public SetupWizardTroubleshooting(WizardWindow windowController) + : base(windowController) + { + RefreshStatus(); + + //Construct buttons + cancelButton = whiteImageButtonFactory.Generate(LocalizedString.Get("Cancel"), centerText:true); + cancelButton.Click += (sender, e) => + { + this.wizardWindow.ChangeToPanel(new SetupWizardConnect(windowController)); + }; + + //Construct buttons + nextButton = textImageButtonFactory.Generate(LocalizedString.Get("Continue")); + nextButton.Click += (sender, e) => UiThread.RunOnIdle(this.wizardWindow.Close); + nextButton.Visible = false; + + //Add buttons to buttonContainer + footerRow.AddChild(nextButton); + footerRow.AddChild(new GuiWidget() { HAnchor = HAnchor.ParentLeftRight }); + footerRow.AddChild(cancelButton); + + // Register for connection notifications + PrinterConnectionAndCommunication.Instance.CommunicationStateChanged.RegisterEvent(ConnectionStatusChanged, ref unregisterEvents); + } + + public void ConnectionStatusChanged(object test, EventArgs args) + { + if(PrinterConnectionAndCommunication.Instance.CommunicationState == PrinterConnectionAndCommunication.CommunicationStates.Connected && connectToPrinterRow != null) + { + connectToPrinterRow.SetSuccessful(); + nextButton.Visible = true; + } + } + + public override void OnClosed(EventArgs e) + { + if (unregisterEvents != null) + { + unregisterEvents(this, null); + } + + if(checkForPermissionTimer != null) + { + checkForPermissionTimer.Dispose(); + } + + base.OnClosed(e); + } + + System.Threading.Timer checkForPermissionTimer; + + private void RefreshStatus() + { + CriteriaRow.ResetAll(); + + // Clear the main container + contentRow.CloseAllChildren(); + + // Regen and refresh the troubleshooting criteria + TextWidget printerNameLabel = new TextWidget(string.Format ("{0}:", "Connection Troubleshooting".Localize()), 0, 0, labelFontSize); + printerNameLabel.TextColor = this.defaultTextColor; + printerNameLabel.Margin = new BorderDouble(bottom: 10); + +#if __ANDROID__ + IUsbSerialPort serialPort = FrostedSerialPort.LoadSerialDriver(); + +#if ANDROID7 + // Filter out the built-in 002 device and select the first item from the list + // On the T7 Android device, there is a non-printer device always registered at usb/002/002 that must be ignored + UsbDevice usbPrintDevice = usbManager.DeviceList.Values.Where(d => d.DeviceName != "/dev/bus/usb/002/002").FirstOrDefault(); +#else + UsbDevice usbPrintDevice = usbManager.DeviceList.Values.FirstOrDefault(); +#endif + + UsbStatus usbStatus = new UsbStatus () { + IsDriverLoadable = (serialPort != null), + HasUsbDevice = true, + HasUsbPermission = false, + AnyUsbDeviceExists = usbPrintDevice != null + }; + + if (!usbStatus.IsDriverLoadable) + { + usbStatus.HasUsbDevice = usbPrintDevice != null; + + if (usbStatus.HasUsbDevice) { + // TODO: Testing specifically for UsbClass.Comm seems fragile but no better alternative exists without more research + usbStatus.UsbDetails = new UsbDeviceDetails () { + ProductID = usbPrintDevice.ProductId, + VendorID = usbPrintDevice.VendorId, + DriverClass = usbManager.DeviceList.Values.First ().DeviceClass == Android.Hardware.Usb.UsbClass.Comm ? "cdcDriverType" : "ftdiDriverType" + }; + usbStatus.Summary = string.Format ("No USB device definition found. Click the 'Fix' button to add an override for your device ", usbStatus.UsbDetails.VendorID, usbStatus.UsbDetails.ProductID); + } + } + + usbStatus.HasUsbPermission = usbStatus.IsDriverLoadable && FrostedSerialPort.HasPermissionToDevice(serialPort); + + contentRow.AddChild(printerNameLabel); + + contentRow.AddChild(new CriteriaRow( + "USB Connection", + "Retry", + "No USB device found. Check and reseat cables and try again", + usbStatus.AnyUsbDeviceExists, + () => UiThread.RunOnIdle(RefreshStatus))); + + contentRow.AddChild(new CriteriaRow( + "USB Driver", + "Fix", + usbStatus.Summary, + usbStatus.IsDriverLoadable, + () => { + string overridePath = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "data", "usboverride.local"); + UsbDeviceDetails usbDetails = usbStatus.UsbDetails; + File.AppendAllText(overridePath, string.Format("{0},{1},{2}\r\n", usbDetails.VendorID, usbDetails.ProductID, usbDetails.DriverClass)); + + UiThread.RunOnIdle(() => RefreshStatus()); + })); + + contentRow.AddChild(new CriteriaRow( + "USB Permission", + "Request Permission", + "Click the 'Request Permission' button to gain Android access rights", + usbStatus.HasUsbPermission , + () => { + + if(checkForPermissionTimer == null) + { + checkForPermissionTimer = new System.Threading.Timer((state) => { + + if(FrostedSerialPort.HasPermissionToDevice(serialPort)) + { + UiThread.RunOnIdle(this.RefreshStatus); + checkForPermissionTimer.Dispose(); + } + }, null, 200, 200); + } + + FrostedSerialPort.RequestPermissionToDevice(serialPort); + })); + +#endif + connectToPrinterRow = new CriteriaRow( + "Connect to Printer", + "Connect", + "Click the 'Connect' button to retry the original connection attempt", + false, + () => PrinterConnectionAndCommunication.Instance.ConnectToActivePrinter()); + + contentRow.AddChild(connectToPrinterRow); + + if (CriteriaRow.ActiveErrorItem != null) { + + FlowLayoutWidget errorText = new FlowLayoutWidget () { + Padding = new BorderDouble (0, 15) + }; + + errorText.AddChild(new TextWidget(CriteriaRow.ActiveErrorItem.ErrorText) { + TextColor = ActiveTheme.Instance.PrimaryAccentColor + }); + + contentRow.AddChild(errorText); + } + } + + private class CriteriaRow : FlowLayoutWidget + { + public static CriteriaRow ActiveErrorItem { get; private set; } + + public string ErrorText { get; private set; } + + private static bool stillSuccessful = true; + + private static int criteriaCount = 0; + + private static RGBA_Bytes disabledTextColor = new RGBA_Bytes(0.35, 0.35, 0.35); + private static RGBA_Bytes disabledBackColor = new RGBA_Bytes(0.22, 0.22, 0.22); + private static RGBA_Bytes toggleColor = new RGBA_Bytes(RGBA_Bytes.Gray.red + 2, RGBA_Bytes.Gray.green + 2, RGBA_Bytes.Gray.blue + 2); + + public CriteriaRow (string itemText, string fixitText, string errorText, bool succeeded, Action fixAction) :base(FlowDirection.LeftToRight, HAnchor.ParentLeftRight, VAnchor.AbsolutePosition) + { + TextImageButtonFactory buttonFactory = new TextImageButtonFactory(); + + ErrorText = errorText; + + base.Height = 40; + + base.AddChild(new TextWidget (string.Format(" {0}. {1}", criteriaCount + 1, itemText)){ + TextColor = stillSuccessful ? RGBA_Bytes.White : disabledTextColor, + VAnchor = VAnchor.ParentCenter + }); + + if(stillSuccessful && !succeeded) + { + ActiveErrorItem = this; + } + + base.AddChild(new HorizontalSpacer()); + + if(stillSuccessful) { + if(succeeded) + { + // Add checkmark image + AddSuccessIcon(); + } else { + // Add Fix button + Button button = buttonFactory.Generate(LocalizedString.Get(fixitText),centerText:true); + button.VAnchor = VAnchor.ParentCenter; + button.Padding = new BorderDouble(3, 8); + button.Click += (sender, e) => fixAction(); + base.AddChild(button); + } + } + + if(stillSuccessful) + { + this.BackgroundColor = (criteriaCount % 2 == 0) ? RGBA_Bytes.Gray : toggleColor; + } + else + { + this.BackgroundColor = disabledBackColor; + } + + stillSuccessful &= succeeded; + + criteriaCount++; + } + + public void SetSuccessful() + { + this.RemoveChild (this.Children.Last ()); + ActiveErrorItem = null; + AddSuccessIcon(); + } + + public static void ResetAll() + { + criteriaCount = 0; + stillSuccessful = true; + ActiveErrorItem = null; + } + + private void AddSuccessIcon() + { + base.AddChild (new ImageWidget (StaticData.Instance.LoadImage (Path.Combine ("Icons", "426.png"))) { + VAnchor = VAnchor.ParentCenter + }); + } + + } + + private class UsbStatus + { + public bool HasUsbDevice { get; set; } + public bool IsDriverLoadable { get; set; } + public string Summary { get; set; } + public bool HasUsbPermission { get; set; } + public bool AnyUsbDeviceExists { get ; set; } + public UsbDeviceDetails UsbDetails { get; set; } + } + + private class UsbDeviceDetails + { + public int VendorID { get; set; } + public int ProductID { get; set; } + public string DriverClass { get; set; } + } + } +} diff --git a/SetupWizard/SetupWizardWifi.cs b/SetupWizard/SetupWizardWifi.cs new file mode 100644 index 000000000..5b90912f1 --- /dev/null +++ b/SetupWizard/SetupWizardWifi.cs @@ -0,0 +1,88 @@ +/* +Copyright (c) 2016, Kevin Pope, 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 MatterHackers.Agg; +using MatterHackers.Agg.UI; +using MatterHackers.Localizations; +using MatterHackers.MatterControl.CustomWidgets; + +namespace MatterHackers.MatterControl +{ + //Normally step one of the setup process + public class SetupWizardWifi : WizardPanel + { + public SetupWizardWifi(WizardWindow windowController) + : base(windowController) + { + contentRow.AddChild(new TextWidget("Wifi Setup".Localize() + ":", 0, 0, labelFontSize) + { + TextColor = this.defaultTextColor, + Margin = new BorderDouble(bottom: 10) + }); + + contentRow.AddChild(new TextWidget("Some features may require an internet connection.".Localize(), 0, 0, 12, textColor: ActiveTheme.Instance.PrimaryTextColor)); + contentRow.AddChild(new TextWidget("Would you like to setup Wifi?".Localize(), 0, 0, 12, textColor: ActiveTheme.Instance.PrimaryTextColor)); + + var connectButtonContainer = new FlowLayoutWidget() + { + HAnchor = HAnchor.ParentLeftRight, + Margin = new BorderDouble(0, 6) + }; + + //Construct buttons + Button skipButton = whiteImageButtonFactory.Generate("Skip".Localize(), centerText: true); + skipButton.Click += (s, e) => this.wizardWindow.ChangeToSetupPrinterForm(); + + Button nextButton = textImageButtonFactory.Generate("Continue".Localize()); + nextButton.Click += (s, e) => this.wizardWindow.ChangeToSetupPrinterForm(); + nextButton.Visible = false; + + Button configureButton = whiteImageButtonFactory.Generate(LocalizedString.Get("Configure"), centerText: true); + configureButton.Margin = new BorderDouble(0, 0, 10, 0); + configureButton.Click += (s, e) => + { + nextButton.Visible = true; + skipButton.Visible = false; + configureButton.Visible = false; + MatterControlApplication.Instance.ConfigureWifi(); + }; + + connectButtonContainer.AddChild(configureButton); + connectButtonContainer.AddChild(skipButton); + connectButtonContainer.AddChild(new HorizontalSpacer()); + + contentRow.AddChild(connectButtonContainer); + + //Add buttons to buttonContainer + footerRow.AddChild(nextButton); + footerRow.AddChild(new HorizontalSpacer()); + footerRow.AddChild(cancelButton); + } + } +} diff --git a/SetupWizard/WizardPanel.cs b/SetupWizard/WizardPanel.cs new file mode 100644 index 000000000..28efb03fc --- /dev/null +++ b/SetupWizard/WizardPanel.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using MatterHackers.Agg; +using MatterHackers.Agg.PlatformAbstract; +using MatterHackers.Agg.UI; +using MatterHackers.Localizations; +using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling; +using MatterHackers.MatterControl.DataStorage; +using MatterHackers.MatterControl.PrinterCommunication; +using MatterHackers.MatterControl.SlicerConfiguration; + +namespace MatterHackers.MatterControl +{ + public class WizardPanel : GuiWidget + { + protected FlowLayoutWidget headerRow; + protected FlowLayoutWidget contentRow; + protected FlowLayoutWidget footerRow; + protected TextWidget headerLabel; + protected Button cancelButton; + protected TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory(); + protected TextImageButtonFactory whiteImageButtonFactory = new TextImageButtonFactory(); + protected LinkButtonFactory linkButtonFactory = new LinkButtonFactory(); + protected GuiWidget containerWindowToClose; + protected RGBA_Bytes defaultTextColor = ActiveTheme.Instance.PrimaryTextColor; + protected RGBA_Bytes defaultBackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + protected RGBA_Bytes subContainerTextColor = ActiveTheme.Instance.PrimaryTextColor; + protected RGBA_Bytes labelBackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + protected RGBA_Bytes linkTextColor = ActiveTheme.Instance.SecondaryAccentColor; + protected double labelFontSize = 12 * GuiWidget.DeviceScale; + protected double errorFontSize = 10 * GuiWidget.DeviceScale; + protected WizardWindow wizardWindow; + + event EventHandler unregisterEvents; + + public void ThemeChanged(object sender, EventArgs e) + { + this.linkTextColor = ActiveTheme.Instance.PrimaryAccentColor; + this.Invalidate(); + } + + public override void OnClosed(EventArgs e) + { + unregisterEvents?.Invoke(this, null); + base.OnClosed(e); + } + + PrinterInfo activePrinter; + public PrinterInfo ActivePrinter + { + get + { + if (activePrinter == null) + { + var settings = ActiveSliceSettings.Instance; + activePrinter = new PrinterInfo + { + AutoConnect = settings.DoAutoConnect(), + BaudRate = settings.BaudRate(), + ComPort = settings.ComPort(), + DriverType = settings.DriverType(), + Id = settings.ID, + Name = settings.Name() + }; + } + + return activePrinter; + } + } + + public WizardPanel(WizardWindow windowController, string unlocalizedTextForCancelButton = "Cancel") + : base() + { + this.wizardWindow = windowController; + this.textImageButtonFactory.fontSize = 16; + + SetWhiteButtonAttributes(); + + this.AnchorAll(); + + ActiveTheme.Instance.ThemeChanged.RegisterEvent(ThemeChanged, ref unregisterEvents); + + cancelButton = textImageButtonFactory.Generate(unlocalizedTextForCancelButton.Localize()); + cancelButton.Name = unlocalizedTextForCancelButton; + cancelButton.Click += new EventHandler(CancelButton_Click); + + //Create the main container + GuiWidget mainContainer = new FlowLayoutWidget(FlowDirection.TopToBottom); + mainContainer.AnchorAll(); + mainContainer.Padding = new BorderDouble(12, 12, 12, 0); + mainContainer.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + + //Create the header row for the widget + headerRow = new FlowLayoutWidget(FlowDirection.LeftToRight); + headerRow.Margin = new BorderDouble(0, 3, 0, 0); + headerRow.Padding = new BorderDouble(0, 12); + headerRow.HAnchor = HAnchor.ParentLeftRight; + { + string defaultHeaderTitle = "Setup Wizard".Localize(); + headerLabel = new TextWidget(defaultHeaderTitle, pointSize: 24, textColor: ActiveTheme.Instance.SecondaryAccentColor); + headerLabel.AutoExpandBoundsToText = true; + headerRow.AddChild(headerLabel); + } + + //Create the main control container + contentRow = new FlowLayoutWidget(FlowDirection.TopToBottom); + contentRow.Padding = new BorderDouble(10); + contentRow.BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor; + contentRow.HAnchor = HAnchor.ParentLeftRight; + contentRow.VAnchor = VAnchor.ParentBottomTop; + + //Create the footer (button) container + footerRow = new FlowLayoutWidget(FlowDirection.LeftToRight); + footerRow.HAnchor = HAnchor.ParentLeft | HAnchor.ParentRight; + footerRow.Margin = new BorderDouble(0, 6); + + mainContainer.AddChild(headerRow); + mainContainer.AddChild(contentRow); + mainContainer.AddChild(footerRow); + this.AddChild(mainContainer); + } + + protected void SaveAndExit() + { + throw new NotImplementedException(); + /* + this.ActivePrinter.Commit(); + ActivePrinterProfile.Instance.ActivePrinter = this.ActivePrinter; + this.containerWindowToClose.Close(); */ + + } + + void SetWhiteButtonAttributes() + { + whiteImageButtonFactory.normalFillColor = RGBA_Bytes.White; + whiteImageButtonFactory.disabledFillColor = RGBA_Bytes.White; + whiteImageButtonFactory.fontSize = 16; + whiteImageButtonFactory.borderWidth = 1; + + whiteImageButtonFactory.normalBorderColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryTextColor, 200); + whiteImageButtonFactory.hoverBorderColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryTextColor, 200); + + whiteImageButtonFactory.disabledTextColor = RGBA_Bytes.DarkGray; + whiteImageButtonFactory.hoverTextColor = ActiveTheme.Instance.PrimaryTextColor; + whiteImageButtonFactory.normalTextColor = RGBA_Bytes.Black; + whiteImageButtonFactory.pressedTextColor = ActiveTheme.Instance.PrimaryTextColor; + whiteImageButtonFactory.FixedWidth = 200; + } + + void CloseWindow(object o, EventArgs e) + { + PrinterConnectionAndCommunication.Instance.HaltConnectionThread(); + this.wizardWindow.Close(); + } + + void CancelButton_Click(object sender, EventArgs mouseEvent) + { + UiThread.RunOnIdle(() => + { + if (Parent != null) + { + Parent.Close(); + } + }); + } + } +} \ No newline at end of file diff --git a/SetupWizard/WizardWindow.cs b/SetupWizard/WizardWindow.cs new file mode 100644 index 000000000..1e9027b05 --- /dev/null +++ b/SetupWizard/WizardWindow.cs @@ -0,0 +1,226 @@ +using MatterHackers.Agg; +using MatterHackers.Agg.UI; +using MatterHackers.Localizations; +using MatterHackers.MatterControl.DataStorage; +using MatterHackers.MatterControl.PrinterControls.PrinterConnections; +using MatterHackers.MatterControl.SlicerConfiguration; +using MatterHackers.VectorMath; + +namespace MatterHackers.MatterControl +{ + public class WizardWindow : SystemWindow + { + private bool editMode = false; + protected PrinterInfo activePrinter; + + public WizardWindow(bool openToHome = false) + : base(500 * GuiWidget.DeviceScale, 500 * GuiWidget.DeviceScale) + { + AlwaysOnTopOfMain = true; + this.Title = "Setup Wizard".Localize(); + + if (openToHome) + { + ChangeToHome(); + } + else + { + //Todo - detect wifi connectivity + bool WifiDetected = MatterControlApplication.Instance.IsNetworkConnected(); + + if (!WifiDetected) + { + ChangeToWifiForm(); + } + else if (GetPrinterRecordCount() > 0) + { + ChangeToSetupPrinterForm(); + } + else + { + ChangeToSetupPrinterForm(); + } + } + + BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + this.Padding = new BorderDouble(8); + this.ShowAsSystemWindow(); + MinimumSize = new Vector2(350 * GuiWidget.DeviceScale, 400 * GuiWidget.DeviceScale); + } + + private static WizardWindow setupWizardWindow = null; + private static bool connectionWindowIsOpen = false; + + public static void Show(bool openToHome = false) + { + if (connectionWindowIsOpen == false) + { + setupWizardWindow = new WizardWindow(openToHome); + connectionWindowIsOpen = true; + setupWizardWindow.Closed += (parentSender, e) => + { + connectionWindowIsOpen = false; + setupWizardWindow = null; + }; + } + else + { + if (setupWizardWindow != null) + { + setupWizardWindow.BringToFront(); + } + } + } + + public override void OnMouseUp(MouseEventArgs mouseEvent) + { + base.OnMouseUp(mouseEvent); + } + + private void DoNotChangeWindow() + { + //Empty function used as default callback for changeToWindowCallback + } + + public void ChangeToSetupPrinterForm() + { + UiThread.RunOnIdle(DoChangeToSetupPrinterForm); + } + + private void DoChangeToSetupPrinterForm() + { + this.ChangeToAddPrinter(); + } + + public void ChangeToConnectForm(bool editMode = false) + { + this.editMode = editMode; + UiThread.RunOnIdle(DoChangeToConnectForm); + } + + public void DoChangeToConnectForm() + { + GuiWidget chooseConnectionWidget = new SetupWizardConnect(this); + this.RemoveAllChildren(); + this.AddChild(chooseConnectionWidget); + this.Invalidate(); + } + + public void ChangeToTroubleshooting() + { + UiThread.RunOnIdle(() => + { + GuiWidget wizardForm = new SetupWizardTroubleshooting(this); + this.RemoveAllChildren(); + this.AddChild(wizardForm); + this.Invalidate(); + }); + } + + public void ChangeToWifiForm(bool editMode = false) + { + this.editMode = editMode; + UiThread.RunOnIdle(DoChangeToWifiForm, null); + } + + public void ChangeToPanel(WizardPanel panelToChangeTo) + { + this.RemoveAllChildren(); + this.AddChild(panelToChangeTo); + this.Invalidate(); + } + + public void DoChangeToWifiForm(object state) + { + GuiWidget chooseConnectionWidget = new SetupWizardWifi(this); + this.RemoveAllChildren(); + this.AddChild(chooseConnectionWidget); + this.Invalidate(); + } + + public void ChangeToHome() + { + UiThread.RunOnIdle(DoChangeToHome, null); + } + + public void DoChangeToHome(object state) + { + GuiWidget homeWidget = new SetupWizardHome(this); + this.RemoveAllChildren(); + this.AddChild(homeWidget); + this.Invalidate(); + } + + private int GetPrinterRecordCount() + { + return Datastore.Instance.RecordCount("Printer"); + } + + + internal void ChangeToAddPrinter() + { + this.activePrinter = null; + ChangeToStep(new SetupStepMakeModelName(this)); + } + + private void ChangeToStep(GuiWidget nextStep) + { + UiThread.RunOnIdle(() => + { + this.RemoveAllChildren(); + this.AddChild(nextStep); + this.Invalidate(); + }); + } + + internal void ChangeToSetupBaudRate() + { + ChangeToStep(new SetupStepBaudRate(this)); + } + + internal void ChangeToInstallDriver() + { + ChangeToStep(new SetupStepInstallDriver(this)); + } + + internal void ChangeToSetupComPortOne() + { + ChangeToStep(new SetupStepComPortOne(this)); + } + + internal void ChangeToSetupCompPortTwo() + { + ChangeToStep(new SetupStepComPortTwo(this)); + } + + internal void ChangeToSetupComPortManual() + { + ChangeToStep(new SetupStepComPortManual(this)); + } + + internal void ChangeToInstallDriverOrComPortOne() + { + if (ActiveSliceSettings.Instance.PrinterDrivers().Count > 0) + { + ChangeToInstallDriver(); + } + else + { + ChangeToSetupComPortOne(); + } + } + + internal void ChangeToSetupBaudOrComPortOne() + { + if (string.IsNullOrEmpty(activePrinter.BaudRate)) + { + ChangeToSetupBaudRate(); + } + else + { + ChangeToSetupComPortOne(); + } + } + + } +} \ No newline at end of file diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/Master.txt index 27596f06a..3538ce063 100644 --- a/StaticData/Translations/Master.txt +++ b/StaticData/Translations/Master.txt @@ -4879,3 +4879,33 @@ Translated:The COM port to use while connecting to this printer. English:COM Port Translated:COM Port +English:Setup Wizard +Translated:Setup Wizard + +English:Setup Options +Translated:Setup Options + +English:Please wait. Generating printer profile +Translated:Please wait. Generating printer profile + +English:Connect Your Device +Translated:Connect Your Device + +English:Instructions: +Translated:Instructions: + +English:1. Power on your 3D Printer. +Translated:1. Power on your 3D Printer. + +English:2. Attach your 3D Printer via USB. +Translated:2. Attach your 3D Printer via USB. + +English:3. Press 'Connect'. +Translated:3. Press 'Connect'. + +English:(Press 'Skip' to setup connection later) +Translated:(Press 'Skip' to setup connection later) + +English:Troubleshoot +Translated:Troubleshoot + diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index e8c232b5e..935cac90b 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit e8c232b5ee5763e4168a527c05ad9ec9b4df2c86 +Subproject commit 935cac90bbc3c426e4ddcdcb693c193284bca1de