Move state from widget to model and revise persistence/init

- Issue MatterHackers/MCCentral#3305
View style state not synced on load
This commit is contained in:
John Lewin 2018-05-09 08:41:29 -07:00
parent f651026b15
commit f6ce9431b6
5 changed files with 75 additions and 75 deletions

View file

@ -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<ViewModeChangedEventArgs> 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

View file

@ -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<GuiWidget>();
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);

View file

@ -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;
}
}

View file

@ -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<Object3DView> 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());
}

View file

@ -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;