using System; using System.Collections.Generic; namespace TyphoonUI { /// /// UI活动代理 /// public struct UIOperationHandler { public long Id; public UIOperationHandler(long id) { Id = id; } /// /// 获取当前状态 /// public OperationStatus GetStatus() => UIOperation._GetOperationStatus(Id); /// /// 是否有效 /// /// public bool IsValid() => UIOperation._IsValid(Id); /// /// 切换到完成状态 /// public void ToFinishStatus() { //活动执行完毕 UIOperation._ChangeOperationStatus(Id, OperationStatus.Finish); } /// /// 切换到运行中状态 /// public void ToRunningStatus() { //等待活动执行中 UIOperation._ChangeOperationStatus(Id, OperationStatus.Running); } /// /// 执行行为 /// internal void Run() { UIOperation._RunOperation(Id); } /// /// 释放 /// internal void Release() { UIOperation._Release(Id); } } /// /// UI活动 /// internal class UIOperation { private static readonly Dictionary Operations = new Dictionary(); private static long _idCounter; public static event Action OnStateChanged; /// /// 获取状态 /// internal static OperationStatus _GetOperationStatus(long id) { if (Operations.TryGetValue(id, out var match)) { return match.Status; } return OperationStatus.Finish; } /// /// 切换状态 /// internal static void _ChangeOperationStatus(long id, OperationStatus status) { if (Operations.TryGetValue(id, out var match)) { match.ChangeStatus(status); } } /// /// 执行行为 /// internal static void _RunOperation(long id) { if (Operations.TryGetValue(id, out var match)) { match.Run(); } } /// /// 是否有效 /// internal static bool _IsValid(long id) { if (Operations.TryGetValue(id, out var match)) { return match.IsValid; } return false; } /// /// 释放 /// internal static void _Release(long id) { if (Operations.TryGetValue(id, out var match)) { match.Release(); } } internal static UIOperationHandler Create(Action handler) { var operation = new UIOperation { Handler = handler }; return new UIOperationHandler(operation.OperationId); } private UIOperation() { OperationId = _idCounter += 1; Operations.Add(OperationId, this); } /// /// 当前状态 /// internal OperationStatus Status { private set; get; } = OperationStatus.Ready; /// /// ID /// internal long OperationId { get; } /// /// 是否有效 /// internal bool IsValid { private set; get; } = true; /// /// 逻辑代理 /// internal Action Handler { private set; get; } //切换状态 internal void ChangeStatus(OperationStatus status) { //状态一致,不处理 if (Equals(Status, status)) { return; } //切换状态,触发状态变化 Status = status; //通知队列,状态发生变化 OnStateChanged?.Invoke(OperationId); } //开始执行 internal void Run() { Status = OperationStatus.Running; //执行活动逻辑 Handler?.Invoke(new UIOperationHandler(OperationId)); } internal void Release() { IsValid = false; Operations.Remove(OperationId); Handler = null; } } }