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:
parent
f651026b15
commit
f6ce9431b6
5 changed files with 75 additions and 75 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue