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
}