GeWuYou 4afa856fdc refactor(game): 重构路由系统并优化CI测试流程
- 将SceneRouterBase和UiRouterBase继承自新的RouterBase基类
- 移除原有的守卫管理相关代码,统一使用基类实现
- 更新路由栈操作使用基类提供的Stack属性
- 重写Current、Contains等方法以使用基类实现
- 在CI工作流中启用并发测试执行以提升性能
- 添加等待步骤确保并发测试完成
- 更新项目文件排除测试项目的编译
- 在解决方案文件中添加GFramework.Game.Tests项目引用
- 新增RouterBase基类提供通用路由管理功能
2026-03-17 15:01:55 +08:00

190 lines
7.5 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.Systems;
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>
ValueTask PushAsync(string uiKey, IUiPageEnterParam? param = null,
UiTransitionPolicy policy = UiTransitionPolicy.Exclusive);
/// <summary>
/// 将已存在的UI页面压入路由栈
/// 用于预挂载节点或调试场景
/// </summary>
/// <param name="page">已创建的UI页面行为实例</param>
/// <param name="param">进入界面的参数,可为空</param>
/// <param name="policy">界面切换策略,默认为Exclusive(独占)</param>
ValueTask PushAsync(IUiPageBehavior page, IUiPageEnterParam? param = null,
UiTransitionPolicy policy = UiTransitionPolicy.Exclusive);
/// <summary>
/// 弹出路由栈顶的UI界面返回到上一个界面
/// </summary>
/// <param name="policy">界面弹出策略默认为Destroy销毁</param>
ValueTask PopAsync(UiPopPolicy policy = UiPopPolicy.Destroy);
/// <summary>
/// 替换当前所有页面为新页面基于uiKey
/// </summary>
/// <param name="uiKey">新UI页面标识符</param>
/// <param name="param">页面进入参数,可为空</param>
/// <param name="popPolicy">弹出页面时的销毁策略,默认为销毁</param>
/// <param name="pushPolicy">推入页面时的过渡策略,默认为独占</param>
public ValueTask ReplaceAsync(
string uiKey,
IUiPageEnterParam? param = null,
UiPopPolicy popPolicy = UiPopPolicy.Destroy,
UiTransitionPolicy pushPolicy = UiTransitionPolicy.Exclusive);
/// <summary>
/// 替换当前所有页面为已存在的页面(基于实例)
/// </summary>
/// <param name="page">已创建的UI页面行为实例</param>
/// <param name="param">页面进入参数,可为空</param>
/// <param name="popPolicy">弹出页面时的销毁策略,默认为销毁</param>
/// <param name="pushPolicy">推入页面时的过渡策略,默认为独占</param>
public ValueTask ReplaceAsync(
IUiPageBehavior page,
IUiPageEnterParam? param = null,
UiPopPolicy popPolicy = UiPopPolicy.Destroy,
UiTransitionPolicy pushPolicy = UiTransitionPolicy.Exclusive);
/// <summary>
/// 清空所有UI界面重置路由状态
/// </summary>
ValueTask ClearAsync();
/// <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 Layer UI
/// <summary>
/// 在指定层级显示UIOverlay / Modal / Toast等
/// </summary>
/// <param name="uiKey">要显示的UI页面的唯一标识符</param>
/// <param name="layer">UI显示的层级例如 Overlay、Modal 或 Toast</param>
/// <param name="param">可选参数用于传递给UI页面的初始化数据</param>
UiHandle Show(
string uiKey,
UiLayer layer,
IUiPageEnterParam? param = null);
/// <summary>
/// 在指定层级显示UI基于已存在实例
/// </summary>
UiHandle Show(IUiPageBehavior page, UiLayer layer);
/// <summary>
/// 隐藏指定层级的UI。
/// </summary>
/// <param name="handle">UI句柄用于标识具体的UI实例。</param>
/// <param name="layer">指定UI所在的层级。</param>
/// <param name="destroy">是否销毁UI对象默认为false表示仅隐藏而不销毁。</param>
void Hide(UiHandle handle, UiLayer layer, bool destroy = false);
/// <summary>
/// 恢复指定层级的UI显示。
/// </summary>
/// <param name="handle">UI句柄用于标识具体的UI实例。</param>
/// <param name="layer">指定UI所在的层级。</param>
void Resume(UiHandle handle, UiLayer layer);
/// <summary>
/// 清空指定层级的所有UI。
/// </summary>
/// <param name="layer">要清空的UI层级。</param>
/// <param name="destroy">是否销毁UI实例。如果为true则会销毁UI实例否则仅从层级中移除。</param>
void ClearLayer(UiLayer layer, bool destroy = false);
/// <summary>
/// 从指定层级获取UI实例。
/// </summary>
/// <param name="handle">UI句柄用于标识具体的UI实例。</param>
/// <param name="layer">要查询的UI层级。</param>
/// <returns>返回与指定键关联的UI行为接口实例如果未找到则返回null。</returns>
UiHandle? GetFromLayer(UiHandle handle, UiLayer layer);
/// <summary>
/// 从指定层级获取所有与给定UI键关联的UI实例。
/// </summary>
/// <param name="uiKey">用于标识UI实例的键。</param>
/// <param name="layer">要查询的UI层级。</param>
/// <returns>返回一个只读列表包含所有与指定键和层级关联的UI句柄如果未找到则返回空列表。</returns>
IReadOnlyList<UiHandle> GetAllFromLayer(string uiKey, UiLayer layer);
/// <summary>
/// 判断指定层级是否存在可见UI。
/// </summary>
/// <param name="handle">UI句柄用于标识具体的UI实例。</param>
/// <param name="layer">要检查的UI层级。</param>
/// <returns>如果在指定层级中存在可见的UI则返回true否则返回false。</returns>
bool HasVisibleInLayer(UiHandle handle, UiLayer layer);
/// <summary>
/// 根据UI键隐藏指定层级中的UI。
/// </summary>
/// <param name="uiKey">UI的唯一标识键。</param>
/// <param name="layer">要操作的UI层级。</param>
/// <param name="destroy">是否销毁UI实例默认为false。</param>
/// <param name="hideAll">是否隐藏所有匹配的UI实例默认为false。</param>
void HideByKey(string uiKey, UiLayer layer, bool destroy = false, bool hideAll = false);
#endregion
}