diff --git a/PartPreviewWindow/PrinterTabPage.cs b/PartPreviewWindow/PrinterTabPage.cs index f0334bb30..de1629ce9 100644 --- a/PartPreviewWindow/PrinterTabPage.cs +++ b/PartPreviewWindow/PrinterTabPage.cs @@ -74,6 +74,37 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Visible = true, Margin = new BorderDouble(11, 0, 0, 50) }; + viewControls3D.ViewModeChanged += (s, e) => + { + switch(e.ViewMode) + { + case PartViewMode.Layers2D: + UserSettings.Instance.set("LayerViewDefault", "2D Layer"); + if (gcodeViewer.gcode2DWidget != null) + { + gcodeViewer.gcode2DWidget.Visible = true; + + // HACK: Getting the Layer2D view to show content only works if CenterPartInView is called after the control is visible and after some cycles have passed + UiThread.RunOnIdle(gcodeViewer.gcode2DWidget.CenterPartInView); + } + this.SwitchToLayerView(); + break; + + case PartViewMode.Layers3D: + UserSettings.Instance.set("LayerViewDefault", "3D Layer"); + if (gcodeViewer.gcode2DWidget != null) + { + gcodeViewer.gcode2DWidget.Visible = false; + } + this.SwitchToLayerView(); + break; + + case PartViewMode.Model: + this.SwitchToModelView(); + break; + } + }; + viewControls3D.ResetView += (sender, e) => { modelViewer.meshViewerWidget.ResetView(); @@ -291,6 +322,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.ShowSliceLayers = true; } + public void SwitchToModelView() + { + this.ShowSliceLayers = false; + } + public void ToggleView() { this.ShowSliceLayers = !gcodeViewer.Visible; diff --git a/PartPreviewWindow/ViewControls3D.cs b/PartPreviewWindow/ViewControls3D.cs index 05cda45c9..c4561f428 100644 --- a/PartPreviewWindow/ViewControls3D.cs +++ b/PartPreviewWindow/ViewControls3D.cs @@ -54,6 +54,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public class ViewControls3D : ViewControlsBase { public event EventHandler ResetView; + public event EventHandler ViewModeChanged; + public event EventHandler TransformStateChanged; internal OverflowDropdown OverflowButton; @@ -180,17 +182,32 @@ namespace MatterHackers.MatterControl.PartPreviewWindow partSelectButton.Click += (s, e) => this.ActiveButton = ViewControls3DButtons.PartSelect; AddChild(partSelectButton); - iconPath = Path.Combine("ViewTransformControls", "layers.png"); - var layersButton = buttonFactory.Generate("", StaticData.Instance.LoadIcon(iconPath, 32, 32).InvertLightness()); - layersButton.Name = "Toggle Layer View Button"; - layersButton.ToolTipText = "Layers".Localize(); - layersButton.Margin = 3; - layersButton.Click += (s, e) => + iconPath = Path.Combine("ViewTransformControls", "model.png"); + var modelViewButton = buttonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath, 32, 32)); + modelViewButton.Name = "Model View Button"; + modelViewButton.ToolTipText = "Model".Localize(); + modelViewButton.Checked = true; + modelViewButton.Margin = 3; + modelViewButton.Click += SwitchModes_Click; + AddChild(modelViewButton); + + var layers3DButton = buttonFactory.GenerateRadioButton("", Path.Combine("ViewTransformControls", "3d.png")); + layers3DButton.Name = "Layers3D Button"; + layers3DButton.ToolTipText = "3D Layers".Localize(); + layers3DButton.Click += SwitchModes_Click; + layers3DButton.Margin = new BorderDouble(3); + + if (!UserSettings.Instance.IsTouchScreen) { - var parentTabPage = this.Parents().First(); - parentTabPage.ToggleView(); - }; - AddChild(layersButton); + this.AddChild(layers3DButton); + } + + var layers2DButton = buttonFactory.GenerateRadioButton("", Path.Combine("ViewTransformControls", "2d.png")); + layers2DButton.Name = "Layers2D Button"; + layers2DButton.ToolTipText = "2D Layers".Localize(); + layers2DButton.Margin = new BorderDouble(3); + layers2DButton.Click += SwitchModes_Click; + this.AddChild(layers2DButton); OverflowButton = new OverflowDropdown(allowLightnessInvert: false) { @@ -201,6 +218,32 @@ namespace MatterHackers.MatterControl.PartPreviewWindow AddChild(OverflowButton); } + private void SwitchModes_Click(object sender, MouseEventArgs e) + { + if (sender is GuiWidget widget) + { + PartViewMode viewMode; + + if (widget.Name == "Layers2D Button") + { + viewMode = PartViewMode.Layers2D; + } + else if (widget.Name == "Layers3D Button") + { + viewMode = PartViewMode.Layers3D; + } + else + { + viewMode = PartViewMode.Model; + } + + ViewModeChanged?.Invoke(this, new ViewModeChangedEventArgs() + { + ViewMode = viewMode + }); + } + } + public override void OnClosed(ClosedEventArgs e) { unregisterEvents?.Invoke(this, null); diff --git a/PartPreviewWindow/ViewGcodeBasic.cs b/PartPreviewWindow/ViewGcodeBasic.cs index 0e551a380..fc0efa3d2 100644 --- a/PartPreviewWindow/ViewGcodeBasic.cs +++ b/PartPreviewWindow/ViewGcodeBasic.cs @@ -45,11 +45,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public class ViewGcodeBasic : GuiWidget { private TextWidget gcodeProcessingStateInfoText; - private GCode2DWidget gcode2DWidget; + internal GCode2DWidget gcode2DWidget; private PrintItemWrapper printItem => ApplicationController.Instance.ActivePrintItem; - private ViewControlsToggle viewControlsToggle; - private GuiWidget gcodeDisplayWidget; private ColorGradientWidget gradientWidget; @@ -181,18 +179,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow gcode2DWidget.CenterPartInView(); } }; - - viewControlsToggle = new ViewControlsToggle(ApplicationController.Instance.Theme.ViewControlsButtonFactory, activeViewMode) - { - Visible = false, - HAnchor = HAnchor.ParentRight - }; - viewControlsToggle.ViewModeChanged += (s, e) => - { - // Respond to user driven view mode change events and store and switch to the new mode - activeViewMode = e.ViewMode; - SwitchViewModes(); - }; viewControls3D.TransformStateChanged += (s, e) => { switch (e.TransformMode) @@ -212,7 +198,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow break; } }; - this.AddChild(viewControlsToggle); // *************** AddGCodeFileControls *************** SetProcessingMessage(""); @@ -241,8 +226,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; AddChild(gradientWidget); - viewControlsToggle.Visible = true; - GCodeRenderer.ExtrusionColor = ActiveTheme.Instance.PrimaryAccentColor; var gcodeDetails = new GCodeDetails(this.loadedGCode); @@ -256,32 +239,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow VAnchor = VAnchor.ParentTop | VAnchor.FitToChildren, Width = 150 }); - - // Switch to the most recent view mode, defaulting to Layers3D - SwitchViewModes(); } } - private void SwitchViewModes() - { - bool inLayers3DMode = activeViewMode == PartViewMode.Layers3D; - if (inLayers3DMode) - { - UserSettings.Instance.set("LayerViewDefault", "3D Layer"); - } - else - { - UserSettings.Instance.set("LayerViewDefault", "2D Layer"); - - // HACK: Getting the Layer2D view to show content only works if CenterPartInView is called after the control is visible and after some cycles have passed - UiThread.RunOnIdle(gcode2DWidget.CenterPartInView); - } - - if (gcode2DWidget != null) - { - gcode2DWidget.Visible = !inLayers3DMode; - } - } internal void LoadProgress_Changed((double progress0To1, string processingState) progress, CancellationTokenSource continueProcessing) { diff --git a/StaticData/Icons/ViewTransformControls/model.png b/StaticData/Icons/ViewTransformControls/model.png new file mode 100644 index 000000000..1b1cbfa40 Binary files /dev/null and b/StaticData/Icons/ViewTransformControls/model.png differ diff --git a/StaticData/Icons/ViewTransformControls/reset.png b/StaticData/Icons/ViewTransformControls/reset.png index e1163079d..99725d4fc 100644 Binary files a/StaticData/Icons/ViewTransformControls/reset.png and b/StaticData/Icons/ViewTransformControls/reset.png differ