using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; using System.Linq; namespace InABox.Core { public class FluentList : IEnumerable { public delegate void FluentListChangedEvent(object sender, EventArgs args); private int _enabled = 0; private bool _changed = false; private readonly List _values = new List(); public bool Enabled { get => _enabled == 0; set { if (value) EndUpdate(); else BeginUpdate(); } } public T this[int i] { get => _values[i]; set { _values[i] = value; Changed(); } } public int Count => _values.Count; public IEnumerator GetEnumerator() { return ((IEnumerable)_values).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_values).GetEnumerator(); } public FluentList Add(T value) { if (!_values.Contains(value)) { _changed = true; _values.Add(value); } return Changed(); } public FluentList AddRange(params T[] values) { foreach (var value in values) if (!_values.Contains(value)) { _changed = true; _values.Add(value); } return Changed(); } public FluentList AddRange(IEnumerable values) { foreach (var value in values) if (!_values.Contains(value)) { _changed = true; _values.Add(value); } return Changed(); } public FluentList Remove(T value) { _changed = _values.Remove(value) || _changed; return Changed(); } public FluentList RemoveAt(int index) { if (index > 0 && index < _values.Count) { _values.RemoveAt(index); _changed = true; } return Changed(); } public FluentList RemoveRange(params T[] values) { foreach (var value in values) _changed = _values.Remove(value) || _changed; return Changed(); } public FluentList RemoveRange(IEnumerable values) { foreach (var value in values) _changed = _values.Remove(value) || _changed; return Changed(); } public FluentList Clear() { if(_values.Count > 0) { _values.Clear(); _changed = true; } return Changed(); } public event FluentListChangedEvent OnChanged; public FluentList BeginUpdate() { ++_enabled; return this; } private FluentList Changed() { if (_enabled == 0 && _changed) { _changed = false; OnChanged?.Invoke(this, new EventArgs()); } return this; } public FluentList EndUpdate() { --_enabled; return Changed(); } } }