using System; using System.Collections; using System.Collections.Generic; namespace PrefsGUI { /// /// List style PrefsGUI /// [Serializable] public class PrefsList : PrefsListBase, List>, IList, IList { public PrefsList(string key, List defaultValue = default) : base(key, defaultValue) { } public bool IsDefaultCount => DefaultValueCount == Count; public void ResetToDefaultCount() { if (!IsDefaultCount) { var list = Get() ?? new(); var listCount = list.Count; if (DefaultValueCount > listCount) { list.AddRange(defaultValue.GetRange(listCount, DefaultValueCount - listCount)); } else if (DefaultValueCount < listCount) { list.RemoveRange(DefaultValueCount, listCount - DefaultValueCount); } Set(list); } } protected void UpdateValue(Action> action) { var v = Get(); action(v); Set(v); } #region List Method public void RemoveAll(Predicate predicate) => UpdateValue(v => v.RemoveAll(predicate)); #endregion #region PrefsListBase protected override IListAccessor> CreateListAccessor() => new ListAccessor(this); public override int DefaultValueCount => defaultValue?.Count ?? 0; public override bool IsDefaultAt(int idx) { if (idx < DefaultValueCount) { var current = Get()[idx]; return PrefsAnyUtility.IsEqual(current, defaultValue[idx]); } return false; } public override void ResetToDefaultAt(int idx) { if (idx < DefaultValueCount) { var list = Get(); if (SetListItemIfNotEqual(list, idx, defaultValue[idx])) { Set(list); } } } #endregion #region IList public T this[int index] { get => Get()[index]; set { UpdateValue((v) => v[index] = value); } } public int IndexOf(T item) => Get().IndexOf(item); public void Insert(int index, T item) => UpdateValue((v) => v.Insert(index, item)); public void RemoveAt(int index) => UpdateValue((v) => v.RemoveAt(index)); #endregion #region ICollection public int Count => Get()?.Count ?? 0; bool ICollection.IsReadOnly => (Get() as ICollection)?.IsReadOnly ?? false; public void Add(T item) => UpdateValue((v) => v.Add(item)); public void Clear() => UpdateValue((v) => v.Clear()); public bool Contains(T item) => Get().Contains(item); public void CopyTo(T[] array, int arrayIndex) => Get().CopyTo(array, arrayIndex); public bool Remove(T item) { var v = Get(); var ret = v.Remove(item); Set(v); return ret; } #endregion #region IEnumerable public IEnumerator GetEnumerator() => Get().GetEnumerator(); #endregion #region IEnumerable IEnumerator IEnumerable.GetEnumerator() => Get().GetEnumerator(); #endregion #region IList bool IList.IsFixedSize => (Get() as IList)?.IsFixedSize ?? false; bool IList.IsReadOnly => (Get() as IList)?.IsReadOnly ?? false; object IList.this[int index] { get => this[index]; set => this[index] = (T)value; } int IList.Add(object value) => (Get() as IList)?.Add(value) ?? -1; bool IList.Contains(object value) => (Get() as IList)?.Contains(value) ?? false; int IList.IndexOf(object value) => (Get() as IList)?.IndexOf(value) ?? -1; void IList.Insert(int index, object value) => (Get() as IList)?.Insert(index, value); void IList.Remove(object value) => (Get() as IList)?.Remove(value); #endregion #region ICollection bool ICollection.IsSynchronized => (Get() as ICollection)?.IsSynchronized ?? false; object ICollection.SyncRoot => (Get() as ICollection)?.SyncRoot ?? this; void ICollection.CopyTo(Array array, int arrayIndex) => (Get() as ICollection)?.CopyTo(array, arrayIndex); #endregion private class ListAccessor : IListAccessor> { private readonly PrefsList prefs; public ListAccessor(PrefsList prefs) => this.prefs = prefs; public List InnerList { get => prefs.Get(); set => prefs.Set(value); } } } }