GeWuYou c9f01f5877 feat(ui): 添加UI层级管理和Godot平台实现
- 在IUiRoot接口中添加Z-order控制和页面层级管理功能
- 实现Godot平台的UiRoot,支持UI页面的添加、移除和层级排序
- 添加UiLayer枚举定义不同UI层级(Page、Overlay、Modal、Toast、Topmost)
- 在IUiRouter中扩展层级管理方法,支持指定层级显示UI
- 实现UiRouterBase中的层级管理逻辑,包括显示、隐藏、清空等操作
- 添加对GodotSharp包的引用以支持Godot平台功能
2026-01-20 09:14:37 +08:00

171 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using GFramework.Core.Abstractions.system;
using GFramework.Game.Abstractions.enums;
namespace GFramework.Game.Abstractions.ui;
/// <summary>
/// UI路由管理器接口用于管理UI界面的导航和切换操作
/// </summary>
public interface IUiRouter : ISystem
{
/// <summary>
/// 获取当前UI栈深度
/// </summary>
int Count { get; }
/// <summary>
/// 绑定UI根节点
/// </summary>
/// <param name="root">UI根节点接口实例</param>
void BindRoot(IUiRoot root);
/// <summary>
/// 将指定的UI界面压入路由栈显示新的UI界面
/// </summary>
/// <param name="uiKey">UI界面的唯一标识符</param>
/// <param name="param">进入界面的参数,可为空</param>
/// <param name="policy">界面切换策略默认为Exclusive独占</param>
/// <param name="instancePolicy">实例管理策略默认为Reuse复用</param>
void Push(string uiKey, IUiPageEnterParam? param = null, UiTransitionPolicy policy = UiTransitionPolicy.Exclusive,
UiInstancePolicy instancePolicy = UiInstancePolicy.Reuse);
/// <summary>
/// 将已存在的UI页面压入路由栈
/// 用于预挂载节点或调试场景
/// </summary>
/// <param name="page">已创建的UI页面行为实例</param>
/// <param name="param">进入界面的参数,可为空</param>
/// <param name="policy">界面切换策略,默认为Exclusive(独占)</param>
void Push(IUiPageBehavior page, IUiPageEnterParam? param = null,
UiTransitionPolicy policy = UiTransitionPolicy.Exclusive);
/// <summary>
/// 弹出路由栈顶的UI界面返回到上一个界面
/// </summary>
/// <param name="policy">界面弹出策略默认为Destroy销毁</param>
void Pop(UiPopPolicy policy = UiPopPolicy.Destroy);
/// <summary>
/// 替换当前所有页面为新页面基于uiKey
/// </summary>
/// <param name="uiKey">新UI页面标识符</param>
/// <param name="param">页面进入参数,可为空</param>
/// <param name="popPolicy">弹出页面时的销毁策略,默认为销毁</param>
/// <param name="pushPolicy">推入页面时的过渡策略,默认为独占</param>
/// <param name="instancePolicy">实例管理策略</param>
public void Replace(
string uiKey,
IUiPageEnterParam? param = null,
UiPopPolicy popPolicy = UiPopPolicy.Destroy,
UiTransitionPolicy pushPolicy = UiTransitionPolicy.Exclusive,
UiInstancePolicy instancePolicy = UiInstancePolicy.Reuse);
/// <summary>
/// 替换当前所有页面为已存在的页面(基于实例)
/// </summary>
/// <param name="page">已创建的UI页面行为实例</param>
/// <param name="param">页面进入参数,可为空</param>
/// <param name="popPolicy">弹出页面时的销毁策略,默认为销毁</param>
/// <param name="pushPolicy">推入页面时的过渡策略,默认为独占</param>
public void Replace(
IUiPageBehavior page,
IUiPageEnterParam? param = null,
UiPopPolicy popPolicy = UiPopPolicy.Destroy,
UiTransitionPolicy pushPolicy = UiTransitionPolicy.Exclusive);
/// <summary>
/// 清空所有UI界面重置路由状态
/// </summary>
void Clear();
/// <summary>
/// 注册UI切换处理器
/// </summary>
/// <param name="handler">处理器实例</param>
/// <param name="options">执行选项</param>
void RegisterHandler(IUiTransitionHandler handler, UiTransitionHandlerOptions? options = null);
/// <summary>
/// 注销UI切换处理器
/// </summary>
/// <param name="handler">处理器实例</param>
void UnregisterHandler(IUiTransitionHandler handler);
/// <summary>
/// 获取当前栈顶UI的Key
/// </summary>
/// <returns>当前UI Key如果栈为空返回空字符串</returns>
string PeekKey();
/// <summary>
/// 获取当前栈顶的UI页面行为对象
/// </summary>
/// <returns>栈顶的IUiPageBehavior对象如果栈为空则返回null</returns>
IUiPageBehavior Peek();
/// <summary>
/// 判断指定UI是否为当前栈顶UI
/// </summary>
bool IsTop(string uiKey);
/// <summary>
/// 判断指定UI是否存在于UI栈中
/// </summary>
bool Contains(string uiKey);
#region
/// <summary>
/// 在指定层级显示UI非栈管理
/// </summary>
/// <param name="uiKey">UI标识符</param>
/// <param name="layer">UI层级</param>
/// <param name="param">进入参数</param>
/// <param name="instancePolicy">实例策略</param>
void Show(
string uiKey,
UiLayer layer,
IUiPageEnterParam? param = null,
UiInstancePolicy instancePolicy = UiInstancePolicy.Reuse);
/// <summary>
/// 在指定层级显示UI基于实例
/// </summary>
/// <param name="page">UI页面实例</param>
/// <param name="layer">UI层级</param>
void Show(IUiPageBehavior page, UiLayer layer);
/// <summary>
/// 隐藏指定层级的UI
/// </summary>
/// <param name="uiKey">UI标识符</param>
/// <param name="layer">UI层级</param>
/// <param name="destroy">是否销毁实例</param>
void Hide(string uiKey, UiLayer layer, bool destroy = false);
/// <summary>
/// 清空指定层级的所有UI
/// </summary>
/// <param name="layer">UI层级</param>
/// <param name="destroy">是否销毁实例</param>
void ClearLayer(UiLayer layer, bool destroy = false);
/// <summary>
/// 获取指定层级的UI实例
/// </summary>
/// <param name="uiKey">UI标识符</param>
/// <param name="layer">UI层级</param>
/// <returns>UI实例不存在则返回null</returns>
IUiPageBehavior? GetFromLayer(string uiKey, UiLayer layer);
/// <summary>
/// 判断指定层级是否有UI显示
/// </summary>
/// <param name="layer">UI层级</param>
/// <returns>是否有UI显示</returns>
bool HasVisibleInLayer(UiLayer layer);
#endregion
}