BITFALL/Assets/BITKit/Core/Utility/ValidHandle.cs

177 lines
4.6 KiB
C#
Raw Normal View History

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
{
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
}