import { ViewManager } from "db://assets/Scripts/Main/Manager/ViewManager"; import { UITransitionHelper } from "../utils/UITransitionHelper"; import GameRootUI from "../../Main/Common/GameRootUI"; /** * 导航管理器 * * 负责管理游戏中的页面导航和路由,将导航逻辑从业务逻辑中分离出来 * * @author AI Chat System * @version 1.0.0 */ export class NavigationManager { private static _instance: NavigationManager; /** * 获取NavigationManager的单例实例 * * @returns {NavigationManager} 导航管理器实例 * @static */ public static get Instance(): NavigationManager { if (!this._instance) { this._instance = new NavigationManager(); } return this._instance; } private constructor() {} /** * 进入角色列表页面 * * @param {number} themeId - 主题ID,用于筛选角色 * * @example * ```typescript * NavigationManager.Instance.navigateToGirlList(1); * ``` */ public navigateToGirlList(themeId: number): void { if (themeId == null || themeId < 0) { console.warn("Invalid theme ID for girl list navigation:", themeId); return; } GameRootUI.I.hideDefaultView(); console.log(`Navigating to girl list with theme ID: ${themeId}`); ViewManager.I.openBundlesView("GirlListPanel", themeId); } /** * 进入聊天页面 * * @param {number} roleId - 角色ID * * @example * ```typescript * NavigationManager.Instance.navigateToChat(10001); * ``` */ public navigateToChat(roleId: number): void { if (roleId == null || roleId <= 0) { console.warn("Invalid role ID for chat navigation:", roleId); return; } console.log(`Navigating to chat with role ID: ${roleId}`); ViewManager.I.openBundlesView("ChatPanel", roleId); } /** * 带过渡动画进入聊天页面 * 从GirlDetailPanel平滑过渡到ChatPanel * * @param {number} roleId - 角色ID * @param {any} currentPanel - 当前面板实例(GirlDetailPanel) * * @example * ```typescript * NavigationManager.Instance.navigateToChatWithTransition(10001, this); * ``` */ public navigateToChatWithTransition( roleId: number, currentPanel?: any ): void { if (roleId == null || roleId <= 0) { console.warn( "Invalid role ID for chat navigation with transition:", roleId ); return; } console.log(`Navigating to chat with transition, role ID: ${roleId}`); // 打开ChatPanel,同时标记需要执行滑入动画 ViewManager.I.openBundlesView( "ChatPanel", { roleId: roleId, withSlideTransition: true, }, (chatNode) => { // ChatPanel打开后,如果有当前面板,执行滑出动画 if (currentPanel && currentPanel.node && currentPanel.node.isValid) { UITransitionHelper.slideOutToLeft(currentPanel.node, 0.3, () => { // 滑出动画完成后关闭原面板 if ( currentPanel.onClose && typeof currentPanel.onClose === "function" ) { currentPanel.onClose(); } }); } } ); } /** * 进入角色详情页面 * * @param {number} roleId - 角色ID * * @example * ```typescript * NavigationManager.Instance.navigateToGirlDetail(10001); * ``` */ public navigateToGirlDetail(roleId: number): void { if (roleId == null || roleId <= 0) { console.warn("Invalid role ID for detail navigation:", roleId); return; } console.log(`Navigating to girl detail with role ID: ${roleId}`); ViewManager.I.openBundlesView("GirlDetailPanel", roleId); } /** * 返回主界面 * * @example * ```typescript * NavigationManager.Instance.navigateToMainMenu(); * ``` */ public navigateToMainMenu(): void { console.log("Navigating to main menu"); // TODO: 实现返回主界面的逻辑 // ViewManager.I.openBundlesView("MainMenu"); } /** * 检查是否可以导航到指定页面 * * @param {string} pageName - 页面名称 * @returns {boolean} 是否可以导航 */ public canNavigateTo(pageName: string): boolean { const allowedPages = ["GirlListPanel", "ChatPanel", "GirlDetailPanel"]; return allowedPages.indexOf(pageName) >= 0; } /** * 获取当前页面的导航历史(预留功能) * * @returns {string[]} 导航历史数组 */ public getNavigationHistory(): string[] { // TODO: 实现导航历史记录功能 console.log("Navigation history feature not implemented yet"); return []; } /** * 返回上一页(预留功能) */ public goBack(): void { // TODO: 实现返回上一页功能 console.log("Go back feature not implemented yet"); } }