diff --git a/GFramework.Game.Abstractions/ui/IUiRoot.cs b/GFramework.Game.Abstractions/ui/IUiRoot.cs index 9f6d105..4a29eb0 100644 --- a/GFramework.Game.Abstractions/ui/IUiRoot.cs +++ b/GFramework.Game.Abstractions/ui/IUiRoot.cs @@ -26,17 +26,4 @@ public interface IUiRoot /// /// 要移除的UI页面子节点 void RemoveUiPage(IUiPageBehavior child); - - /// - /// 设置页面的Z-order(层级顺序) - /// - /// UI页面 - /// Z-order值 - void SetZOrder(IUiPageBehavior page, int zOrder); - - /// - /// 获取当前所有显示的页面 - /// - /// 所有显示的页面列表 - IReadOnlyList GetVisiblePages(); } \ No newline at end of file diff --git a/GFramework.Godot/ui/GodotUiRoot.cs b/GFramework.Godot/ui/GodotUiRoot.cs deleted file mode 100644 index e6430b8..0000000 --- a/GFramework.Godot/ui/GodotUiRoot.cs +++ /dev/null @@ -1,134 +0,0 @@ -using GFramework.Game.Abstractions.enums; -using GFramework.Game.Abstractions.ui; -using Godot; - -namespace GFramework.Godot.ui; - -/// -/// Godot平台的UI根节点实现 -/// 用于管理UI页面的添加、移除和层级排序 -/// -public partial class GodotUiRoot(IReadOnlyDictionary? layerZOrderMap) : Node, IUiRoot -{ - /// - /// UI层级与Z轴顺序的映射表,定义了不同UI层的渲染优先级 - /// - /// - /// 默认层级映射关系: - /// - Page: 0 (基础页面层) - /// - Overlay: 100 (覆盖层) - /// - Modal: 200 (模态窗口层) - /// - Toast: 300 (提示消息层) - /// - Topmost: 400 (最顶层) - /// - private readonly IReadOnlyDictionary _layerZOrderMap = layerZOrderMap ?? - new Dictionary - { - { UiLayer.Page, 0 }, - { UiLayer.Overlay, 100 }, - { UiLayer.Modal, 200 }, - { UiLayer.Toast, 300 }, - { UiLayer.Topmost, 400 } - }; - - /// - /// UI页面的追踪字典,记录每个页面的节点 - /// - private readonly Dictionary _pageNodes = new(); - - /// - /// UI节点的父容器,所有UI页面都添加到这个节点下 - /// - private Node? _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.TryAdd(child, node)) - return; - - if (node.GetParent() != _uiContainer) _uiContainer.AddChild(node); - } - - /// - /// 向UI根节点添加子页面到指定层级 - /// - public void AddUiPage( - IUiPageBehavior child, - UiLayer layer, - int orderInLayer = 0) - { - AddUiPage(child); - - var z = GetBaseZOrder(layer) + orderInLayer; - SetZOrder(child, z); - } - - - /// - /// 从UI根节点移除子页面 - /// - public void RemoveUiPage(IUiPageBehavior child) - { - if (!_pageNodes.Remove(child, out var node)) - return; - - 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(); - } - - - public override void _Ready() - { - // 创建UI容器节点 - _uiContainer = new Node - { - Name = "UiContainer" - }; - - AddChild(_uiContainer); - } - - - /// - /// 从页面行为获取对应的节点 - /// - private static Node? GetNodeFromPage(IUiPageBehavior page) - { - return page.View as Node; - } - - private int GetBaseZOrder(UiLayer layer) - { - return !_layerZOrderMap.TryGetValue(layer, out var z) - ? throw new ArgumentOutOfRangeException(nameof(layer), layer, null) - : z; - } -} \ No newline at end of file diff --git a/GFramework.Godot/ui/ModalLayerUiPageBehavior.cs b/GFramework.Godot/ui/ModalLayerUiPageBehavior.cs index 03a4704..4825cf4 100644 --- a/GFramework.Godot/ui/ModalLayerUiPageBehavior.cs +++ b/GFramework.Godot/ui/ModalLayerUiPageBehavior.cs @@ -17,30 +17,35 @@ using Godot; namespace GFramework.Godot.ui; /// -/// 模态层 UI 行为 - 可重入但需谨慎,带遮罩阻止下层交互 +/// 模态层 UI 行为类,用于管理模态界面的行为。 +/// 此类继承自 CanvasItemUiPageBehaviorBase,提供模态层特有的功能: +/// - 支持可重入(IsReentrant = true) +/// - 带有遮罩以阻止下层交互(BlocksInput = true) +/// - 属于模态层级(Layer = UiLayer.Modal) /// +/// 拥有者类型,必须是 CanvasItem 的子类 +/// 当前行为的拥有者对象 +/// 用于标识此行为的键值 public class ModalLayerUiPageBehavior(T owner, string key) : CanvasItemUiPageBehaviorBase(owner, key) where T : CanvasItem { + /// + /// 获取当前 UI 所属的层级,此处固定为模态层。 + /// public override UiLayer Layer => UiLayer.Modal; - public override bool IsReentrant => true; // ✅ 支持重入(如多层确认弹窗) - public override bool IsModal => true; // 模态窗口 - public override bool BlocksInput => true; // 必须阻止下层交互 /// - /// 模态窗口显示时,可以添加遮罩逻辑 + /// 指示当前 UI 是否支持可重入。设置为 true 表示允许重复进入同一界面。 /// - public override void OnShow() - { - base.OnShow(); - // TODO: 可在此添加半透明遮罩层 - // AddModalMask(); - } + public override bool IsReentrant => true; - public override void OnHide() - { - // TODO: 移除遮罩层 - // RemoveModalMask(); - base.OnHide(); - } + /// + /// 指示当前 UI 是否为模态界面。设置为 true 表示该界面会阻止用户与下层界面交互。 + /// + public override bool IsModal => true; + + /// + /// 指示当前 UI 是否阻止输入事件传递到下层界面。设置为 true 表示启用遮罩功能。 + /// + public override bool BlocksInput => true; } \ No newline at end of file diff --git a/GFramework.Godot/ui/TopmostLayerUiPageBehavior.cs b/GFramework.Godot/ui/TopmostLayerUiPageBehavior.cs index 69eeed1..f3c55bd 100644 --- a/GFramework.Godot/ui/TopmostLayerUiPageBehavior.cs +++ b/GFramework.Godot/ui/TopmostLayerUiPageBehavior.cs @@ -17,30 +17,36 @@ using Godot; namespace GFramework.Godot.ui; /// -/// 顶层 UI 行为 - 不可重入,最高优先级,用于系统级弹窗 +/// 顶层 UI 行为类,继承自 CanvasItemUiPageBehaviorBase。 +/// 此类用于实现系统级弹窗行为,具有不可重入、最高优先级和模态特性。 /// +/// 泛型参数,表示拥有此行为的 CanvasItem 类型。 +/// 拥有此行为的 CanvasItem 实例。 +/// 用于标识此行为的唯一键。 public class TopmostLayerUiPageBehavior(T owner, string key) : CanvasItemUiPageBehaviorBase(owner, key) where T : CanvasItem { + /// + /// 获取当前 UI 行为所在的层级。 + /// 返回值为 UiLayer.Topmost,表示该行为位于最顶层。 + /// public override UiLayer Layer => UiLayer.Topmost; - public override bool IsReentrant => false; // ❌ 顶层不支持重入 - public override bool IsModal => true; // 顶层通常是模态的 - public override bool BlocksInput => true; // 必须阻止所有下层交互 /// - /// 顶层显示时,可以禁用所有下层 UI + /// 指示此行为是否可重入。 + /// 返回值为 false,表示不可重入。 /// - public override void OnShow() - { - base.OnShow(); - // TODO: 可在此禁用其他所有层级 - // DisableAllLowerLayers(); - } + public override bool IsReentrant => false; - public override void OnHide() - { - // TODO: 恢复其他层级 - // EnableAllLowerLayers(); - base.OnHide(); - } + /// + /// 指示此行为是否为模态行为。 + /// 返回值为 true,表示为模态行为,会阻止其他交互。 + /// + public override bool IsModal => true; + + /// + /// 指示此行为是否会阻塞输入。 + /// 返回值为 true,表示会阻塞用户输入。 + /// + public override bool BlocksInput => true; } \ No newline at end of file