From 6c31d2be4432b07c925296c9269c53411addae2b Mon Sep 17 00:00:00 2001 From: Mira <56395159+TheXorog@users.noreply.github.com> Date: Mon, 3 Oct 2022 12:43:42 +0200 Subject: [PATCH] Add ObservableList --- Entities/ObservableList.cs | 106 +++++++++++++++++++++++++++++++ Entities/ObservableListUpdate.cs | 9 +++ 2 files changed, 115 insertions(+) create mode 100644 Entities/ObservableList.cs create mode 100644 Entities/ObservableListUpdate.cs diff --git a/Entities/ObservableList.cs b/Entities/ObservableList.cs new file mode 100644 index 0000000..45d5b90 --- /dev/null +++ b/Entities/ObservableList.cs @@ -0,0 +1,106 @@ +using System.Collections; + +namespace Xorog.UniversalExtensions.Entities; + +public class ObservableList : IList +{ + private List _items = new(); + + public event EventHandler>? ItemsChanged; + + public T this[int index] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public int Count => _items.Count; + + public bool IsReadOnly => false; + + public void Add(T item) + { + _ = Task.Run(() => + { + this.ItemsChanged?.Invoke(null, new ObservableListUpdate + { + List = this, + NewItems = new List() { item }, + RemovedItems = null + }); + }); + + _items.Add(item); + } + + public void Insert(int index, T item) + { + _ = Task.Run(() => + { + this.ItemsChanged?.Invoke(null, new ObservableListUpdate + { + List = this, + NewItems = new List() { item }, + RemovedItems = null + }); + }); + + _items.Insert(index, item); + } + + public void Clear() + { + _ = Task.Run(() => + { + this.ItemsChanged?.Invoke(null, new ObservableListUpdate + { + List = this, + NewItems = null, + RemovedItems = _items.ToList() + }); + }); + + _items.Clear(); + } + + public void RemoveAt(int index) + { + _ = Task.Run(() => + { + this.ItemsChanged?.Invoke(null, new ObservableListUpdate + { + List = this, + NewItems = null, + RemovedItems = new List() { _items.ElementAt(index) } + }); + }); + + _items.RemoveAt(index); + } + + public bool Remove(T item) + { + _ = Task.Run(() => + { + this.ItemsChanged?.Invoke(null, new ObservableListUpdate + { + List = this, + NewItems = null, + RemovedItems = new List() { item } + }); + }); + + return _items.Remove(item); + } + + public bool Contains(T item) + => _items.Contains(item); + + public void CopyTo(T[] array, int arrayIndex) + => _items.CopyTo(array, arrayIndex); + + public IEnumerator GetEnumerator() + => _items.GetEnumerator(); + + public int IndexOf(T item) + => _items.IndexOf(item); + + IEnumerator IEnumerable.GetEnumerator() + => _items.GetEnumerator(); +} diff --git a/Entities/ObservableListUpdate.cs b/Entities/ObservableListUpdate.cs new file mode 100644 index 0000000..27e1f49 --- /dev/null +++ b/Entities/ObservableListUpdate.cs @@ -0,0 +1,9 @@ +namespace Xorog.UniversalExtensions.Entities; + +public class ObservableListUpdate +{ + public ObservableList? List { get; internal set; } + + public IReadOnlyList? NewItems { get; internal set; } + public IReadOnlyList? RemovedItems { get; internal set; } +}