using System; using System.Collections.Generic; namespace BITKit { public interface IValidHandle { bool Allow { get; } void AddElement(object obj); void RemoveElement(object obj); void AddDisableElements(object obj); void RemoveDisableElements(object obj); void SetElements(object obj, bool add = true); void SetDisableElements(object obj, bool add = true); void Invoke(); void Invoke(bool value); void AddListener(Action action); void RemoveListener(Action action); void Clear(); } [CustomType(typeof(IValidHandle))] public sealed class ValidHandle: IValidHandle { public override string ToString() { return $"Allow:{enableHandle}\nElements:{string.Join("\n",objs)}\nDisableElements:{string.Join("\n",disableObjs)}"; } public ValidHandle() {} public ValidHandle(Action boolDelegate) { AddListener(boolDelegate); EventOnEnableChanged?.Invoke(enableHandle); } public static implicit operator bool(ValidHandle validHandle) { return validHandle.enableHandle; } public bool Allow => this; private bool enableHandle; /// /// ⚠️Dont operate this field directly /// public readonly List objs = new List(); /// /// ⚠️Dont operate this field directly /// public readonly List disableObjs = new List(); private bool tempEnable; private Action EventOnEnableChanged; public void AddElement(object obj) { if (objs.Contains(obj)) { } else { objs.Add(obj); } CheckEnable(); } private void CheckEnable() { tempEnable = objs.Count > 0 && disableObjs.Count == 0; if (tempEnable != enableHandle) { enableHandle = tempEnable; if (EventOnEnableChanged is not null) EventOnEnableChanged.Invoke(enableHandle); } } public void RemoveElement(object obj) { if (objs.Contains(obj)) { objs.Remove(obj); } else { } CheckEnable(); } public int lenght => objs.Count; public string[] GetElements() { List elementNames = new List(); for (int i = 0; i < objs.Count; i++) { elementNames.Add(objs[i].ToString()); } return elementNames.ToArray(); } public bool Contains(object obj) => objs.Contains(obj); public void AddDisableElements(object obj) { if (disableObjs.Contains(obj)) { } else { disableObjs.Add(obj); } CheckEnable(); } public void RemoveDisableElements(object obj) { if (disableObjs.Contains(obj)) { disableObjs.Remove(obj); } else { } CheckEnable(); } public void SetElements(object obj, bool add = true) { if (add) { AddElement(obj); } else { RemoveElement(obj); } } public void SetDisableElements(object obj, bool add = true) { if (add) { AddDisableElements(obj); } else { RemoveDisableElements(obj); } } public void Invoke() { var enable = disableObjs.Count == 0 && objs.Count > 0; EventOnEnableChanged?.Invoke(enable); } public void Invoke(bool value) { EventOnEnableChanged?.Invoke(value); } public void AddListener(Action action) { EventOnEnableChanged+= action; } public void RemoveListener(Action action) { if(EventOnEnableChanged is not null && action is not null) { EventOnEnableChanged -= action; } } public void Clear() { objs.Clear(); disableObjs.Clear(); Invoke(); } } }