From f6ce9431b6374ef080a3733d7f0d7b75049fdb3a Mon Sep 17 00:00:00 2001 From: John Lewin Date: Wed, 9 May 2018 08:41:29 -0700 Subject: [PATCH] Move state from widget to model and revise persistence/init - Issue MatterHackers/MCCentral#3305 View style state not synced on load --- ApplicationView/PrinterModels.cs | 52 +++++++++++++++++++- PartPreviewWindow/ModelOptionsPanel.cs | 47 +++++++----------- PartPreviewWindow/PrinterTabPage.cs | 6 +-- PartPreviewWindow/View3D/MeshViewerWidget.cs | 28 ++--------- PartPreviewWindow/View3D/View3DWidget.cs | 17 +------ 5 files changed, 75 insertions(+), 75 deletions(-) diff --git a/ApplicationView/PrinterModels.cs b/ApplicationView/PrinterModels.cs index bcf648cea..1346fba37 100644 --- a/ApplicationView/PrinterModels.cs +++ b/ApplicationView/PrinterModels.cs @@ -54,6 +54,7 @@ namespace MatterHackers.MatterControl using MatterHackers.MatterControl.PrintLibrary; using MatterHackers.MeshVisualizer; using MatterHackers.PolygonMesh; + using MatterHackers.RenderOpenGl; using MatterHackers.VectorMath; public class BedConfig @@ -72,9 +73,12 @@ namespace MatterHackers.MatterControl public Mesh PrinterShape { get; private set; } + public SceneContextViewState ViewState { get; } + public BedConfig(PrinterConfig printer = null) { this.Printer = printer; + this.ViewState = new SceneContextViewState(this); } public async Task LoadContent(EditContext editContext) @@ -605,6 +609,52 @@ namespace MatterHackers.MatterControl public PrintLibraryWidget.ListViewModes LibraryViewMode { get; set; } = PrintLibraryWidget.ListViewModes.IconListView; } + public class SceneContextViewState + { + private BedConfig sceneContext; + private RenderTypes renderType = RenderTypes.Shaded; + + public SceneContextViewState(BedConfig sceneContext) + { + this.sceneContext = sceneContext; + + // Make sure the render mode is set correctly + string renderTypeString = UserSettings.Instance.get(UserSettingsKey.defaultRenderSetting); + if (renderTypeString == null) + { + renderTypeString = (UserSettings.Instance.IsTouchScreen) ? "Shaded" : "Outlines"; + UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, renderTypeString); + } + + if (Enum.TryParse(renderTypeString, out renderType)) + { + this.RenderType = renderType; + } + } + + public bool ModelView { get; set; } = true; + + public RenderTypes RenderType + { + get => this.ModelView ? renderType : RenderTypes.Wireframe; + set + { + if (renderType != value) + { + renderType = value; + + // Persist value + UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, renderType.ToString()); + + foreach (var renderTransfrom in sceneContext.Scene.VisibleMeshes()) + { + renderTransfrom.mesh.MarkAsChanged(); + } + } + } + } + } + public class PrinterViewState { public event EventHandler ViewModeChanged; @@ -760,7 +810,7 @@ namespace MatterHackers.MatterControl this.Connection.ReadLineReplacementString = this.Settings.GetValue(SettingsKey.read_regex); } - public PrinterViewState ViewState { get; } = new PrinterViewState(); + public PrinterViewState ViewState { get; } private PrinterSettings _settings; public PrinterSettings Settings diff --git a/PartPreviewWindow/ModelOptionsPanel.cs b/PartPreviewWindow/ModelOptionsPanel.cs index 35c9c5201..84d536c73 100644 --- a/PartPreviewWindow/ModelOptionsPanel.cs +++ b/PartPreviewWindow/ModelOptionsPanel.cs @@ -28,34 +28,20 @@ either expressed or implied, of the FreeBSD Project. */ using System.Collections.ObjectModel; -using MatterHackers.Agg; using MatterHackers.Agg.Platform; using MatterHackers.Agg.UI; using MatterHackers.Localizations; using MatterHackers.MatterControl.ConfigurationPage; using MatterHackers.MatterControl.CustomWidgets; -using MatterHackers.MeshVisualizer; using MatterHackers.RenderOpenGl; namespace MatterHackers.MatterControl.PartPreviewWindow { public class ModelOptionsPanel : FlowLayoutWidget { - private RadioIconButton shadedViewButton; - private RadioIconButton outlinesViewButton; - private RadioIconButton polygonsViewButton; - private RadioIconButton materialsViewButton; - private RadioIconButton overhangViewButton; - - public ModelOptionsPanel(BedConfig sceneContext, MeshViewerWidget meshViewerWidget, ThemeConfig theme) + public ModelOptionsPanel(BedConfig sceneContext, ThemeConfig theme) : base(FlowDirection.TopToBottom) { - void switchToRenderType(RenderTypes renderType) - { - meshViewerWidget.RenderType = renderType; - UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, renderType.ToString()); - } - var buttonPanel = new FlowLayoutWidget() { HAnchor = HAnchor.Fit, @@ -64,67 +50,68 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var buttonGroup = new ObservableCollection(); - shadedViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_shaded.png", theme.InvertIcons), theme) + var shadedViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_shaded.png", theme.InvertIcons), theme) { SiblingRadioButtonList = buttonGroup, Name = "Shaded Button", - Checked = meshViewerWidget.RenderType == RenderTypes.Shaded, + Checked = sceneContext.ViewState.RenderType == RenderTypes.Shaded, ToolTipText = "Shaded".Localize(), Margin = theme.ButtonSpacing }; - shadedViewButton.Click += (s, e) => switchToRenderType(RenderTypes.Shaded); + shadedViewButton.Click += (s, e) => sceneContext.ViewState.RenderType = RenderTypes.Shaded; buttonGroup.Add(shadedViewButton); buttonPanel.AddChild(shadedViewButton); - outlinesViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_outlines.png", theme.InvertIcons), theme) + + var outlinesViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_outlines.png", theme.InvertIcons), theme) { SiblingRadioButtonList = buttonGroup, Name = "Outlines Button", - Checked = meshViewerWidget.RenderType == RenderTypes.Outlines, + Checked = sceneContext.ViewState.RenderType == RenderTypes.Outlines, ToolTipText = "Outlines".Localize(), Margin = theme.ButtonSpacing }; - outlinesViewButton.Click += (s, e) => switchToRenderType(RenderTypes.Outlines); + outlinesViewButton.Click += (s, e) => sceneContext.ViewState.RenderType = RenderTypes.Outlines; buttonGroup.Add(outlinesViewButton); buttonPanel.AddChild(outlinesViewButton); - polygonsViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_polygons.png", theme.InvertIcons), theme) + var polygonsViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_polygons.png", theme.InvertIcons), theme) { SiblingRadioButtonList = buttonGroup, Name = "Polygons Button", - Checked = meshViewerWidget.RenderType == RenderTypes.Polygons, + Checked = sceneContext.ViewState.RenderType == RenderTypes.Polygons, ToolTipText = "Polygons".Localize(), Margin = theme.ButtonSpacing }; - polygonsViewButton.Click += (s, e) => switchToRenderType(RenderTypes.Polygons); + polygonsViewButton.Click += (s, e) => sceneContext.ViewState.RenderType = RenderTypes.Polygons; buttonGroup.Add(polygonsViewButton); buttonPanel.AddChild(polygonsViewButton); - materialsViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_materials.png"), theme) + var materialsViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_materials.png"), theme) { SiblingRadioButtonList = buttonGroup, Name = "Materials Button", - Checked = meshViewerWidget.RenderType == RenderTypes.Materials, + Checked = sceneContext.ViewState.RenderType == RenderTypes.Materials, ToolTipText = "Materials".Localize(), Margin = theme.ButtonSpacing }; - materialsViewButton.Click += (s, e) => switchToRenderType(RenderTypes.Materials); + materialsViewButton.Click += (s, e) => sceneContext.ViewState.RenderType = RenderTypes.Materials; buttonGroup.Add(materialsViewButton); buttonPanel.AddChild(materialsViewButton); - overhangViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_overhang.png"), theme) + var overhangViewButton = new RadioIconButton(AggContext.StaticData.LoadIcon("view_overhang.png"), theme) { SiblingRadioButtonList = buttonGroup, Name = "Overhang Button", - Checked = meshViewerWidget.RenderType == RenderTypes.Overhang, + Checked = sceneContext.ViewState.RenderType == RenderTypes.Overhang, ToolTipText = "Overhang".Localize(), Margin = theme.ButtonSpacing }; - overhangViewButton.Click += (s, e) => switchToRenderType(RenderTypes.Overhang); + overhangViewButton.Click += (s, e) => sceneContext.ViewState.RenderType = RenderTypes.Overhang; buttonGroup.Add(overhangViewButton); buttonPanel.AddChild(overhangViewButton); diff --git a/PartPreviewWindow/PrinterTabPage.cs b/PartPreviewWindow/PrinterTabPage.cs index df48aa051..bab0903f6 100644 --- a/PartPreviewWindow/PrinterTabPage.cs +++ b/PartPreviewWindow/PrinterTabPage.cs @@ -262,7 +262,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow gcode2DWidget.Visible = viewMode == PartViewMode.Layers2D; view3DWidget.meshViewerWidget.Visible = !gcode2DWidget.Visible; - view3DWidget.meshViewerWidget.ModelView = viewMode == PartViewMode.Model; + sceneContext.ViewState.ModelView = viewMode == PartViewMode.Model; gcodeContainer.Visible = viewMode != PartViewMode.Model; @@ -310,8 +310,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow bool hasLayers = printer.Bed.LoadedGCode?.LayerCount > 0; - layerRenderRatioSlider.Visible = hasLayers && !view3DWidget.meshViewerWidget.ModelView; - LayerScrollbar.Visible = hasLayers && !view3DWidget.meshViewerWidget.ModelView; + layerRenderRatioSlider.Visible = hasLayers && !sceneContext.ViewState.ModelView; + LayerScrollbar.Visible = hasLayers && !sceneContext.ViewState.ModelView; } } diff --git a/PartPreviewWindow/View3D/MeshViewerWidget.cs b/PartPreviewWindow/View3D/MeshViewerWidget.cs index eaf87138b..df573b080 100644 --- a/PartPreviewWindow/View3D/MeshViewerWidget.cs +++ b/PartPreviewWindow/View3D/MeshViewerWidget.cs @@ -163,8 +163,6 @@ namespace MatterHackers.MeshVisualizer // TODO: Need to be instance based for multi-printer public GuiWidget ParentSurface { get; set; } - private RenderTypes renderType = RenderTypes.Shaded; - private InteractionLayer interactionLayer; private BedConfig sceneContext; @@ -191,7 +189,6 @@ namespace MatterHackers.MeshVisualizer lastSelectionChangedMs = UiThread.CurrentTimerMs; }; - RenderType = RenderTypes.Shaded; BedColor = new ColorF(.8, .8, .8, .7).ToColor(); BuildVolumeColor = new ColorF(.2, .8, .3, .2).ToColor(); @@ -222,7 +219,6 @@ namespace MatterHackers.MeshVisualizer public event EventHandler LoadDone; public bool AllowBedRenderingWhenEmpty { get; set; } - public Color BedColor { get; set; } public Color BuildVolumeColor { get; set; } @@ -346,22 +342,6 @@ namespace MatterHackers.MeshVisualizer protected InteractiveScene scene { get; } - public RenderTypes RenderType - { - get => this.ModelView ? renderType : RenderTypes.Wireframe; - set - { - if (renderType != value) - { - renderType = value; - foreach(var renderTransfrom in scene.VisibleMeshes()) - { - renderTransfrom.mesh.MarkAsChanged(); - } - } - } - } - public static void AssertDebugNotDefined() { #if DEBUG @@ -446,8 +426,6 @@ namespace MatterHackers.MeshVisualizer base.OnClosed(e); } - public bool ModelView { get; set; } = true; - private void DrawObject(IObject3D object3D, List transparentMeshes, bool parentSelected, DrawEventArgs e) { foreach (var item in object3D.VisibleMeshes()) @@ -485,7 +463,7 @@ namespace MatterHackers.MeshVisualizer bool isDebugItem = (item.object3D == scene.DebugItem); - if (!this.ModelView) + if (!sceneContext.ViewState.ModelView) { if (modelRenderStyle == ModelRenderStyle.WireframeAndSolid) { @@ -502,7 +480,7 @@ namespace MatterHackers.MeshVisualizer || isDebugItem) { // Render as solid - GLHelper.Render(item.mesh, drawColor, item.object3D.WorldMatrix(), this.RenderType, item.object3D.WorldMatrix() * World.ModelviewMatrix, darkWireframe); + GLHelper.Render(item.mesh, drawColor, item.object3D.WorldMatrix(), sceneContext.ViewState.RenderType, item.object3D.WorldMatrix() * World.ModelviewMatrix, darkWireframe); } else if (drawColor != Color.Transparent) { @@ -604,7 +582,7 @@ namespace MatterHackers.MeshVisualizer } // check if we should be rendering materials (this overrides the other colors) - if (this.RenderType == RenderTypes.Materials) + if (sceneContext.ViewState.RenderType == RenderTypes.Materials) { drawColor = MaterialRendering.Color(item.WorldMaterialIndex()); } diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 58f76cb7f..9ecf34f61 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -164,7 +164,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow modelViewSidePanel.AddChild( new SectionWidget( "Options".Localize(), - new ModelOptionsPanel(sceneContext, meshViewerWidget, theme) + new ModelOptionsPanel(sceneContext, theme) { Margin = 0, Padding = new BorderDouble(2, 2, 2, 0), @@ -205,21 +205,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow viewControls3D.ActiveButton = ViewControls3DButtons.PartSelect; - // Make sure the render mode is set correctly - string renderTypeString = UserSettings.Instance.get(UserSettingsKey.defaultRenderSetting); - if (renderTypeString == null) - { - renderTypeString = (UserSettings.Instance.IsTouchScreen) ? "Shaded" : "Outlines"; - UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, renderTypeString); - } - - RenderTypes renderType; - bool canParse = Enum.TryParse(renderTypeString, out renderType); - if (canParse) - { - meshViewerWidget.RenderType = renderType; - } - this.InteractionLayer.DrawGlOpaqueContent += Draw_GlOpaqueContent; this.sceneContext.SceneLoaded += SceneContext_SceneLoaded;