Better updating of setting when part settings object on bed

This commit is contained in:
Lars Brubaker 2022-04-25 10:13:31 -07:00
parent b4aedf96d6
commit fbc19a8273
6 changed files with 94 additions and 17 deletions

View file

@ -69,15 +69,19 @@ namespace MatterHackers.MatterControl
private PrinterSettingsLayer sceneOverrides = new PrinterSettingsLayer();
private bool watingToCheckSceneLayer;
private PrinterSettingsLayer GetSceneLayer()
{
var scene = Bed?.Scene;
if (scene != null)
{
var foundPartSettings = false;
var currentSceneOverrides = new PrinterSettingsLayer();
// accumulate all the scene overrides ordered by their names, which is the order they will be in the design tree
foreach (var partSettingsObject in scene.DescendantsAndSelf().Where(c => c is PartSettingsObject3D).OrderBy(i => i.Name))
{
foundPartSettings = true;
var settings = ((PartSettingsObject3D)partSettingsObject).Overrides;
foreach (var setting in settings)
{
@ -96,6 +100,16 @@ namespace MatterHackers.MatterControl
Settings.DeactivateConflictingUserOverrides(sceneOverrides);
}
if (foundPartSettings && !watingToCheckSceneLayer)
{
watingToCheckSceneLayer = true;
UiThread.RunOnIdle(() =>
{
watingToCheckSceneLayer = false;
GetSceneLayer();
}, .5);
}
// return the current set
return sceneOverrides;
}

View file

@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project.
*/
using MatterHackers.Agg.Platform;
using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.SlicerConfiguration;
@ -47,6 +48,17 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
public PartSettingsObject3D()
{
Name = "Part Settings".Localize();
// Once we are done loading (json load will happen after creation)
// Make sure any settings are updated
UiThread.RunOnIdle(() =>
{
// check if the object is part of the scene (it could just be a memory copy)
if (Parent != null)
{
UpdateSettingsDisplay();
}
}, .5);
}
public PrinterSettingsLayer Overrides { get; set; } = new PrinterSettingsLayer();
@ -93,15 +105,22 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
public string ThumbnailName => nameof(PartSettingsObject3D);
private void UpdateSettingsDisplay(PrinterConfig containingPrinter)
private void UpdateSettingsDisplay()
{
var containingPrinter = this.ContainingPrinter();
if (containingPrinter != null)
{
this.Invalidate(InvalidateType.DisplayValues);
ApplicationController.Instance.ReloadSettings(containingPrinter);
// refresh the properties pannel by unselecting and selecting
containingPrinter.Bed.Scene.SelectedItem = null;
containingPrinter.Bed.Scene.SelectedItem = this;
// this will check if the current scene layer is the same as the last update
containingPrinter.Settings.GetSceneLayer();
// ApplicationController.Instance.ReloadSettings(containingPrinter);
if (containingPrinter.Bed.Scene.SelectedItem == this)
{
// refresh the properties pannel by unselecting and selecting
containingPrinter.Bed.Scene.SelectedItem = null;
containingPrinter.Bed.Scene.SelectedItem = this;
}
}
}
@ -137,6 +156,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
SettingsKey.bed_temperature_pp,
SettingsKey.inactive_cool_down,
SettingsKey.seconds_to_reheat,
SettingsKey.z_offset,
};
public IEnumerable<EditorButtonData> GetEditorButtonsData()
@ -149,13 +169,14 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
Action = () =>
{
var settingsContext = new SettingsContext(containingPrinter, null, NamedSettingsLayers.All);
foreach (var setting in containingPrinter.Settings.UserLayer)
foreach (var setting in containingPrinter.Settings.UserLayer.ToList())
{
var data = SliceSettingsRow.GetStyleData(containingPrinter, ApplicationController.Instance.Theme, settingsContext, setting.Key, true);
if (!settingsToIgnore.Contains(setting.Key)
&& data.showRestoreButton
&& SliceSettingsLayouts.ContainesKey(SliceSettingsLayouts.SliceSettings(), setting.Key))
&& SliceSettingsLayouts.ContainesKey(SliceSettingsLayouts.SliceSettings(), setting.Key)
&& SliceSettingsTabView.CheckIfShouldBeShown(PrinterSettings.SettingsData[setting.Key], settingsContext))
{
Overrides[setting.Key] = setting.Value;
}
@ -163,14 +184,15 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
foreach (var setting in Overrides.ToList())
{
if (!SliceSettingsLayouts.ContainesKey(SliceSettingsLayouts.SliceSettings(), setting.Key))
if (!SliceSettingsLayouts.ContainesKey(SliceSettingsLayouts.SliceSettings(), setting.Key)
|| !SliceSettingsTabView.CheckIfShouldBeShown(PrinterSettings.SettingsData[setting.Key], settingsContext))
{
Overrides.Remove(setting.Key);
}
}
UpdateSettingsDisplay(containingPrinter);
UpdateSettingsDisplay();
},
Name = "Add User Overrides".Localize(),
HelpText = "Copy in all current user overides".Localize()
@ -205,7 +227,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
editPartSettingsPresetsPage.Closed += (s, e2) =>
{
ApplicationController.Instance.AcitveSlicePresetsPage = null;
UpdateSettingsDisplay(containingPrinter);
UpdateSettingsDisplay();
};
ApplicationController.Instance.AcitveSlicePresetsPage = editPartSettingsPresetsPage;

View file

@ -471,7 +471,12 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
var data = GetStyleData(printer, theme, settingsContext, settingData.SlicerConfigName, settingData.ShowAsOverride);
this.HighlightColor = data.highlightColor;
if (this.HighlightColor != data.highlightColor)
{
this.HighlightColor = data.highlightColor;
// make sur the value is also updated
printer.Settings.OnSettingChanged(settingData.SlicerConfigName);
}
if (restoreButton != null)
{
restoreButton.Visible = data.showRestoreButton;

View file

@ -33,8 +33,10 @@ using System.Linq;
using System.Text.RegularExpressions;
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.CustomWidgets;
using MatterHackers.MatterControl.DesignTools.Operations;
using MatterHackers.MatterControl.Library.Widgets;
using MatterHackers.MatterControl.PartPreviewWindow;
using MatterHackers.VectorMath;
@ -47,11 +49,15 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
public SettingsContext SettingsContext { get; private set; }
public SliceSettingsWidget(PrinterConfig printer, SettingsContext settingsContext, ThemeConfig theme)
private readonly PrinterConfig printer;
public SliceSettingsWidget(PrinterConfig printer, SettingsContext settingsContext, ThemeConfig theme)
: base(FlowDirection.TopToBottom)
{
this.SettingsContext = settingsContext;
this.printer = printer;
settingsControlBar = new PresetsToolbar(printer, theme)
{
HAnchor = HAnchor.Stretch,
@ -90,11 +96,41 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
databaseMRUKey: UserSettingsKey.SliceSettingsWidget_CurrentTab));
}
var scene = printer?.Bed?.Scene;
if(scene != null)
{
scene.Invalidated += Scene_Invalidated;
this.Closed += (s, e) => scene.Invalidated -= Scene_Invalidated;
}
this.AnchorAll();
}
// TODO: This should just proxy to settingsControlBar.Visible. Having local state and pushing values on event listeners seems off
private bool showControlBar = true;
private bool foundPartSettingsObject;
private void Scene_Invalidated(object sender, DataConverters3D.InvalidateArgs e)
{
var scene = printer?.Bed?.Scene;
if (scene != null)
{
if (scene.DescendantsAndSelf().Where(c => c is PartSettingsObject3D).Any())
{
foundPartSettingsObject = true;
// if there is a a PartSettingsObject than make sure the settings dislpay is updates on changes
UpdateAllStyles();
}
else if (foundPartSettingsObject)
{
foundPartSettingsObject = false;
// we just delete the last one be sure we still update
UpdateAllStyles();
}
}
}
// TODO: This should just proxy to settingsControlBar.Visible. Having local state and pushing values on event listeners seems off
private bool showControlBar = true;
public bool ShowControlBar
{
@ -530,7 +566,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
base.OnLoad(args);
}
private static bool CheckIfShouldBeShown(SliceSettingData settingData, SettingsContext settingsContext)
public static bool CheckIfShouldBeShown(SliceSettingData settingData, SettingsContext settingsContext)
{
bool settingShouldBeShown = settingData.Show?.Invoke(settingsContext.Printer.Settings) != false;
if (settingsContext.ViewFilter == NamedSettingsLayers.Material || settingsContext.ViewFilter == NamedSettingsLayers.Quality || NamedSettingsLayers.Scene == settingsContext.ViewFilter)

Binary file not shown.

@ -1 +1 @@
Subproject commit a1708b04012fe859f1e42cabd8a23234f7912ef7
Subproject commit ba51c5c12e8efa9adac7ab8e511bb2880041b198