From 52fd670ba7ed5e92d6e1a2c94561001eea1d0f8c Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Wed, 8 Jul 2020 21:24:56 +0200 Subject: [PATCH] Improved usabillity of decorators a bit --- .../Decorators/AbstractDecorateable.cs | 17 +++++++---------- RGB.NET.Core/Decorators/AbstractDecorator.cs | 19 +++++++++++-------- RGB.NET.Core/Decorators/IDecoratable.cs | 10 ++++++++-- RGB.NET.Decorators/Brush/FlashDecorator.cs | 2 +- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/RGB.NET.Core/Decorators/AbstractDecorateable.cs b/RGB.NET.Core/Decorators/AbstractDecorateable.cs index 94b8f05..d12afcd 100644 --- a/RGB.NET.Core/Decorators/AbstractDecorateable.cs +++ b/RGB.NET.Core/Decorators/AbstractDecorateable.cs @@ -12,18 +12,15 @@ namespace RGB.NET.Core #region Properties & Fields private readonly List _decorators = new List(); - /// - /// Gets a readonly-list of all attached to this . - /// - protected IReadOnlyCollection Decorators { get; } - #endregion - - #region Constructors - - protected AbstractDecoratable() + /// + public IReadOnlyCollection Decorators { - Decorators = new ReadOnlyCollection(_decorators); + get + { + lock (_decorators) + return new ReadOnlyCollection(_decorators); + } } #endregion diff --git a/RGB.NET.Core/Decorators/AbstractDecorator.cs b/RGB.NET.Core/Decorators/AbstractDecorator.cs index 381f4f5..50e007c 100644 --- a/RGB.NET.Core/Decorators/AbstractDecorator.cs +++ b/RGB.NET.Core/Decorators/AbstractDecorator.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; namespace RGB.NET.Core { @@ -42,16 +44,17 @@ namespace RGB.NET.Core /// /// Detaches the decorator from all it is currently attached to. /// - /// The type of the this decorator is attached to. - /// The type of this . - protected virtual void Detach() - where TDecoratable : IDecoratable - where TDecorator : AbstractDecorator + protected virtual void Detach() { List decoratables = new List(DecoratedObjects); foreach (IDecoratable decoratable in decoratables) - if (decoratable is TDecoratable typedDecoratable) - typedDecoratable.RemoveDecorator((TDecorator)this); + { + IEnumerable 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.RemoveDecorator))?.Invoke(decoratable, new object[] { this }); + } } #endregion diff --git a/RGB.NET.Core/Decorators/IDecoratable.cs b/RGB.NET.Core/Decorators/IDecoratable.cs index 9e2a32c..781d9f1 100644 --- a/RGB.NET.Core/Decorators/IDecoratable.cs +++ b/RGB.NET.Core/Decorators/IDecoratable.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System.Collections.Generic; +using System.ComponentModel; namespace RGB.NET.Core { @@ -13,9 +14,14 @@ namespace RGB.NET.Core /// Represents a basic decoratable for a specific type of /// /// - public interface IDecoratable : IDecoratable + public interface IDecoratable : IDecoratable where T : IDecorator { + /// + /// Gets a readonly-list of all attached to this . + /// + IReadOnlyCollection Decorators { get; } + /// /// Adds an to the . /// diff --git a/RGB.NET.Decorators/Brush/FlashDecorator.cs b/RGB.NET.Decorators/Brush/FlashDecorator.cs index 618b243..580fce4 100644 --- a/RGB.NET.Decorators/Brush/FlashDecorator.cs +++ b/RGB.NET.Decorators/Brush/FlashDecorator.cs @@ -129,7 +129,7 @@ namespace RGB.NET.Decorators.Brush else { if ((++_repetitionCount >= Repetitions) && (Repetitions > 0)) - Detach(); + Detach(); _currentPhaseValue = Attack; _currentPhase = ADSRPhase.Attack; }