diff --git a/MatterControlLib/ApplicationView/Config/PrinterConfig.cs b/MatterControlLib/ApplicationView/Config/PrinterConfig.cs index 9e512c439..e8a1db6af 100644 --- a/MatterControlLib/ApplicationView/Config/PrinterConfig.cs +++ b/MatterControlLib/ApplicationView/Config/PrinterConfig.cs @@ -40,6 +40,7 @@ using Newtonsoft.Json; using System.Linq; using MatterHackers.DataConverters3D; using MatterHackers.MatterControl.DesignTools.Operations; +using System.Collections.Generic; namespace MatterHackers.MatterControl { @@ -69,7 +70,8 @@ namespace MatterHackers.MatterControl private PrinterSettingsLayer sceneOverrides = new PrinterSettingsLayer(); - private bool watingToCheckSceneLayer; + private RunningInterval checkForSceneLayer; + private object locker = new object(); private PrinterSettingsLayer GetSceneLayer() { @@ -77,7 +79,7 @@ namespace MatterHackers.MatterControl if (scene != null) { var foundPartSettings = false; - var currentSceneOverrides = new PrinterSettingsLayer(); + var newSceneOverrides = 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)) { @@ -85,30 +87,72 @@ namespace MatterHackers.MatterControl var settings = ((PartSettingsObject3D)partSettingsObject).Overrides; foreach (var setting in settings) { - currentSceneOverrides[setting.Key] = setting.Value; + newSceneOverrides[setting.Key] = setting.Value; } } - var same = currentSceneOverrides.Count == sceneOverrides.Count && !currentSceneOverrides.Except(sceneOverrides).Any(); + var same = newSceneOverrides.Count == sceneOverrides.Count && !newSceneOverrides.Except(sceneOverrides).Any(); + // if settings count and keys the same, check the value of the settings + if (same && sceneOverrides.Count > 0) + { + // check each setting if it is the same + foreach (var kvp in newSceneOverrides) + { + if (sceneOverrides[kvp.Key] != newSceneOverrides[kvp.Key]) + { + same = false; + } + } + } // if they are different if (!same) { + var settingsToUpdate = new HashSet(); + foreach (var kvp in sceneOverrides) + { + settingsToUpdate.Add(kvp.Key); + } + foreach (var kvp in newSceneOverrides) + { + settingsToUpdate.Add(kvp.Key); + } + // store that current set - sceneOverrides = currentSceneOverrides; - // stash user overrides for all the values that are set - Settings.DeactivateConflictingUserOverrides(sceneOverrides); + sceneOverrides = newSceneOverrides; + + // we are about to update settings but they are stored in the scene not the profile so we don't have to save anything + var updateList = settingsToUpdate.ToList(); + ProfileManager.SaveOnSingleSettingChange = false; + for (int i = 0; i < updateList.Count; i++) + { + Settings.OnSettingChanged(updateList[i]); + } + ProfileManager.SaveOnSingleSettingChange = true; } - if (foundPartSettings && !watingToCheckSceneLayer) + if (foundPartSettings) { - watingToCheckSceneLayer = true; - UiThread.RunOnIdle(() => + lock (locker) { - watingToCheckSceneLayer = false; - GetSceneLayer(); - }, .5); + if (checkForSceneLayer == null) + { + checkForSceneLayer = UiThread.SetInterval(() => + { + GetSceneLayer(); + }, .5); + } + } } + else if (checkForSceneLayer != null) + { + lock (locker) + { + // we don't have a scene layer so remove the interval + UiThread.ClearInterval(checkForSceneLayer); + checkForSceneLayer = null; + } + } // return the current set return sceneOverrides; diff --git a/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs b/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs index 09e0f2558..f6f230bb0 100644 --- a/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs +++ b/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs @@ -471,13 +471,11 @@ namespace MatterHackers.MatterControl.SlicerConfiguration { var data = GetStyleData(printer, theme, settingsContext, settingData.SlicerConfigName, settingData.ShowAsOverride); - if (this.HighlightColor != data.highlightColor - && this.Parent != null) + if (this.HighlightColor != data.highlightColor) { this.HighlightColor = data.highlightColor; - // make sure the value is also updated - printer.Settings.OnSettingChanged(settingData.SlicerConfigName); } + if (restoreButton != null) { restoreButton.Visible = data.showRestoreButton; diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 365d3ed68..54c34975d 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 365d3ed687c1502e0d5f12d36ae79b03b92ba9e0 +Subproject commit 54c34975dc6d03cfab7875582256030810254d69