diff --git a/src/Artemis.Core/Models/Profile/RenderProfileElement.cs b/src/Artemis.Core/Models/Profile/RenderProfileElement.cs index ad2528865..02b75ce9b 100644 --- a/src/Artemis.Core/Models/Profile/RenderProfileElement.cs +++ b/src/Artemis.Core/Models/Profile/RenderProfileElement.cs @@ -273,7 +273,7 @@ public abstract class RenderProfileElement : ProfileElement // If no descriptor was found and there was no existing placeholder, create a placeholder else { - descriptor = PlaceholderLayerEffectDescriptor.Create(layerEffectEntity.ProviderId); + descriptor = PlaceholderLayerEffectDescriptor.Create(); layerEffect = descriptor.CreateInstance(this, layerEffectEntity); } @@ -286,7 +286,7 @@ public abstract class RenderProfileElement : ProfileElement if (index == -1) return; - LayerEffectDescriptor descriptor = PlaceholderLayerEffectDescriptor.Create(layerEffect.ProviderId); + LayerEffectDescriptor descriptor = PlaceholderLayerEffectDescriptor.Create(); BaseLayerEffect placeholder = descriptor.CreateInstance(this, layerEffect.LayerEffectEntity); _layerEffects[index] = placeholder; layerEffect.Dispose(); @@ -299,7 +299,7 @@ public abstract class RenderProfileElement : ProfileElement if (index == -1) return; - LayerEffectDescriptor? descriptor = LayerEffectStore.Get(placeholder.OriginalEntity.ProviderId, placeholder.PlaceholderFor)?.LayerEffectDescriptor; + LayerEffectDescriptor? descriptor = LayerEffectStore.Get(placeholder.OriginalEntity.ProviderId, placeholder.OriginalEntity.EffectType)?.LayerEffectDescriptor; if (descriptor == null) throw new ArtemisCoreException("Can't replace a placeholder effect because the real effect isn't available."); @@ -324,7 +324,7 @@ public abstract class RenderProfileElement : ProfileElement private void LayerEffectStoreOnLayerEffectRemoved(object? sender, LayerEffectStoreEvent e) { // Find effects that just got disabled and replace them with placeholders - List affectedLayerEffects = _layerEffects.Where(ef => ef.ProviderId == e.Registration.PluginFeature.Id).ToList(); + List affectedLayerEffects = _layerEffects.Where(e.Registration.Matches).ToList(); if (!affectedLayerEffects.Any()) return; @@ -338,7 +338,7 @@ public abstract class RenderProfileElement : ProfileElement { // Find placeholders that just got enabled and replace them with real effects List affectedPlaceholders = LayerEffects - .Where(l => l is PlaceholderLayerEffect ph && ph.OriginalEntity.ProviderId == e.Registration.PluginFeature.Id) + .Where(l => l is PlaceholderLayerEffect ph && e.Registration.Matches(ph)) .Cast() .ToList(); diff --git a/src/Artemis.Core/Plugins/LayerEffects/Internal/BaseLayerEffect.cs b/src/Artemis.Core/Plugins/LayerEffects/Internal/BaseLayerEffect.cs index d574c2e08..94cc830ba 100644 --- a/src/Artemis.Core/Plugins/LayerEffects/Internal/BaseLayerEffect.cs +++ b/src/Artemis.Core/Plugins/LayerEffects/Internal/BaseLayerEffect.cs @@ -164,12 +164,7 @@ public abstract class BaseLayerEffect : BreakableModel, IDisposable, IStorageMod // Not only is this needed to initialize properties on the layer effects, it also prevents implementing anything // but LayerEffect outside the core internal abstract void Initialize(); - - internal virtual string GetEffectTypeName() - { - return GetType().Name; - } - + internal void InternalUpdate(Timeline timeline) { BaseProperties?.Update(timeline); @@ -220,20 +215,23 @@ public abstract class BaseLayerEffect : BreakableModel, IDisposable, IStorageMod /// public void Load() { - HasBeenRenamed = LayerEffectEntity.HasBeenRenamed; Name = HasBeenRenamed ? LayerEffectEntity.Name : Descriptor.DisplayName; + HasBeenRenamed = LayerEffectEntity.HasBeenRenamed; Order = LayerEffectEntity.Order; } /// public void Save() { - LayerEffectEntity.ProviderId = Descriptor.Provider.Id; - LayerEffectEntity.EffectType = GetType().FullName; LayerEffectEntity.Name = Name; LayerEffectEntity.HasBeenRenamed = HasBeenRenamed; LayerEffectEntity.Order = Order; + if (Descriptor.IsPlaceholder) + return; + + LayerEffectEntity.ProviderId = Descriptor.Provider.Id; + LayerEffectEntity.EffectType = GetType().FullName; BaseProperties?.ApplyToEntity(); LayerEffectEntity.PropertyGroup = BaseProperties?.PropertyGroupEntity; } diff --git a/src/Artemis.Core/Plugins/LayerEffects/LayerEffectDescriptor.cs b/src/Artemis.Core/Plugins/LayerEffects/LayerEffectDescriptor.cs index 5c605de8d..196461c45 100644 --- a/src/Artemis.Core/Plugins/LayerEffects/LayerEffectDescriptor.cs +++ b/src/Artemis.Core/Plugins/LayerEffects/LayerEffectDescriptor.cs @@ -19,9 +19,9 @@ public class LayerEffectDescriptor Provider = provider ?? throw new ArgumentNullException(nameof(provider)); } - internal LayerEffectDescriptor(string placeholderFor, LayerEffectProvider provider) + private LayerEffectDescriptor(LayerEffectProvider provider) { - PlaceholderFor = placeholderFor ?? throw new ArgumentNullException(nameof(placeholderFor)); + IsPlaceholder = true; Provider = provider ?? throw new ArgumentNullException(nameof(provider)); DisplayName = "Missing effect"; Description = "This effect could not be loaded"; @@ -55,16 +55,21 @@ public class LayerEffectDescriptor public LayerEffectProvider Provider { get; } /// - /// Gets the GUID this descriptor is acting as a placeholder for. If null, this descriptor is not a placeholder + /// Gets a boolean indicating whether this descriptor is a placeholder descriptor. /// - public string? PlaceholderFor { get; } + public bool IsPlaceholder { get; } + + internal static LayerEffectDescriptor CreatePlaceholder(LayerEffectProvider provider) + { + return new LayerEffectDescriptor(provider); + } /// /// Creates an instance of the described effect and applies it to the render element /// public BaseLayerEffect CreateInstance(RenderProfileElement renderElement, LayerEffectEntity? entity) { - if (PlaceholderFor != null) + if (IsPlaceholder) { if (entity == null) throw new ArtemisCoreException("Cannot create a placeholder for a layer effect that wasn't loaded from an entity"); @@ -97,10 +102,10 @@ public class LayerEffectDescriptor private BaseLayerEffect CreatePlaceHolderInstance(RenderProfileElement renderElement, LayerEffectEntity entity) { - if (PlaceholderFor == null) + if (!IsPlaceholder) throw new ArtemisCoreException("Cannot create a placeholder instance using a layer effect descriptor that is not a placeholder for anything"); - PlaceholderLayerEffect effect = new(entity, PlaceholderFor) + PlaceholderLayerEffect effect = new(entity) { ProfileElement = renderElement, Descriptor = this diff --git a/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffect.cs b/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffect.cs index 5ccbdd05b..1f5752bc9 100644 --- a/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffect.cs +++ b/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffect.cs @@ -8,10 +8,9 @@ namespace Artemis.Core.LayerEffects.Placeholder; /// internal class PlaceholderLayerEffect : LayerEffect { - internal PlaceholderLayerEffect(LayerEffectEntity originalEntity, string placeholderFor) + internal PlaceholderLayerEffect(LayerEffectEntity originalEntity) { OriginalEntity = originalEntity; - PlaceholderFor = placeholderFor; LayerEffectEntity = originalEntity; Order = OriginalEntity.Order; @@ -19,8 +18,6 @@ internal class PlaceholderLayerEffect : LayerEffect HasBeenRenamed = OriginalEntity.HasBeenRenamed; } - public string PlaceholderFor { get; } - internal LayerEffectEntity OriginalEntity { get; } /// @@ -47,11 +44,6 @@ internal class PlaceholderLayerEffect : LayerEffect public override void PostProcess(SKCanvas canvas, SKRect bounds, SKPaint paint) { } - - internal override string GetEffectTypeName() - { - return OriginalEntity.EffectType; - } } /// diff --git a/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffectDescriptor.cs b/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffectDescriptor.cs index 27628a2d2..4f71dd81c 100644 --- a/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffectDescriptor.cs +++ b/src/Artemis.Core/Plugins/LayerEffects/Placeholder/PlaceholderLayerEffectDescriptor.cs @@ -2,9 +2,9 @@ internal static class PlaceholderLayerEffectDescriptor { - public static LayerEffectDescriptor Create(string missingProviderId) + public static LayerEffectDescriptor Create() { - LayerEffectDescriptor descriptor = new(missingProviderId, Constants.EffectPlaceholderPlugin); + LayerEffectDescriptor descriptor = LayerEffectDescriptor.CreatePlaceholder(Constants.EffectPlaceholderPlugin); return descriptor; } } \ No newline at end of file diff --git a/src/Artemis.Core/Stores/Registrations/LayerEffectRegistration.cs b/src/Artemis.Core/Stores/Registrations/LayerEffectRegistration.cs index e9b931524..e09526d35 100644 --- a/src/Artemis.Core/Stores/Registrations/LayerEffectRegistration.cs +++ b/src/Artemis.Core/Stores/Registrations/LayerEffectRegistration.cs @@ -1,5 +1,6 @@ using System; using Artemis.Core.LayerEffects; +using Artemis.Core.LayerEffects.Placeholder; namespace Artemis.Core; @@ -37,4 +38,25 @@ public class LayerEffectRegistration if (IsInStore) LayerEffectStore.Remove(this); } + + /// + /// Determines whether the provided placeholder matches this event. + /// + /// The placeholder to check + /// if the placeholder is for the provided layer effect registration, otherwise . + internal bool Matches(PlaceholderLayerEffect placeholder) + { + return placeholder.OriginalEntity.ProviderId == PluginFeature.Id && + placeholder.OriginalEntity.EffectType == LayerEffectDescriptor.LayerEffectType?.FullName; + } + + /// + /// Determines whether the provided layer effect matches this event. + /// + /// The layer effect to check + /// if the placeholder is for the provided layer effect registration, otherwise . + internal bool Matches(BaseLayerEffect layerEffect) + { + return layerEffect.Descriptor == LayerEffectDescriptor; + } } \ No newline at end of file