using GFramework.Core.Abstractions.system; using GFramework.Game.Abstractions.enums; namespace GFramework.Game.Abstractions.ui; /// /// UI路由管理器接口,用于管理UI界面的导航和切换操作 /// public interface IUiRouter : ISystem { /// /// 获取当前UI栈深度 /// int Count { get; } /// /// 绑定UI根节点 /// /// UI根节点接口实例 void BindRoot(IUiRoot root); /// /// 将指定的UI界面压入路由栈,显示新的UI界面 /// /// UI界面的唯一标识符 /// 进入界面的参数,可为空 /// 界面切换策略,默认为Exclusive(独占) ValueTask PushAsync(string uiKey, IUiPageEnterParam? param = null, UiTransitionPolicy policy = UiTransitionPolicy.Exclusive); /// /// 将已存在的UI页面压入路由栈 /// 用于预挂载节点或调试场景 /// /// 已创建的UI页面行为实例 /// 进入界面的参数,可为空 /// 界面切换策略,默认为Exclusive(独占) ValueTask PushAsync(IUiPageBehavior page, IUiPageEnterParam? param = null, UiTransitionPolicy policy = UiTransitionPolicy.Exclusive); /// /// 弹出路由栈顶的UI界面,返回到上一个界面 /// /// 界面弹出策略,默认为Destroy(销毁) ValueTask PopAsync(UiPopPolicy policy = UiPopPolicy.Destroy); /// /// 替换当前所有页面为新页面(基于uiKey) /// /// 新UI页面标识符 /// 页面进入参数,可为空 /// 弹出页面时的销毁策略,默认为销毁 /// 推入页面时的过渡策略,默认为独占 public ValueTask ReplaceAsync( string uiKey, IUiPageEnterParam? param = null, UiPopPolicy popPolicy = UiPopPolicy.Destroy, UiTransitionPolicy pushPolicy = UiTransitionPolicy.Exclusive); /// /// 替换当前所有页面为已存在的页面(基于实例) /// /// 已创建的UI页面行为实例 /// 页面进入参数,可为空 /// 弹出页面时的销毁策略,默认为销毁 /// 推入页面时的过渡策略,默认为独占 public ValueTask ReplaceAsync( IUiPageBehavior page, IUiPageEnterParam? param = null, UiPopPolicy popPolicy = UiPopPolicy.Destroy, UiTransitionPolicy pushPolicy = UiTransitionPolicy.Exclusive); /// /// 清空所有UI界面,重置路由状态 /// ValueTask ClearAsync(); /// /// 注册UI切换处理器 /// /// 处理器实例 /// 执行选项 void RegisterHandler(IUiTransitionHandler handler, UiTransitionHandlerOptions? options = null); /// /// 注销UI切换处理器 /// /// 处理器实例 void UnregisterHandler(IUiTransitionHandler handler); /// /// 获取当前栈顶UI的Key /// /// 当前UI Key,如果栈为空返回空字符串 string PeekKey(); /// /// 获取当前栈顶的UI页面行为对象 /// /// 栈顶的IUiPageBehavior对象,如果栈为空则返回null IUiPageBehavior? Peek(); /// /// 判断指定UI是否为当前栈顶UI /// bool IsTop(string uiKey); /// /// 判断指定UI是否存在于UI栈中 /// bool Contains(string uiKey); #region 路由守卫 /// /// 注册路由守卫 /// /// 守卫实例 void AddGuard(IUiRouteGuard guard); /// /// 注册路由守卫(泛型方法) /// /// 守卫类型,必须实现 IUiRouteGuard 且有无参构造函数 void AddGuard() where T : IUiRouteGuard, new(); /// /// 移除路由守卫 /// /// 守卫实例 void RemoveGuard(IUiRouteGuard guard); #endregion #region Layer UI /// /// 在指定层级显示UI(Overlay / Modal / Toast等) /// /// 要显示的UI页面的唯一标识符 /// UI显示的层级,例如 Overlay、Modal 或 Toast /// 可选参数,用于传递给UI页面的初始化数据 UiHandle Show( string uiKey, UiLayer layer, IUiPageEnterParam? param = null); /// /// 在指定层级显示UI(基于已存在实例) /// UiHandle Show(IUiPageBehavior page, UiLayer layer); /// /// 隐藏指定层级的UI。 /// /// UI句柄,用于标识具体的UI实例。 /// 指定UI所在的层级。 /// 是否销毁UI对象,默认为false,表示仅隐藏而不销毁。 void Hide(UiHandle handle, UiLayer layer, bool destroy = false); /// /// 恢复指定层级的UI显示。 /// /// UI句柄,用于标识具体的UI实例。 /// 指定UI所在的层级。 void Resume(UiHandle handle, UiLayer layer); /// /// 清空指定层级的所有UI。 /// /// 要清空的UI层级。 /// 是否销毁UI实例。如果为true,则会销毁UI实例;否则仅从层级中移除。 void ClearLayer(UiLayer layer, bool destroy = false); /// /// 从指定层级获取UI实例。 /// /// UI句柄,用于标识具体的UI实例。 /// 要查询的UI层级。 /// 返回与指定键关联的UI行为接口实例;如果未找到则返回null。 UiHandle? GetFromLayer(UiHandle handle, UiLayer layer); /// /// 从指定层级获取所有与给定UI键关联的UI实例。 /// /// 用于标识UI实例的键。 /// 要查询的UI层级。 /// 返回一个只读列表,包含所有与指定键和层级关联的UI句柄;如果未找到则返回空列表。 IReadOnlyList GetAllFromLayer(string uiKey, UiLayer layer); /// /// 判断指定层级是否存在可见UI。 /// /// UI句柄,用于标识具体的UI实例。 /// 要检查的UI层级。 /// 如果在指定层级中存在可见的UI,则返回true;否则返回false。 bool HasVisibleInLayer(UiHandle handle, UiLayer layer); /// /// 根据UI键隐藏指定层级中的UI。 /// /// UI的唯一标识键。 /// 要操作的UI层级。 /// 是否销毁UI实例,默认为false。 /// 是否隐藏所有匹配的UI实例,默认为false。 void HideByKey(string uiKey, UiLayer layer, bool destroy = false, bool hideAll = false); #endregion }