using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; namespace RGB.NET.Core; /// /// public abstract class AbstractDecoratable : AbstractBindable, IDecoratable where T : IDecorator { #region Properties & Fields private readonly List _decorators = []; /// public IReadOnlyList Decorators { get; } #endregion #region Constructors /// /// Initializes a new instance of the class. /// protected AbstractDecoratable() { Decorators = new ReadOnlyCollection(_decorators); } #endregion #region Methods /// public void AddDecorator(T decorator) { lock (Decorators) { _decorators.Add(decorator); _decorators.Sort((d1, d2) => d1.Order.CompareTo(d2.Order)); } decorator.OnAttached(this); } /// public void RemoveDecorator(T decorator) { lock (Decorators) _decorators.Remove(decorator); decorator.OnDetached(this); } /// public void RemoveAllDecorators() { IEnumerable decorators; lock (Decorators) decorators = Decorators.ToList(); foreach (T decorator in decorators) RemoveDecorator(decorator); } #endregion }