From 6b6ea0f97342e6a22613c7bbf074d4b0ffb525c9 Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 26 Nov 2022 22:59:24 +0100 Subject: [PATCH] Profiles - Fixed elements updating while disabled --- src/Artemis.Core/Models/Profile/Folder.cs | 39 +++++++---- src/Artemis.Core/Models/Profile/Layer.cs | 85 +++++++++++++---------- 2 files changed, 71 insertions(+), 53 deletions(-) diff --git a/src/Artemis.Core/Models/Profile/Folder.cs b/src/Artemis.Core/Models/Profile/Folder.cs index 363a5759b..e36c205fb 100644 --- a/src/Artemis.Core/Models/Profile/Folder.cs +++ b/src/Artemis.Core/Models/Profile/Folder.cs @@ -99,19 +99,26 @@ public sealed class Folder : RenderProfileElement return; } - UpdateDisplayCondition(); - UpdateTimeline(deltaTime); + try + { + UpdateDisplayCondition(); + UpdateTimeline(deltaTime); - if (ShouldBeEnabled) - Enable(); - else if (Timeline.IsFinished) - Disable(); + if (ShouldBeEnabled) + Enable(); + else if (Timeline.IsFinished) + Disable(); - foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => !e.Suspended)) - baseLayerEffect.InternalUpdate(Timeline); + foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => !e.Suspended)) + baseLayerEffect.InternalUpdate(Timeline); - foreach (ProfileElement child in Children) - child.Update(deltaTime); + foreach (ProfileElement child in Children) + child.Update(deltaTime); + } + finally + { + Timeline.ClearDelta(); + } } /// @@ -224,8 +231,6 @@ public sealed class Folder : RenderProfileElement canvas.Restore(); layerPaint.DisposeSelfAndProperties(); } - - Timeline.ClearDelta(); } #endregion @@ -233,8 +238,10 @@ public sealed class Folder : RenderProfileElement /// public override void Enable() { - // No checks here, effects will do their own checks to ensure they never enable twice - // Also not enabling children, they'll enable themselves during their own Update + if (!Enabled) + return; + + // Not enabling children, they'll enable themselves during their own Update foreach (BaseLayerEffect baseLayerEffect in LayerEffects) baseLayerEffect.InternalEnable(); @@ -244,7 +251,9 @@ public sealed class Folder : RenderProfileElement /// public override void Disable() { - // No checks here, effects will do their own checks to ensure they never disable twice + if (!Enabled) + return; + foreach (BaseLayerEffect baseLayerEffect in LayerEffects) baseLayerEffect.InternalDisable(); diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index beca25a7d..1ab84689b 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -40,7 +40,7 @@ public sealed class Layer : RenderProfileElement Suspended = false; Leds = new ReadOnlyCollection(_leds); Adapter = new LayerAdapter(this); - + Initialize(); } @@ -60,7 +60,7 @@ public sealed class Layer : RenderProfileElement Parent = parent; Leds = new ReadOnlyCollection(_leds); Adapter = new LayerAdapter(this); - + Load(); Initialize(); if (loadNodeScript) @@ -370,41 +370,48 @@ public sealed class Layer : RenderProfileElement return; } - UpdateDisplayCondition(); - UpdateTimeline(deltaTime); - - if (ShouldBeEnabled) - Enable(); - else if (Suspended || (Timeline.IsFinished && !_renderCopies.Any())) - Disable(); - - if (Timeline.Delta == TimeSpan.Zero) - return; - - General.Update(Timeline); - Transform.Update(Timeline); - LayerBrush?.InternalUpdate(Timeline); - - foreach (BaseLayerEffect baseLayerEffect in LayerEffects) + try { - if (!baseLayerEffect.Suspended) - baseLayerEffect.InternalUpdate(Timeline); + UpdateDisplayCondition(); + UpdateTimeline(deltaTime); + + if (ShouldBeEnabled) + Enable(); + else if (Suspended || (Timeline.IsFinished && !_renderCopies.Any())) + Disable(); + + if (!Enabled || Timeline.Delta == TimeSpan.Zero) + return; + + General.Update(Timeline); + Transform.Update(Timeline); + LayerBrush?.InternalUpdate(Timeline); + + foreach (BaseLayerEffect baseLayerEffect in LayerEffects) + { + if (!baseLayerEffect.Suspended) + baseLayerEffect.InternalUpdate(Timeline); + } + + // Remove render copies that finished their timeline and update the rest + for (int index = 0; index < _renderCopies.Count; index++) + { + Layer child = _renderCopies[index]; + if (!child.Timeline.IsFinished) + { + child.Update(deltaTime); + } + else + { + _renderCopies.Remove(child); + child.Dispose(); + index--; + } + } } - - // Remove render copies that finished their timeline and update the rest - for (int index = 0; index < _renderCopies.Count; index++) + finally { - Layer child = _renderCopies[index]; - if (!child.Timeline.IsFinished) - { - child.Update(deltaTime); - } - else - { - _renderCopies.Remove(child); - child.Dispose(); - index--; - } + Timeline.ClearDelta(); } } @@ -485,8 +492,6 @@ public sealed class Layer : RenderProfileElement { layerPaint.DisposeSelfAndProperties(); } - - Timeline.ClearDelta(); } private void RenderCopies(SKCanvas canvas, SKPointI basePosition) @@ -498,7 +503,9 @@ public sealed class Layer : RenderProfileElement /// public override void Enable() { - // No checks here, the brush and effects will do their own checks to ensure they never enable twice + if (Enabled) + return; + bool tryOrBreak = TryOrBreak(() => LayerBrush?.InternalEnable(), "Failed to enable layer brush"); if (!tryOrBreak) return; @@ -517,7 +524,9 @@ public sealed class Layer : RenderProfileElement /// public override void Disable() { - // No checks here, the brush and effects will do their own checks to ensure they never disable twice + if (!Enabled) + return; + LayerBrush?.InternalDisable(); foreach (BaseLayerEffect baseLayerEffect in LayerEffects) baseLayerEffect.InternalDisable();