diff --git a/MatterControlLib/ApplicationView/Config/PrinterConfig.cs b/MatterControlLib/ApplicationView/Config/PrinterConfig.cs index b0ca21fac..9e512c439 100644 --- a/MatterControlLib/ApplicationView/Config/PrinterConfig.cs +++ b/MatterControlLib/ApplicationView/Config/PrinterConfig.cs @@ -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; } diff --git a/MatterControlLib/DesignTools/Operations/PartSettingsObject3D.cs b/MatterControlLib/DesignTools/Operations/PartSettingsObject3D.cs index a4b73e3d9..53cd04692 100644 --- a/MatterControlLib/DesignTools/Operations/PartSettingsObject3D.cs +++ b/MatterControlLib/DesignTools/Operations/PartSettingsObject3D.cs @@ -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 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; diff --git a/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs b/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs index 03b778118..780898bc4 100644 --- a/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs +++ b/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs @@ -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; diff --git a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs index b10ba08a9..2d7117635 100644 --- a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs +++ b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs @@ -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) diff --git a/StaticData/Stls/part_settings.mcx b/StaticData/Stls/part_settings.mcx index e1deb2e95..61ec6663d 100644 Binary files a/StaticData/Stls/part_settings.mcx and b/StaticData/Stls/part_settings.mcx differ diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index a1708b040..ba51c5c12 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit a1708b04012fe859f1e42cabd8a23234f7912ef7 +Subproject commit ba51c5c12e8efa9adac7ab8e511bb2880041b198