using System;
using System.Collections.Generic;
using UnityEngine;
namespace TyphoonUI
{
///
/// UI活动队列
///
internal class UIOperationQueue : MonoBehaviour, IOperationQueue
{
private readonly Queue _queue = new Queue();
private UIOperationQueue()
{
}
///
/// 是否在处理中
///
private bool _isHandling = false;
///
/// 初始化
///
public void Initialize()
{
DontDestroyOnLoad(gameObject);
UIOperation.OnStateChanged += OnOperationStatusChanged;
}
///
/// 加入队列
///
public IOperationQueue Enqueue(Action handler)
{
var operationHandler = UIOperation.Create((h) =>
{
handler?.Invoke();
//默认执行完后完成
h.ToFinishStatus();
});
//加入队列
_queue.Enqueue(operationHandler);
return this;
}
///
/// 加入队列
///
public IOperationQueue Enqueue(Action handler)
{
var operation = UIOperation.Create(handler);
_queue.Enqueue(operation);
return this;
}
///
/// 中断
///
public void Interrupt()
{
while (_queue.Count > 0)
{
var operation = _queue.Dequeue();
operation.Release();
}
if (!_isHandling)
{
HandleOperation();
}
}
///
/// 执行队列
///
public void Run()
{
if (!_isHandling)
{
HandleOperation();
}
}
//处理活动队列
private void HandleOperation()
{
_isHandling = true;
if (_queue.Count <= 0)
{
_isHandling = false;
return;
}
while (_queue.Count > 0)
{
var peek = _queue.Peek();
if (peek.IsValid())
{
_queue.Dequeue();
continue;
}
switch (peek.GetStatus())
{
case OperationStatus.Ready:
//执行行为
peek.Run();
break;
case OperationStatus.Running:
//执行中,暂时退出
_isHandling = false;
return;
case OperationStatus.Finish:
var operation = _queue.Dequeue();
operation.Release();
break;
}
}
if (_queue.Count <= 0)
{
_isHandling = false;
}
}
private void OnOperationStatusChanged(long operationId)
{
if (_isHandling)
{
return;
}
//继续执行
if (_queue.Count > 0 && _queue.Peek().Id == operationId)
{
HandleOperation();
}
}
}
}