using GFramework.Core.Abstractions.events;
namespace GFramework.Core.events;
///
/// 支持优先级的泛型事件类
///
/// 事件回调函数的参数类型
public class PriorityEvent : IEvent
{
///
/// 事件处理器包装类,包含处理器和优先级
///
private class EventHandler
{
public Action Handler { get; }
public int Priority { get; }
public EventHandler(Action handler, int priority)
{
Handler = handler;
Priority = priority;
}
}
///
/// 存储已注册的事件处理器列表
///
private readonly List _handlers = new();
///
/// 标记事件是否已被处理(用于 UntilHandled 传播模式)
///
private bool _handled;
///
/// 显式实现 IEvent 接口中的 Register 方法
///
/// 无参事件处理方法
/// IUnRegister 对象,用于稍后注销该事件监听器
IUnRegister IEvent.Register(Action onEvent)
{
return Register(_ => onEvent(), 0);
}
///
/// 注册一个事件监听器,默认优先级为 0
///
/// 要注册的事件处理方法
/// IUnRegister 对象,用于稍后注销该事件监听器
public IUnRegister Register(Action onEvent)
{
return Register(onEvent, 0);
}
///
/// 注册一个事件监听器,并指定优先级
///
/// 要注册的事件处理方法
/// 优先级,数值越大优先级越高
/// IUnRegister 对象,用于稍后注销该事件监听器
public IUnRegister Register(Action onEvent, int priority)
{
var handler = new EventHandler(onEvent, priority);
_handlers.Add(handler);
// 按优先级降序排序(高优先级在前)
_handlers.Sort((a, b) => b.Priority.CompareTo(a.Priority));
return new DefaultUnRegister(() => UnRegister(onEvent));
}
///
/// 取消指定的事件监听器
///
/// 需要被注销的事件处理方法
public void UnRegister(Action onEvent)
{
_handlers.RemoveAll(h => h.Handler == onEvent);
}
///
/// 触发所有已注册的事件处理程序(默认传播模式:All)
///
/// 传递给事件处理程序的参数
public void Trigger(T t)
{
Trigger(t, EventPropagation.All);
}
///
/// 触发事件处理程序,并指定传播模式
///
/// 传递给事件处理程序的参数
/// 事件传播模式
public void Trigger(T t, EventPropagation propagation)
{
_handled = false;
switch (propagation)
{
case EventPropagation.All:
// 触发所有处理器
foreach (var handler in _handlers)
{
handler.Handler.Invoke(t);
}
break;
case EventPropagation.UntilHandled:
// 触发直到某个处理器标记为已处理
foreach (var handler in _handlers)
{
handler.Handler.Invoke(t);
if (_handled) break;
}
break;
case EventPropagation.Highest:
// 仅触发最高优先级的处理器
if (_handlers.Count > 0)
{
var highestPriority = _handlers[0].Priority;
foreach (var handler in _handlers)
{
if (handler.Priority < highestPriority) break;
handler.Handler.Invoke(t);
}
}
break;
}
}
///
/// 标记事件为已处理(用于 UntilHandled 传播模式)
///
public void MarkAsHandled()
{
_handled = true;
}
}