using System.Collections.Generic; using System; using GFramework.Game.Abstractions.ui; using Godot; namespace GFramework.Godot.ui; /// /// Godot平台的UI根节点实现 /// 用于管理UI页面的添加、移除和层级排序 /// public partial class GodotUiRoot : Node, IUiRoot { /// /// UI节点的父容器,所有UI页面都添加到这个节点下 /// private Node? _uiContainer; /// /// UI页面的追踪字典,记录每个页面的节点 /// private readonly Dictionary _pageNodes = new(); public override void _Ready() { // 创建UI容器节点 _uiContainer = new Node { Name = "UiContainer" }; AddChild(_uiContainer); } /// /// 向UI根节点添加子页面 /// public void AddUiPage(IUiPageBehavior child) { if (_uiContainer == null) throw new InvalidOperationException("UiContainer is not initialized"); var node = GetNodeFromPage(child); if (node == null) throw new InvalidOperationException($"Page node is null: {child.Key}"); if (_pageNodes.ContainsKey(child)) return; _pageNodes[child] = node; if (node.GetParent() != _uiContainer) { _uiContainer.AddChild(node); } } /// /// 向UI根节点添加子页面到指定层级 /// public void AddUiPage(IUiPageBehavior child, int zOrder = 0) { AddUiPage(child); SetZOrder(child, zOrder); } /// /// 从UI根节点移除子页面 /// public void RemoveUiPage(IUiPageBehavior child) { if (!_pageNodes.TryGetValue(child, out var node)) return; _pageNodes.Remove(child); if (_uiContainer != null && node.GetParent() == _uiContainer) { _uiContainer.RemoveChild(node); } } /// /// 设置页面的Z-order(层级顺序) /// public void SetZOrder(IUiPageBehavior page, int zOrder) { if (!_pageNodes.TryGetValue(page, out var node)) return; if (node is CanvasItem canvasItem) { canvasItem.ZIndex = zOrder; } } /// /// 获取当前所有显示的页面 /// public IReadOnlyList GetVisiblePages() { return _pageNodes.Keys.ToList().AsReadOnly(); } /// /// 强制刷新UI层级排序 /// public void RefreshLayerOrder() { if (_uiContainer == null) return; _uiContainer.MoveChild(_uiContainer.GetChild(0), 0); } /// /// 从页面行为获取对应的节点 /// private static Node? GetNodeFromPage(IUiPageBehavior page) { return page.View as Node; } }