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