diff --git a/PartPreviewWindow/ViewControls2D.cs b/PartPreviewWindow/ViewControls2D.cs index 4ebda315c..7af0eb74b 100644 --- a/PartPreviewWindow/ViewControls2D.cs +++ b/PartPreviewWindow/ViewControls2D.cs @@ -83,43 +83,60 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } + public enum PartViewMode + { + Layers2D, + Layers3D, + Model + } + + public class ViewModeChangedEventArgs : EventArgs + { + public PartViewMode ViewMode { get; set; } + } + public class ViewControlsToggle : ViewControlsBase { - public RadioButton twoDimensionButton; - public RadioButton threeDimensionButton; + public event EventHandler ViewModeChanged; - private static bool userChangedTo3DThisRun = false; - - public ViewControlsToggle(TextImageButtonFactory buttonFactory) + public ViewControlsToggle(TextImageButtonFactory buttonFactory, PartViewMode initialViewMode) { this.BackgroundColor = new RGBA_Bytes(0, 0, 0, overlayAlpha); - twoDimensionButton = buttonFactory.GenerateRadioButton("", Path.Combine("ViewTransformControls", "2d.png")); - twoDimensionButton.Margin = new BorderDouble(3); - this.AddChild(twoDimensionButton); - - threeDimensionButton = buttonFactory.GenerateRadioButton("", Path.Combine("ViewTransformControls", "3d.png")); - threeDimensionButton.Margin = new BorderDouble(3); - threeDimensionButton.Click += (sender, e) => - { - userChangedTo3DThisRun = true; - }; + var layers2DButton = buttonFactory.GenerateRadioButton("", Path.Combine("ViewTransformControls", "2d.png")); + layers2DButton.Name = "Layers2D Button"; + layers2DButton.Margin = new BorderDouble(3); + layers2DButton.Click += SwitchModes_Click; + this.AddChild(layers2DButton); + var layers3DButton = buttonFactory.GenerateRadioButton("", Path.Combine("ViewTransformControls", "3d.png")); + layers3DButton.Click += SwitchModes_Click; + layers3DButton.Margin = new BorderDouble(3); + if (!UserSettings.Instance.IsTouchScreen) { - this.AddChild(threeDimensionButton); + this.AddChild(layers3DButton); - // Change to always start in 3D view - threeDimensionButton.Checked = true; + // Change to always start in 3D view on desktop + layers3DButton.Checked = initialViewMode == PartViewMode.Layers3D; } else { - twoDimensionButton.Checked = true; + layers2DButton.Checked = true; } this.Margin = new BorderDouble(5, 5, 200, 5); this.HAnchor |= HAnchor.ParentRight; this.VAnchor = VAnchor.ParentTop; } + + private void SwitchModes_Click(object sender, MouseEventArgs e) + { + var widget = sender as GuiWidget; + ViewModeChanged?.Invoke(this, new ViewModeChangedEventArgs() + { + ViewMode = widget.Name == "Layers2D Button" ? PartViewMode.Layers2D : PartViewMode.Layers3D + }); + } } } \ No newline at end of file diff --git a/PartPreviewWindow/ViewGcodeBasic.cs b/PartPreviewWindow/ViewGcodeBasic.cs index c72c97480..5fcc9f2a6 100644 --- a/PartPreviewWindow/ViewGcodeBasic.cs +++ b/PartPreviewWindow/ViewGcodeBasic.cs @@ -88,6 +88,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private BedShape bedShape; private int sliderWidth; + private PartViewMode activeViewMode = PartViewMode.Layers3D; + public ViewGcodeBasic(Vector3 viewerVolume, Vector2 bedCenter, BedShape bedShape, WindowMode windowMode, ViewControls3D viewControls3D) : base(viewControls3D) { @@ -140,12 +142,12 @@ namespace MatterHackers.MatterControl.PartPreviewWindow double buildHeight = ActiveSliceSettings.Instance.GetValue(SettingsKey.build_height); UiThread.RunOnIdle(() => - { - meshViewerWidget.CreatePrintBed( - viewerVolume, - bedCenter, - bedShape); - }); + { + meshViewerWidget.CreatePrintBed( + viewerVolume, + bedCenter, + bedShape); + }); } else if (stringEvent.Data == "extruder_offset") { @@ -300,15 +302,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow meshViewerWidget.AnchorAll(); meshViewerWidget.AllowBedRenderingWhenEmpty = true; gcodeDisplayWidget.AddChild(meshViewerWidget); + meshViewerWidget.Visible = (activeViewMode == PartViewMode.Layers3D); meshViewerWidget.TrackballTumbleWidget.DrawGlContent += new EventHandler(TrackballTumbleWidget_DrawGlContent); viewControls2D = new ViewControls2D(ApplicationController.Instance.Theme.ViewControlsButtonFactory); - viewControls2D.Visible = false; AddChild(viewControls2D); viewControls2D.ResetView += (sender, e) => { - SetDefaultView2D(); + gcodeViewWidget.CenterPartInView(); }; viewControls3D.ResetView += (sender, e) => @@ -318,15 +320,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow viewControls3D.ActiveButton = ViewControls3DButtons.Rotate; - viewControlsToggle = new ViewControlsToggle(ApplicationController.Instance.Theme.ViewControlsButtonFactory); - viewControlsToggle.HAnchor = Agg.UI.HAnchor.ParentRight; + viewControlsToggle = new ViewControlsToggle(ApplicationController.Instance.Theme.ViewControlsButtonFactory, activeViewMode); + viewControlsToggle.HAnchor = HAnchor.ParentRight; AddChild(viewControlsToggle); viewControlsToggle.Visible = false; - //viewControls3D.translateButton.ClickButton(null); - - //meshViewerWidget.ResetView(); - viewControls2D.translateButton.Click += (sender, e) => { gcodeViewWidget.TransformState = ViewGcodeWidget.ETransformState.Move; @@ -340,11 +338,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow expandDisplayOptions.CheckedStateChanged += expandDisplayOptions_CheckedStateChanged; } - private void SetDefaultView2D() - { - gcodeViewWidget.CenterPartInView(); - } - private RenderType GetRenderType() { RenderType renderType = RenderType.Extrusions; @@ -759,18 +752,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow layerInfoContainer.AddChild(hideExtruderOffsets); } - // put in a show 3D view checkbox + // Respond to user driven view mode change events and store and switch to the new mode + viewControlsToggle.ViewModeChanged += (s, e) => { - viewControlsToggle.twoDimensionButton.CheckedStateChanged += (sender, e) => - { - SetLayerViewType(); - }; - viewControlsToggle.threeDimensionButton.CheckedStateChanged += (sender, e) => - { - SetLayerViewType(); - }; - SetLayerViewType(); - } + activeViewMode = e.ViewMode; + SwitchViewModes(); + }; + + // Switch to the most recent view mode, defaulting to Layers3D + SwitchViewModes(); // Put in the sync to print checkbox if (windowMode == WindowMode.Embeded) @@ -838,24 +828,25 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } - private void SetLayerViewType() + private void SwitchViewModes() { - if (viewControlsToggle.threeDimensionButton.Checked) + bool inLayers3DMode = activeViewMode == PartViewMode.Layers3D; + if (inLayers3DMode) { UserSettings.Instance.set("LayerViewDefault", "3D Layer"); viewControls2D.Visible = false; - gcodeViewWidget.Visible = false; - - meshViewerWidget.Visible = true; } else { UserSettings.Instance.set("LayerViewDefault", "2D Layer"); viewControls2D.Visible = true; - gcodeViewWidget.Visible = true; - meshViewerWidget.Visible = false; + // 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(gcodeViewWidget.CenterPartInView); } + + meshViewerWidget.Visible = inLayers3DMode; + gcodeViewWidget.Visible = !inLayers3DMode; } private void HookUpGCodeMessagesWhenDonePrinting(object sender, EventArgs e) @@ -880,8 +871,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private GuiWidget CreateGCodeViewWidget(string pathAndFileName) { gcodeViewWidget = new ViewGcodeWidget(new Vector2(viewerVolume.x, viewerVolume.y), bedCenter); + gcodeViewWidget.DebugShowBounds = true; gcodeViewWidget.DoneLoading += DoneLoadingGCode; - gcodeViewWidget.Visible = false; + gcodeViewWidget.Visible = (activeViewMode == PartViewMode.Layers2D); gcodeViewWidget.LoadingProgressChanged += LoadingProgressChanged; partToStartLoadingOnFirstDraw = pathAndFileName; diff --git a/PartPreviewWindow/ViewGcodeWidget.cs b/PartPreviewWindow/ViewGcodeWidget.cs index d075b72b0..671a1b4ef 100644 --- a/PartPreviewWindow/ViewGcodeWidget.cs +++ b/PartPreviewWindow/ViewGcodeWidget.cs @@ -294,27 +294,21 @@ namespace MatterHackers.MatterControl.PartPreviewWindow GCodeRenderer.ExtruderWidth = .4; } - await Task.Run(() => DoPostLoadInitialization()); - - postLoadInitialization_RunWorkerCompleted(); - } - - public void DoPostLoadInitialization() - { - try + await Task.Run(() => { - gCodeRenderer.GCodeFileToDraw?.GetFilamentUsedMm(ActiveSliceSettings.Instance.GetValue(SettingsKey.filament_diameter)); - } - catch (Exception e) - { - Debug.Print(e.Message); - GuiWidget.BreakInDebugger(); - } - gCodeRenderer.CreateFeaturesForLayerIfRequired(0); - } + // DoPostLoadInitialization() + try + { + gCodeRenderer.GCodeFileToDraw?.GetFilamentUsedMm(ActiveSliceSettings.Instance.GetValue(SettingsKey.filament_diameter)); + } + catch (Exception ex) + { + Debug.Print(ex.Message); + GuiWidget.BreakInDebugger(); + } + gCodeRenderer.CreateFeaturesForLayerIfRequired(0); + }); - private void postLoadInitialization_RunWorkerCompleted() - { DoneLoading?.Invoke(this, null); } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index b12baa088..ae970cfbb 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit b12baa08882b7f340fde04e444af0fb60297adb0 +Subproject commit ae970cfbb150b27c195cbbc9d862297c540402d4