mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Layer effects - Fixed placeholder system
This commit is contained in:
parent
9681231215
commit
24cb397556
@ -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<BaseLayerEffect> affectedLayerEffects = _layerEffects.Where(ef => ef.ProviderId == e.Registration.PluginFeature.Id).ToList();
|
||||
List<BaseLayerEffect> 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<PlaceholderLayerEffect> 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<PlaceholderLayerEffect>()
|
||||
.ToList();
|
||||
|
||||
|
||||
@ -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<T> 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
|
||||
/// <inheritdoc />
|
||||
public void Load()
|
||||
{
|
||||
HasBeenRenamed = LayerEffectEntity.HasBeenRenamed;
|
||||
Name = HasBeenRenamed ? LayerEffectEntity.Name : Descriptor.DisplayName;
|
||||
HasBeenRenamed = LayerEffectEntity.HasBeenRenamed;
|
||||
Order = LayerEffectEntity.Order;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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; }
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
public string? PlaceholderFor { get; }
|
||||
public bool IsPlaceholder { get; }
|
||||
|
||||
internal static LayerEffectDescriptor CreatePlaceholder(LayerEffectProvider provider)
|
||||
{
|
||||
return new LayerEffectDescriptor(provider);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates an instance of the described effect and applies it to the render element
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
@ -8,10 +8,9 @@ namespace Artemis.Core.LayerEffects.Placeholder;
|
||||
/// </summary>
|
||||
internal class PlaceholderLayerEffect : LayerEffect<PlaceholderProperties>
|
||||
{
|
||||
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<PlaceholderProperties>
|
||||
HasBeenRenamed = OriginalEntity.HasBeenRenamed;
|
||||
}
|
||||
|
||||
public string PlaceholderFor { get; }
|
||||
|
||||
internal LayerEffectEntity OriginalEntity { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
@ -47,11 +44,6 @@ internal class PlaceholderLayerEffect : LayerEffect<PlaceholderProperties>
|
||||
public override void PostProcess(SKCanvas canvas, SKRect bounds, SKPaint paint)
|
||||
{
|
||||
}
|
||||
|
||||
internal override string GetEffectTypeName()
|
||||
{
|
||||
return OriginalEntity.EffectType;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the provided placeholder matches this event.
|
||||
/// </summary>
|
||||
/// <param name="placeholder">The placeholder to check</param>
|
||||
/// <returns><see langword="true" /> if the placeholder is for the provided layer effect registration, otherwise <see langword="false" />.</returns>
|
||||
internal bool Matches(PlaceholderLayerEffect placeholder)
|
||||
{
|
||||
return placeholder.OriginalEntity.ProviderId == PluginFeature.Id &&
|
||||
placeholder.OriginalEntity.EffectType == LayerEffectDescriptor.LayerEffectType?.FullName;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the provided layer effect matches this event.
|
||||
/// </summary>
|
||||
/// <param name="layerEffect">The layer effect to check</param>
|
||||
/// <returns><see langword="true" /> if the placeholder is for the provided layer effect registration, otherwise <see langword="false" />.</returns>
|
||||
internal bool Matches(BaseLayerEffect layerEffect)
|
||||
{
|
||||
return layerEffect.Descriptor == LayerEffectDescriptor;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user