123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- 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<T> : IEnumerable<T>
- {
- public delegate void FluentListChangedEvent(object sender, EventArgs args);
- private int _enabled = 0;
- private bool _changed = false;
- private readonly List<T> _values = new List<T>();
- 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<T> GetEnumerator()
- {
- return ((IEnumerable<T>)_values).GetEnumerator();
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return ((IEnumerable<T>)_values).GetEnumerator();
- }
- public FluentList<T> Add(T value)
- {
- if (!_values.Contains(value))
- {
- _changed = true;
- _values.Add(value);
- }
- return Changed();
- }
- public FluentList<T> AddRange(params T[] values)
- {
- foreach (var value in values)
- if (!_values.Contains(value))
- {
- _changed = true;
- _values.Add(value);
- }
- return Changed();
- }
- public FluentList<T> AddRange(IEnumerable<T> values)
- {
- foreach (var value in values)
- if (!_values.Contains(value))
- {
- _changed = true;
- _values.Add(value);
- }
- return Changed();
- }
- public FluentList<T> Remove(T value)
- {
- _changed = _values.Remove(value) || _changed;
- return Changed();
- }
- public FluentList<T> RemoveAt(int index)
- {
- if (index > 0 && index < _values.Count)
- {
- _values.RemoveAt(index);
- _changed = true;
- }
- return Changed();
- }
- public FluentList<T> RemoveRange(params T[] values)
- {
- foreach (var value in values)
- _changed = _values.Remove(value) || _changed;
- return Changed();
- }
- public FluentList<T> RemoveRange(IEnumerable<T> values)
- {
- foreach (var value in values)
- _changed = _values.Remove(value) || _changed;
- return Changed();
- }
- public FluentList<T> Clear()
- {
- if(_values.Count > 0)
- {
- _values.Clear();
- _changed = true;
- }
- return Changed();
- }
- public event FluentListChangedEvent OnChanged;
- public FluentList<T> BeginUpdate()
- {
- ++_enabled;
- return this;
- }
- private FluentList<T> Changed()
- {
- if (_enabled == 0 && _changed)
- {
- _changed = false;
- OnChanged?.Invoke(this, new EventArgs());
- }
- return this;
- }
- public FluentList<T> EndUpdate()
- {
- --_enabled;
- return Changed();
- }
- }
- }
|