Improving updating of scene override rendering

This commit is contained in:
Lars Brubaker 2022-05-02 17:50:40 -07:00
parent e95df616f8
commit 82f13beec3
3 changed files with 60 additions and 18 deletions

View file

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

View file

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

@ -1 +1 @@
Subproject commit 365d3ed687c1502e0d5f12d36ae79b03b92ba9e0
Subproject commit 54c34975dc6d03cfab7875582256030810254d69