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