mirror of
https://github.com/DarthAffe/RGB.NET.git
synced 2025-12-13 10:08:31 +00:00
Improved usabillity of decorators a bit
This commit is contained in:
parent
f229bb8938
commit
52fd670ba7
@ -12,18 +12,15 @@ namespace RGB.NET.Core
|
|||||||
#region Properties & Fields
|
#region Properties & Fields
|
||||||
|
|
||||||
private readonly List<T> _decorators = new List<T>();
|
private readonly List<T> _decorators = new List<T>();
|
||||||
/// <summary>
|
|
||||||
/// Gets a readonly-list of all <see cref="IDecorator"/> attached to this <see cref="IDecoratable{T}"/>.
|
|
||||||
/// </summary>
|
|
||||||
protected IReadOnlyCollection<T> Decorators { get; }
|
|
||||||
|
|
||||||
#endregion
|
/// <inheritdoc />
|
||||||
|
public IReadOnlyCollection<T> Decorators
|
||||||
#region Constructors
|
|
||||||
|
|
||||||
protected AbstractDecoratable()
|
|
||||||
{
|
{
|
||||||
Decorators = new ReadOnlyCollection<T>(_decorators);
|
get
|
||||||
|
{
|
||||||
|
lock (_decorators)
|
||||||
|
return new ReadOnlyCollection<T>(_decorators);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace RGB.NET.Core
|
namespace RGB.NET.Core
|
||||||
{
|
{
|
||||||
@ -42,16 +44,17 @@ namespace RGB.NET.Core
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Detaches the decorator from all <see cref="IDecoratable"/> it is currently attached to.
|
/// Detaches the decorator from all <see cref="IDecoratable"/> it is currently attached to.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDecoratable">The type of the <see cref="IDecoratable"/> this decorator is attached to.</typeparam>
|
protected virtual void Detach()
|
||||||
/// <typeparam name="TDecorator">The type of this <see cref="IDecorator"/>.</typeparam>
|
|
||||||
protected virtual void Detach<TDecoratable, TDecorator>()
|
|
||||||
where TDecoratable : IDecoratable<TDecorator>
|
|
||||||
where TDecorator : AbstractDecorator
|
|
||||||
{
|
{
|
||||||
List<IDecoratable> decoratables = new List<IDecoratable>(DecoratedObjects);
|
List<IDecoratable> decoratables = new List<IDecoratable>(DecoratedObjects);
|
||||||
foreach (IDecoratable decoratable in decoratables)
|
foreach (IDecoratable decoratable in decoratables)
|
||||||
if (decoratable is TDecoratable typedDecoratable)
|
{
|
||||||
typedDecoratable.RemoveDecorator((TDecorator)this);
|
IEnumerable<Type> types = decoratable.GetType().GetInterfaces().Where(t => t.IsGenericType
|
||||||
|
&& (t.Name == typeof(IDecoratable<>).Name)
|
||||||
|
&& t.GenericTypeArguments[0].IsInstanceOfType(this));
|
||||||
|
foreach (Type decoratableType in types)
|
||||||
|
decoratableType.GetMethod(nameof(IDecoratable<IDecorator>.RemoveDecorator))?.Invoke(decoratable, new object[] { this });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using System.ComponentModel;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace RGB.NET.Core
|
namespace RGB.NET.Core
|
||||||
{
|
{
|
||||||
@ -13,9 +14,14 @@ namespace RGB.NET.Core
|
|||||||
/// Represents a basic decoratable for a specific type of <see cref="T:RGB.NET.Core.IDecorator" />
|
/// Represents a basic decoratable for a specific type of <see cref="T:RGB.NET.Core.IDecorator" />
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T"></typeparam>
|
/// <typeparam name="T"></typeparam>
|
||||||
public interface IDecoratable<in T> : IDecoratable
|
public interface IDecoratable<T> : IDecoratable
|
||||||
where T : IDecorator
|
where T : IDecorator
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a readonly-list of all <see cref="IDecorator"/> attached to this <see cref="IDecoratable{T}"/>.
|
||||||
|
/// </summary>
|
||||||
|
IReadOnlyCollection<T> Decorators { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds an <see cref="IDecorator"/> to the <see cref="IDecoratable"/>.
|
/// Adds an <see cref="IDecorator"/> to the <see cref="IDecoratable"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -129,7 +129,7 @@ namespace RGB.NET.Decorators.Brush
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((++_repetitionCount >= Repetitions) && (Repetitions > 0))
|
if ((++_repetitionCount >= Repetitions) && (Repetitions > 0))
|
||||||
Detach<IBrush, FlashDecorator>();
|
Detach();
|
||||||
_currentPhaseValue = Attack;
|
_currentPhaseValue = Attack;
|
||||||
_currentPhase = ADSRPhase.Attack;
|
_currentPhase = ADSRPhase.Attack;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user