iFactory.Godot/BITKit/Scripts/UX/UXService.cs

140 lines
3.6 KiB
C#
Raw Normal View History

2023-06-15 21:52:13 +08:00
using Godot;
using System.Collections.Generic;
2023-07-03 02:34:01 +08:00
using System.Linq;
2023-06-19 00:41:44 +08:00
using System.Xml;
2023-06-15 21:52:13 +08:00
using Microsoft.Extensions.DependencyInjection;
2023-09-15 23:02:46 +08:00
namespace BITKit.UX;
2023-06-15 21:52:13 +08:00
2023-09-15 23:02:46 +08:00
public partial class UXService : Control, IUXService
2023-06-15 21:52:13 +08:00
{
private static UXService Singleton;
2023-06-19 00:41:44 +08:00
2023-06-15 21:52:13 +08:00
/// <summary>
/// 在构造函数中注入依赖
/// </summary>
public UXService()
{
BITApp.ServiceCollection.AddSingleton(this);
Singleton = this;
}
2023-09-15 23:02:46 +08:00
2023-06-15 21:52:13 +08:00
public static void Register(IUXPanel panel)
{
RegistryQueue.Enqueue(panel);
}
2023-09-15 23:02:46 +08:00
2023-06-15 21:52:13 +08:00
public static void UnRegister(IUXPanel panel)
{
2023-06-29 01:01:52 +08:00
UnRegistryQueue.Enqueue(panel);
2023-06-15 21:52:13 +08:00
}
2023-06-19 00:41:44 +08:00
public static void Open<T>() where T : IUXPanel
{
2023-09-17 02:55:33 +08:00
foreach (var x in Panels.Values)
{
if (x is not T value) continue;
Open(value);
return;
}
throw new KeyNotFoundException($"未找到类型为{typeof(T).FullName}的面板");
2023-06-19 00:41:44 +08:00
}
2023-06-29 01:01:52 +08:00
public static void Return()
2023-06-19 00:41:44 +08:00
{
2023-06-29 01:01:52 +08:00
if (History.TryPop(out _))
{
if(History.TryPop(out var returnPanel))
{
Open(returnPanel);
}
}
2023-06-19 00:41:44 +08:00
}
2023-06-29 01:01:52 +08:00
public static void Open(IUXPanel panel) => EnableQueue.Push(panel);
public static void Open(Control control)=>Open(control as IUXPanel);
2023-06-19 00:41:44 +08:00
public static void Open(string name)
{
}
2023-06-15 21:52:13 +08:00
/// <summary>
/// 内部注册面板队列
/// </summary>
private static readonly Queue<IUXPanel> RegistryQueue = new();
2023-06-29 01:01:52 +08:00
/// <summary>
/// 内部注销面板队列
/// </summary>
private static readonly Queue<IUXPanel> UnRegistryQueue = new();
2023-06-19 00:41:44 +08:00
2023-06-15 21:52:13 +08:00
/// <summary>
/// 已注册面板字典
/// </summary>
private static readonly Dictionary<string, IUXPanel> Panels = new();
2023-06-19 00:41:44 +08:00
2023-06-15 21:52:13 +08:00
/// <summary>
/// 等待启用的面板队列
/// </summary>
2023-06-19 00:41:44 +08:00
private static readonly Stack<IUXPanel> EnableQueue = new();
2023-06-15 21:52:13 +08:00
/// <summary>
/// 已启用面板
/// </summary>
2023-06-19 00:41:44 +08:00
private static readonly Stack<IUXPanel> EnabledPanels = new();
2023-06-15 21:52:13 +08:00
/// <summary>
2023-06-29 01:01:52 +08:00
/// 历史面板
2023-06-15 21:52:13 +08:00
/// </summary>
2023-06-29 01:01:52 +08:00
private static readonly Stack<IUXPanel> History = new();
2023-06-15 21:52:13 +08:00
/// <summary>
/// 正在播放过渡动画的面板
/// </summary>
private static readonly Stack<IUXPanel> TransitionPanles = new();
2023-06-19 00:41:44 +08:00
2023-07-03 02:34:01 +08:00
private static InitializationState InitializationState;
2023-09-15 23:02:46 +08:00
2023-06-15 21:52:13 +08:00
public override void _Process(double delta)
{
2023-06-19 00:41:44 +08:00
if (TransitionPanles.Count is not 0) return;
2023-06-29 01:01:52 +08:00
while (UnRegistryQueue.TryDequeue(out var result))
{
Panels.Remove(result.Index);
}
2023-07-03 02:34:01 +08:00
2023-06-19 00:41:44 +08:00
while (RegistryQueue.TryDequeue(out var result))
{
Panels.Add(result.Index, result);
2023-07-03 02:34:01 +08:00
if (InitializationState is InitializationState.Initialized)
result.Exit();
2023-06-19 00:41:44 +08:00
}
2023-07-03 02:34:01 +08:00
if (!EnableQueue.TryPop(out var next)) return;
if (InitializationState is InitializationState.None)
2023-06-19 00:41:44 +08:00
{
2023-07-03 02:34:01 +08:00
foreach (var x in Panels)
2023-06-19 00:41:44 +08:00
{
2023-07-03 02:34:01 +08:00
x.Value.Exit();
2023-06-19 00:41:44 +08:00
}
2023-07-03 02:34:01 +08:00
InitializationState=InitializationState.Initialized;
}
while (EnabledPanels.TryPop(out var enabledPanel))
{
enabledPanel.Exit();
2023-06-19 00:41:44 +08:00
}
2023-07-03 02:34:01 +08:00
next.Entry();
EnabledPanels.Push(next);
History.Push(next);
2023-06-15 21:52:13 +08:00
}
2023-09-15 23:02:46 +08:00
void IUXService.Register(IUXPanel panel)=>Register(panel);
void IUXService.UnRegister(IUXPanel panel)=>UnRegister(panel);
void IUXService.Entry<T>() => Open<T>();
void IUXService.Return() => Return();
void IUXService.Entry(IUXPanel panel) => Open(panel);
void IUXService.Entry(string panelName) => Open(panelName);
2023-06-15 21:52:13 +08:00
}