diff --git a/src/Artemis.Core/Models/Profile/Folder.cs b/src/Artemis.Core/Models/Profile/Folder.cs index 9557e3771..f240a61c6 100644 --- a/src/Artemis.Core/Models/Profile/Folder.cs +++ b/src/Artemis.Core/Models/Profile/Folder.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using Artemis.Core.LayerEffects; using Artemis.Storage.Entities.Profile; @@ -27,7 +28,6 @@ namespace Artemis.Core Parent = parent ?? throw new ArgumentNullException(nameof(parent)); Profile = Parent.Profile; Name = name; - Enabled = true; Parent.AddChild(this); } @@ -46,7 +46,7 @@ namespace Artemis.Core Profile = profile; Parent = parent; Name = folderEntity.Name; - Enabled = folderEntity.Enabled; + Suspended = folderEntity.Suspended; Order = folderEntity.Order; Load(); @@ -62,6 +62,9 @@ namespace Artemis.Core /// public FolderEntity FolderEntity { get; internal set; } + /// + public override bool ShouldBeEnabled => !Suspended && DisplayConditionMet && !Timeline.IsFinished; + internal override RenderElementEntity RenderElementEntity => FolderEntity; /// @@ -81,12 +84,14 @@ namespace Artemis.Core if (Disposed) throw new ObjectDisposedException("Folder"); - if (!Enabled) - return; - UpdateDisplayCondition(); UpdateTimeline(deltaTime); + if (ShouldBeEnabled) + Enable(); + else if (Timeline.IsFinished) + Disable(); + foreach (ProfileElement child in Children) child.Update(deltaTime); } @@ -175,16 +180,16 @@ namespace Artemis.Core throw new ObjectDisposedException("Folder"); // Ensure the folder is ready - if (!Enabled || !Children.Any(c => c.Enabled) || Path == null) + if (!Enabled || Path == null) return; - // No point rendering if none of the children are going to render - if (!Children.Any(c => c is RenderProfileElement renderElement && !renderElement.Timeline.IsFinished)) + // No point rendering if all children are disabled + if (!Children.Any(c => c is RenderProfileElement {Enabled: true})) return; lock (Timeline) { - foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => e.Enabled)) + foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => !e.Suspended)) { baseLayerEffect.BaseProperties?.Update(Timeline); baseLayerEffect.Update(Timeline.Delta.TotalSeconds); @@ -194,7 +199,7 @@ namespace Artemis.Core try { SKRectI rendererBounds = SKRectI.Create(0, 0, Bounds.Width, Bounds.Height); - foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => e.Enabled)) + foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => !e.Suspended)) baseLayerEffect.PreProcess(canvas, rendererBounds, layerPaint); canvas.SaveLayer(layerPaint); @@ -215,7 +220,7 @@ namespace Artemis.Core for (int index = Children.Count - 1; index > -1; index--) Children[index].Render(canvas, new SKPointI(Bounds.Left, Bounds.Top)); - foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => e.Enabled)) + foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => !e.Suspended)) baseLayerEffect.PostProcess(canvas, rendererBounds, layerPaint); } finally @@ -270,7 +275,7 @@ namespace Artemis.Core FolderEntity.Order = Order; FolderEntity.Name = Name; - FolderEntity.Enabled = Enabled; + FolderEntity.Suspended = Suspended; FolderEntity.ProfileId = Profile.EntityId; FolderEntity.ExpandedPropertyGroups.Clear(); @@ -279,6 +284,46 @@ namespace Artemis.Core SaveRenderElement(); } + /// + public override void Enable() + { + if (Enabled) + return; + + Debug.WriteLine($"Enabling {this}"); + + foreach (BaseLayerEffect baseLayerEffect in LayerEffects) + baseLayerEffect.InternalEnable(); + + foreach (ProfileElement profileElement in Children) + { + if (profileElement is RenderProfileElement renderProfileElement && renderProfileElement.ShouldBeEnabled) + renderProfileElement.Enable(); + } + + Enabled = true; + } + + /// + public override void Disable() + { + if (!Enabled) + return; + + Debug.WriteLine($"Disabled {this}"); + + foreach (BaseLayerEffect baseLayerEffect in LayerEffects) + baseLayerEffect.InternalDisable(); + + foreach (ProfileElement profileElement in Children) + { + if (profileElement is RenderProfileElement renderProfileElement) + renderProfileElement.Disable(); + } + + Enabled = false; + } + #region Events /// diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index 5e544e187..4ecf6298c 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.Linq; using Artemis.Core.LayerBrushes; using Artemis.Core.LayerEffects; @@ -35,7 +36,7 @@ namespace Artemis.Core Parent = parent ?? throw new ArgumentNullException(nameof(parent)); Profile = Parent.Profile; Name = name; - Enabled = true; + Suspended = false; _general = new LayerGeneralProperties(); _transform = new LayerTransformProperties(); @@ -120,6 +121,9 @@ namespace Artemis.Core /// public LayerEntity LayerEntity { get; internal set; } + /// + public override bool ShouldBeEnabled => !Suspended && DisplayConditionMet; + internal override RenderElementEntity RenderElementEntity => LayerEntity; /// @@ -192,7 +196,7 @@ namespace Artemis.Core { EntityId = LayerEntity.Id; Name = LayerEntity.Name; - Enabled = LayerEntity.Enabled; + Suspended = LayerEntity.Suspended; Order = LayerEntity.Order; ExpandedPropertyGroups.AddRange(LayerEntity.ExpandedPropertyGroups); @@ -208,7 +212,7 @@ namespace Artemis.Core LayerEntity.Id = EntityId; LayerEntity.ParentId = Parent?.EntityId ?? new Guid(); LayerEntity.Order = Order; - LayerEntity.Enabled = Enabled; + LayerEntity.Suspended = Suspended; LayerEntity.Name = Name; LayerEntity.ProfileId = Profile.EntityId; LayerEntity.ExpandedPropertyGroups.Clear(); @@ -262,11 +266,13 @@ namespace Artemis.Core if (Disposed) throw new ObjectDisposedException("Layer"); - if (!Enabled) - return; - UpdateDisplayCondition(); UpdateTimeline(deltaTime); + + if (ShouldBeEnabled) + Enable(); + else if (Timeline.IsFinished) + Disable(); } /// @@ -295,6 +301,36 @@ namespace Artemis.Core Timeline.ClearDelta(); } + /// + public override void Enable() + { + if (Enabled) + return; + + Debug.WriteLine($"Enabling {this}"); + + LayerBrush?.InternalEnable(); + foreach (BaseLayerEffect baseLayerEffect in LayerEffects) + baseLayerEffect.InternalEnable(); + + Enabled = true; + } + + /// + public override void Disable() + { + if (!Enabled) + return; + + Debug.WriteLine($"Disabling {this}"); + + LayerBrush?.InternalDisable(); + foreach (BaseLayerEffect baseLayerEffect in LayerEffects) + baseLayerEffect.InternalDisable(); + + Enabled = false; + } + private void ApplyTimeline(Timeline timeline) { if (timeline.Delta == TimeSpan.Zero) @@ -308,7 +344,7 @@ namespace Artemis.Core LayerBrush.Update(timeline.Delta.TotalSeconds); } - foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => e.Enabled)) + foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => !e.Suspended)) { baseLayerEffect.BaseProperties?.Update(timeline); baseLayerEffect.Update(timeline.Delta.TotalSeconds); @@ -387,7 +423,7 @@ namespace Artemis.Core if (LayerBrush == null) throw new ArtemisCoreException("The layer is not yet ready for rendering"); - foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => e.Enabled)) + foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => !e.Suspended)) baseLayerEffect.PreProcess(canvas, bounds, layerPaint); try @@ -398,7 +434,7 @@ namespace Artemis.Core canvas.ClipPath(renderPath); LayerBrush.InternalRender(canvas, bounds, layerPaint); - foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => e.Enabled)) + foreach (BaseLayerEffect baseLayerEffect in LayerEffects.Where(e => !e.Suspended)) baseLayerEffect.PostProcess(canvas, bounds, layerPaint); } diff --git a/src/Artemis.Core/Models/Profile/Profile.cs b/src/Artemis.Core/Models/Profile/Profile.cs index 8f3cf81a9..09e1dc62e 100644 --- a/src/Artemis.Core/Models/Profile/Profile.cs +++ b/src/Artemis.Core/Models/Profile/Profile.cs @@ -196,7 +196,7 @@ namespace Artemis.Core ProfileEntity.Layers.Clear(); ProfileEntity.Layers.AddRange(GetAllLayers().Select(f => f.LayerEntity)); } - + internal void Activate(IEnumerable devices) { lock (_lock) diff --git a/src/Artemis.Core/Models/Profile/ProfileElement.cs b/src/Artemis.Core/Models/Profile/ProfileElement.cs index a88d13f8e..39006fb85 100644 --- a/src/Artemis.Core/Models/Profile/ProfileElement.cs +++ b/src/Artemis.Core/Models/Profile/ProfileElement.cs @@ -11,7 +11,7 @@ namespace Artemis.Core /// public abstract class ProfileElement : CorePropertyChanged, IDisposable { - private bool _enabled; + private bool _suspended; private Guid _entityId; private string? _name; private int _order; @@ -87,12 +87,12 @@ namespace Artemis.Core } /// - /// Gets or sets the enabled state, if not enabled the element is skipped in render and update + /// Gets or sets the suspended state, if suspended the element is skipped in render and update /// - public bool Enabled + public bool Suspended { - get => _enabled; - set => SetAndNotify(ref _enabled, value); + get => _suspended; + set => SetAndNotify(ref _suspended, value); } /// diff --git a/src/Artemis.Core/Models/Profile/RenderProfileElement.cs b/src/Artemis.Core/Models/Profile/RenderProfileElement.cs index c2c967c54..f5df222be 100644 --- a/src/Artemis.Core/Models/Profile/RenderProfileElement.cs +++ b/src/Artemis.Core/Models/Profile/RenderProfileElement.cs @@ -16,9 +16,9 @@ namespace Artemis.Core /// public abstract class RenderProfileElement : ProfileElement { - private SKPath? _path; private SKRectI _bounds; - + private SKPath? _path; + internal RenderProfileElement(Profile profile) : base(profile) { Timeline = new Timeline(); @@ -29,13 +29,26 @@ namespace Artemis.Core LayerEffectStore.LayerEffectRemoved += LayerEffectStoreOnLayerEffectRemoved; } + /// + /// Gets a boolean indicating whether this render element and its layers/brushes are enabled + /// + public bool Enabled { get; protected set; } + + /// + /// Gets a boolean indicating whether this render element and its layers/brushes should be enabled + /// + public abstract bool ShouldBeEnabled { get; } + /// /// Creates a list of all layer properties present on this render element /// /// A list of all layer properties present on this render element public abstract List GetAllLayerProperties(); - #region IDisposable + /// + /// Occurs when a layer effect has been added or removed to this render element + /// + public event EventHandler? LayerEffectsUpdated; /// protected override void Dispose(bool disposing) @@ -49,8 +62,6 @@ namespace Artemis.Core base.Dispose(disposing); } - #endregion - internal void LoadRenderElement() { DisplayCondition = RenderElementEntity.DisplayCondition != null @@ -75,7 +86,7 @@ namespace Artemis.Core ProviderId = layerEffect.Descriptor?.PlaceholderFor ?? layerEffect.ProviderId, EffectType = layerEffect.GetEffectTypeName(), Name = layerEffect.Name, - Enabled = layerEffect.Enabled, + Suspended = layerEffect.Suspended, HasBeenRenamed = layerEffect.HasBeenRenamed, Order = layerEffect.Order }; @@ -92,6 +103,11 @@ namespace Artemis.Core Timeline?.Save(); } + internal void OnLayerEffectsUpdated() + { + LayerEffectsUpdated?.Invoke(this, EventArgs.Empty); + } + #region Timeline /// @@ -160,7 +176,7 @@ namespace Artemis.Core #region Property group expansion internal List ExpandedPropertyGroups; - + /// /// Determines whether the provided property group is expanded /// @@ -188,6 +204,20 @@ namespace Artemis.Core #endregion + #region State + + /// + /// Enables the render element and its brushes and effects + /// + public abstract void Disable(); + + /// + /// Disables the render element and its brushes and effects + /// + public abstract void Enable(); + + #endregion + #region Effect management internal List LayerEffectsList; @@ -208,7 +238,7 @@ namespace Artemis.Core LayerEffectEntity entity = new() { Id = Guid.NewGuid(), - Enabled = true, + Suspended = false, Order = LayerEffects.Count + 1 }; descriptor.CreateInstance(this, entity); @@ -338,6 +368,12 @@ namespace Artemis.Core /// public void UpdateDisplayCondition() { + if (Suspended) + { + DisplayConditionMet = false; + return; + } + if (DisplayCondition == null) { DisplayConditionMet = true; @@ -381,19 +417,5 @@ namespace Artemis.Core } #endregion - - #region Events - - /// - /// Occurs when a layer effect has been added or removed to this render element - /// - public event EventHandler? LayerEffectsUpdated; - - internal void OnLayerEffectsUpdated() - { - LayerEffectsUpdated?.Invoke(this, EventArgs.Empty); - } - - #endregion } } \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/LayerBrushes/Internal/BaseLayerBrush.cs b/src/Artemis.Core/Plugins/LayerBrushes/Internal/BaseLayerBrush.cs index 2e1712250..8f63b16b9 100644 --- a/src/Artemis.Core/Plugins/LayerBrushes/Internal/BaseLayerBrush.cs +++ b/src/Artemis.Core/Plugins/LayerBrushes/Internal/BaseLayerBrush.cs @@ -82,6 +82,11 @@ namespace Artemis.Core.LayerBrushes /// public virtual ILayerBrushPreset? DefaultPreset => Presets?.FirstOrDefault(); + /// + /// Gets a boolean indicating whether the layer brush is enabled or not + /// + public bool Enabled { get; private set; } + /// /// Gets or sets whether the brush supports transformations /// Note: RGB.NET brushes can never be transformed and setting this to true will throw an exception @@ -113,14 +118,6 @@ namespace Artemis.Core.LayerBrushes /// Seconds passed since last update public abstract void Update(double deltaTime); - // Not only is this needed to initialize properties on the layer brushes, it also prevents implementing anything - // but LayerBrush and RgbNetLayerBrush outside the core - internal abstract void Initialize(); - - internal abstract void InternalRender(SKCanvas canvas, SKRect path, SKPaint paint); - - #region IDisposable - /// /// Releases the unmanaged resources used by the object and optionally releases the managed resources. /// @@ -137,14 +134,42 @@ namespace Artemis.Core.LayerBrushes } } + /// + /// Enables the layer brush if it isn't already enabled + /// + internal void InternalEnable() + { + if (Enabled) + return; + + EnableLayerBrush(); + Enabled = true; + } + + /// + /// Disables the layer brush if it isn't already disabled + /// + internal void InternalDisable() + { + if (!Enabled) + return; + + DisableLayerBrush(); + Enabled = false; + } + + // Not only is this needed to initialize properties on the layer brushes, it also prevents implementing anything + // but LayerBrush and RgbNetLayerBrush outside the core + internal abstract void Initialize(); + + internal abstract void InternalRender(SKCanvas canvas, SKRect path, SKPaint paint); + /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } - - #endregion } /// diff --git a/src/Artemis.Core/Plugins/LayerBrushes/LayerBrushDescriptor.cs b/src/Artemis.Core/Plugins/LayerBrushes/LayerBrushDescriptor.cs index 2f70a6d54..6fb91ca71 100644 --- a/src/Artemis.Core/Plugins/LayerBrushes/LayerBrushDescriptor.cs +++ b/src/Artemis.Core/Plugins/LayerBrushes/LayerBrushDescriptor.cs @@ -71,6 +71,9 @@ namespace Artemis.Core.LayerBrushes layer.LayerBrush = brush; layer.OnLayerBrushUpdated(); + + if (layer.ShouldBeEnabled) + brush.InternalEnable(); } } } \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/LayerEffects/Internal/BaseLayerEffect.cs b/src/Artemis.Core/Plugins/LayerEffects/Internal/BaseLayerEffect.cs index 87a10811d..ac9f5d27f 100644 --- a/src/Artemis.Core/Plugins/LayerEffects/Internal/BaseLayerEffect.cs +++ b/src/Artemis.Core/Plugins/LayerEffects/Internal/BaseLayerEffect.cs @@ -11,7 +11,7 @@ namespace Artemis.Core.LayerEffects { private ILayerEffectConfigurationDialog? _configurationDialog; private LayerEffectDescriptor _descriptor; - private bool _enabled; + private bool _suspended; private Guid _entityId; private bool _hasBeenRenamed; private string _name; @@ -55,12 +55,12 @@ namespace Artemis.Core.LayerEffects } /// - /// Gets or sets the enabled state, if not enabled the effect is skipped in render and update + /// Gets or sets the suspended state, if suspended the effect is skipped in render and update /// - public bool Enabled + public bool Suspended { - get => _enabled; - set => SetAndNotify(ref _enabled, value); + get => _suspended; + set => SetAndNotify(ref _suspended, value); } /// @@ -112,6 +112,11 @@ namespace Artemis.Core.LayerEffects internal string PropertyRootPath => $"LayerEffect.{EntityId}.{GetType().Name}."; + /// + /// Gets a boolean indicating whether the layer effect is enabled or not + /// + public bool Enabled { get; private set; } + #region IDisposable /// @@ -176,5 +181,29 @@ namespace Artemis.Core.LayerEffects internal abstract void Initialize(); internal virtual string GetEffectTypeName() => GetType().Name; + + /// + /// Enables the layer effect if it isn't already enabled + /// + internal void InternalEnable() + { + if (Enabled) + return; + + EnableLayerEffect(); + Enabled = true; + } + + /// + /// Disables the layer effect if it isn't already disabled + /// + internal void InternalDisable() + { + if (!Enabled) + return; + + DisableLayerEffect(); + Enabled = false; + } } } \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/LayerEffects/LayerEffectDescriptor.cs b/src/Artemis.Core/Plugins/LayerEffects/LayerEffectDescriptor.cs index 13f66a592..f724f367a 100644 --- a/src/Artemis.Core/Plugins/LayerEffects/LayerEffectDescriptor.cs +++ b/src/Artemis.Core/Plugins/LayerEffects/LayerEffectDescriptor.cs @@ -74,7 +74,7 @@ namespace Artemis.Core.LayerEffects effect.EntityId = entity.Id; effect.Order = entity.Order; effect.Name = entity.Name; - effect.Enabled = entity.Enabled; + effect.Suspended = entity.Suspended; effect.Descriptor = this; effect.Initialize(); @@ -94,6 +94,9 @@ namespace Artemis.Core.LayerEffects }; effect.Initialize(); renderElement.ActivateLayerEffect(effect); + + if (renderElement.ShouldBeEnabled) + effect.InternalEnable(); } } } \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffect.cs b/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffect.cs index 2f92cfe91..07f57491b 100644 --- a/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffect.cs +++ b/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffect.cs @@ -16,7 +16,7 @@ namespace Artemis.Core.LayerEffects.Placeholder EntityId = OriginalEntity.Id; Order = OriginalEntity.Order; Name = OriginalEntity.Name; - Enabled = OriginalEntity.Enabled; + Suspended = OriginalEntity.Suspended; HasBeenRenamed = OriginalEntity.HasBeenRenamed; } diff --git a/src/Artemis.Storage/Entities/Profile/FolderEntity.cs b/src/Artemis.Storage/Entities/Profile/FolderEntity.cs index 7060ee6e0..035210069 100644 --- a/src/Artemis.Storage/Entities/Profile/FolderEntity.cs +++ b/src/Artemis.Storage/Entities/Profile/FolderEntity.cs @@ -16,7 +16,7 @@ namespace Artemis.Storage.Entities.Profile public int Order { get; set; } public string Name { get; set; } - public bool Enabled { get; set; } + public bool Suspended { get; set; } [BsonRef("ProfileEntity")] public ProfileEntity Profile { get; set; } diff --git a/src/Artemis.Storage/Entities/Profile/LayerEffectEntity.cs b/src/Artemis.Storage/Entities/Profile/LayerEffectEntity.cs index 6c8503e42..a575e24a9 100644 --- a/src/Artemis.Storage/Entities/Profile/LayerEffectEntity.cs +++ b/src/Artemis.Storage/Entities/Profile/LayerEffectEntity.cs @@ -8,7 +8,7 @@ namespace Artemis.Storage.Entities.Profile public string ProviderId { get; set; } public string EffectType { get; set; } public string Name { get; set; } - public bool Enabled { get; set; } + public bool Suspended { get; set; } public bool HasBeenRenamed { get; set; } public int Order { get; set; } } diff --git a/src/Artemis.Storage/Entities/Profile/LayerEntity.cs b/src/Artemis.Storage/Entities/Profile/LayerEntity.cs index 60dd2071c..035e160ec 100644 --- a/src/Artemis.Storage/Entities/Profile/LayerEntity.cs +++ b/src/Artemis.Storage/Entities/Profile/LayerEntity.cs @@ -17,7 +17,7 @@ namespace Artemis.Storage.Entities.Profile public int Order { get; set; } public string Name { get; set; } - public bool Enabled { get; set; } + public bool Suspended { get; set; } public List Leds { get; set; } diff --git a/src/Artemis.Storage/Migrations/M0002ProfileEntitiesEnabledMigration.cs b/src/Artemis.Storage/Migrations/M0002ProfileEntitiesEnabledMigration.cs index 409e2ad23..d019c1667 100644 --- a/src/Artemis.Storage/Migrations/M0002ProfileEntitiesEnabledMigration.cs +++ b/src/Artemis.Storage/Migrations/M0002ProfileEntitiesEnabledMigration.cs @@ -16,16 +16,16 @@ namespace Artemis.Storage.Migrations { foreach (FolderEntity profileEntityFolder in profileEntity.Folders) { - profileEntityFolder.Enabled = true; + profileEntityFolder.Suspended = false; foreach (LayerEffectEntity layerEffectEntity in profileEntityFolder.LayerEffects) - layerEffectEntity.Enabled = true; + layerEffectEntity.Suspended = false; } foreach (LayerEntity profileEntityLayer in profileEntity.Layers) { - profileEntityLayer.Enabled = true; + profileEntityLayer.Suspended = false; foreach (LayerEffectEntity layerEffectEntity in profileEntityLayer.LayerEffects) - layerEffectEntity.Enabled = true; + layerEffectEntity.Suspended = false; } repository.Upsert(profileEntity); diff --git a/src/Artemis.UI.Shared/Services/ProfileEditorService.cs b/src/Artemis.UI.Shared/Services/ProfileEditorService.cs index 1cff68bfd..37b2bdf5c 100644 --- a/src/Artemis.UI.Shared/Services/ProfileEditorService.cs +++ b/src/Artemis.UI.Shared/Services/ProfileEditorService.cs @@ -126,9 +126,16 @@ namespace Artemis.UI.Shared.Services // Stick to the main segment for any element that is not currently selected foreach (Folder folder in SelectedProfile.GetAllFolders()) + { + folder.Enable(); folder.Timeline.Override(CurrentTime, folder.Timeline.PlayMode == TimelinePlayMode.Repeat); + } + foreach (Layer layer in SelectedProfile.GetAllLayers()) + { + layer.Enable(); layer.Timeline.Override(CurrentTime, (layer != SelectedProfileElement || layer.Timeline.Length < CurrentTime) && layer.Timeline.PlayMode == TimelinePlayMode.Repeat); + } _doTick = true; } diff --git a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml index 0e6d576d7..5450b245a 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml @@ -13,6 +13,7 @@ d:DataContext="{d:DesignInstance local:TreeGroupViewModel}" d:DesignHeight="450" d:DesignWidth="800"> + @@ -180,13 +181,13 @@ + Command="{s:Action SuspendedToggled}">