2023-08-12 01:43:24 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
namespace BITKit
|
|
|
|
|
{
|
2023-11-15 23:54:54 +08:00
|
|
|
|
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<bool> action);
|
|
|
|
|
void RemoveListener(Action<bool> action);
|
|
|
|
|
void Clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[CustomType(typeof(IValidHandle))]
|
|
|
|
|
public sealed class ValidHandle: IValidHandle
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
2023-12-26 20:07:19 +08:00
|
|
|
|
public override string ToString()
|
|
|
|
|
{
|
|
|
|
|
return $"Allow:{enableHandle}\nElements:{string.Join("\n",objs)}\nDisableElements:{string.Join("\n",disableObjs)}";
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-02 23:24:56 +08:00
|
|
|
|
public ValidHandle() {}
|
2023-08-12 01:43:24 +08:00
|
|
|
|
public ValidHandle(Action<bool> boolDelegate)
|
|
|
|
|
{
|
|
|
|
|
AddListener(boolDelegate);
|
|
|
|
|
EventOnEnableChanged?.Invoke(enableHandle);
|
|
|
|
|
}
|
|
|
|
|
public static implicit operator bool(ValidHandle validHandle)
|
|
|
|
|
{
|
|
|
|
|
return validHandle.enableHandle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool Allow => this;
|
|
|
|
|
|
|
|
|
|
private bool enableHandle;
|
2024-02-21 01:40:53 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// ⚠️Dont operate this field directly
|
|
|
|
|
/// </summary>
|
|
|
|
|
public readonly List<object> objs = new List<object>();
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// ⚠️Dont operate this field directly
|
|
|
|
|
/// </summary>
|
|
|
|
|
public readonly List<object> disableObjs = new List<object>();
|
2023-08-12 01:43:24 +08:00
|
|
|
|
private bool tempEnable;
|
|
|
|
|
private Action<bool> EventOnEnableChanged;
|
|
|
|
|
|
2024-02-21 01:40:53 +08:00
|
|
|
|
|
2023-11-15 23:54:54 +08:00
|
|
|
|
public void AddElement(object obj)
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
if (objs.Contains(obj))
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
objs.Add(obj);
|
|
|
|
|
}
|
|
|
|
|
CheckEnable();
|
|
|
|
|
}
|
2023-11-15 23:54:54 +08:00
|
|
|
|
|
|
|
|
|
private void CheckEnable()
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
tempEnable = objs.Count > 0 && disableObjs.Count == 0;
|
|
|
|
|
if (tempEnable != enableHandle)
|
|
|
|
|
{
|
|
|
|
|
enableHandle = tempEnable;
|
|
|
|
|
if (EventOnEnableChanged is not null)
|
|
|
|
|
EventOnEnableChanged.Invoke(enableHandle);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-11-15 23:54:54 +08:00
|
|
|
|
public void RemoveElement(object obj)
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
if (objs.Contains(obj))
|
|
|
|
|
{
|
|
|
|
|
objs.Remove(obj);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
CheckEnable();
|
|
|
|
|
}
|
2023-11-15 23:54:54 +08:00
|
|
|
|
public int lenght => objs.Count;
|
|
|
|
|
public string[] GetElements()
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
List<string> elementNames = new List<string>();
|
|
|
|
|
for (int i = 0; i < objs.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
elementNames.Add(objs[i].ToString());
|
|
|
|
|
}
|
|
|
|
|
return elementNames.ToArray();
|
|
|
|
|
}
|
2023-11-15 23:54:54 +08:00
|
|
|
|
public bool Contains(object obj) => objs.Contains(obj);
|
|
|
|
|
public void AddDisableElements(object obj)
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
if (disableObjs.Contains(obj))
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
disableObjs.Add(obj);
|
|
|
|
|
}
|
|
|
|
|
CheckEnable();
|
|
|
|
|
}
|
2023-10-02 23:24:56 +08:00
|
|
|
|
public void RemoveDisableElements(object obj)
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
if (disableObjs.Contains(obj))
|
|
|
|
|
{
|
|
|
|
|
disableObjs.Remove(obj);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
CheckEnable();
|
|
|
|
|
}
|
2023-10-02 23:24:56 +08:00
|
|
|
|
public void SetElements(object obj, bool add = true)
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
if (add)
|
|
|
|
|
{
|
|
|
|
|
AddElement(obj);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
RemoveElement(obj);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-11-15 23:54:54 +08:00
|
|
|
|
public void SetDisableElements(object obj, bool add = true)
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
if (add)
|
|
|
|
|
{
|
|
|
|
|
AddDisableElements(obj);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
RemoveDisableElements(obj);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-10-02 23:24:56 +08:00
|
|
|
|
public void Invoke()
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
2023-10-02 23:24:56 +08:00
|
|
|
|
var enable = disableObjs.Count == 0 && objs.Count > 0;
|
|
|
|
|
EventOnEnableChanged?.Invoke(enable);
|
2023-08-12 01:43:24 +08:00
|
|
|
|
}
|
2023-10-02 23:24:56 +08:00
|
|
|
|
public void Invoke(bool value)
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
2023-10-02 23:24:56 +08:00
|
|
|
|
EventOnEnableChanged?.Invoke(value);
|
2023-08-12 01:43:24 +08:00
|
|
|
|
}
|
2023-10-02 23:24:56 +08:00
|
|
|
|
public void AddListener(Action<bool> action)
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
EventOnEnableChanged+= action;
|
|
|
|
|
}
|
2023-10-02 23:24:56 +08:00
|
|
|
|
public void RemoveListener(Action<bool> action)
|
2023-08-12 01:43:24 +08:00
|
|
|
|
{
|
|
|
|
|
if(EventOnEnableChanged is not null && action is not null)
|
|
|
|
|
{
|
|
|
|
|
EventOnEnableChanged -= action;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-10-02 23:24:56 +08:00
|
|
|
|
|
|
|
|
|
public void Clear()
|
|
|
|
|
{
|
|
|
|
|
objs.Clear();
|
|
|
|
|
disableObjs.Clear();
|
|
|
|
|
Invoke();
|
|
|
|
|
}
|
2023-08-12 01:43:24 +08:00
|
|
|
|
}
|
2023-10-02 23:24:56 +08:00
|
|
|
|
|
2023-08-12 01:43:24 +08:00
|
|
|
|
}
|