#if UNITY_5_3_OR_NEWER using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace RocketUtils { [Serializable] public class ObservableList : ICollection { public event Action Changed; [SerializeField] private List _list; public ObservableList() { _list = new List(); } public ObservableList(ObservableList newList) { _list = new List(); foreach (var listItem in newList) { _list.Add(listItem); IObservableModel observableItem = listItem as IObservableModel; if (observableItem != null) observableItem.PropertyChanged += RaiseChangedEvent; } } ~ObservableList() { Clear(); } #region ICollection Related public int Count { get { return _list.Count; } } public bool IsReadOnly { get { return false; } } //Only raise changed event once. public void Clear() { for (int i = _list.Count - 1; i >= 0; i--) { IObservableModel observableItem = _list[i] as IObservableModel; if (observableItem != null) observableItem.PropertyChanged -= RaiseChangedEvent; _list.Remove(_list[i]); } RaiseChangedEvent(); } public bool Contains(T item) { return _list.Contains(item); } public void CopyTo(T[] array, int arrayIndex) { _list.CopyTo(array, arrayIndex); } #endregion public void Add(T item) { _list.Add(item); RaiseChangedEvent(); IObservableModel observableItem = item as IObservableModel; if (observableItem != null) observableItem.PropertyChanged += RaiseChangedEvent; } public bool Remove(T item) { if (!_list.Remove(item)) return false; RaiseChangedEvent(); IObservableModel observableItem = item as IObservableModel; if (observableItem != null) observableItem.PropertyChanged -= RaiseChangedEvent; return true; } public void RemoveAt(int index) { _list.RemoveAt(index); RaiseChangedEvent(); } public T this[int key] { get { return _list[key]; } set { _list[key] = value; if (Changed != null) Changed(); } } public IEnumerator GetEnumerator() { return _list.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return _list.GetEnumerator(); } private void RaiseChangedEvent() { if (Changed != null) Changed.Invoke(); } } } #endif