This commit is contained in:
2025-10-10 18:21:33 +08:00
parent ea914bd167
commit 4d730fe9cb
19 changed files with 2118 additions and 1239 deletions
@@ -27,7 +27,7 @@ export enum PageTransitionType {
*/
export enum PanelType {
THEME = "ThemePanel",
GIRL_DETAIL = "GirlDetailPanel",
RANK = "RankPanel",
PAST_GIRL_LIST = "PastGirlListPanel",
PERSONAL = "PersonalPanel",
}
@@ -49,6 +49,7 @@ export interface SubPanelAnimationConfig {
openAnimation: PageTransitionType;
closeAnimation: PageTransitionType;
duration?: number;
hideBasePanel?: boolean; // 是否隐藏basePanel,用于全屏子面板
}
/**
@@ -195,6 +196,9 @@ export class NavigationManager {
private subPanelAnimationConfigs: Map<Node, SubPanelAnimationConfig> =
new Map();
// 隐藏的basePanel映射:subPanel -> basePanel
private hiddenBasePanels: Map<Node, Node> = new Map();
// 弹窗管理相关属性
private popupPanels: Set<Node> = new Set(); // 管理所有打开的弹窗
@@ -330,9 +334,16 @@ export class NavigationManager {
openAnimation: PageTransitionType.SCALE,
closeAnimation: PageTransitionType.SCALE,
duration: 0.3,
hideBasePanel: false,
};
const config = animationConfig || defaultConfig;
// 如果需要隐藏basePanel,在打开动画前隐藏
if (config.hideBasePanel && basePanel.active) {
logger.log(`[NavigationManager] 隐藏basePanel: ${basePanel.name}`);
basePanel.active = false;
}
const callback = (n: Node) => {
if (!n || !n.isValid) {
logger.error(
@@ -359,6 +370,12 @@ export class NavigationManager {
// 存储动画配置
this.subPanelAnimationConfigs.set(n, config);
// 如果配置了隐藏basePanel,记录映射关系
if (config.hideBasePanel) {
this.hiddenBasePanels.set(n, basePanel);
logger.log(`[NavigationManager] 记录隐藏映射: ${n.name} -> ${basePanel.name}`);
}
// 执行打开动画
this.playSubPanelOpenAnimation(n, config);
};
@@ -592,11 +609,22 @@ export class NavigationManager {
openAnimation: PageTransitionType.SCALE,
closeAnimation: PageTransitionType.SCALE,
duration: 0.3,
hideBasePanel: false,
};
}
// 执行关闭动画
this.playSubPanelCloseAnimation(panelNode, config, () => {
// 如果隐藏了basePanel,需要恢复显示
if (this.hiddenBasePanels.has(panelNode)) {
const basePanel = this.hiddenBasePanels.get(panelNode);
if (basePanel && basePanel.isValid) {
logger.log(`[NavigationManager] 恢复显示basePanel: ${basePanel.name}`);
basePanel.active = true;
}
this.hiddenBasePanels.delete(panelNode);
}
// 从管理映射中移除
this.removeSubPanelFromMappings(panelNode);
@@ -643,6 +671,11 @@ export class NavigationManager {
if (this.subPanelAnimationConfigs.has(panelNode)) {
this.subPanelAnimationConfigs.delete(panelNode);
}
// 移除隐藏映射
if (this.hiddenBasePanels.has(panelNode)) {
this.hiddenBasePanels.delete(panelNode);
}
}
/**
@@ -652,7 +685,7 @@ export class NavigationManager {
switch (panelType) {
case PanelType.THEME:
return 0;
case PanelType.GIRL_DETAIL:
case PanelType.RANK:
return 1;
case PanelType.PAST_GIRL_LIST:
return 2;
@@ -671,8 +704,8 @@ export class NavigationManager {
switch (node.name) {
case "ThemePanel":
return PanelType.THEME;
case "GirlDetailPanel":
return PanelType.GIRL_DETAIL;
case "RankPanel":
return PanelType.RANK;
case "PastGirlListPanel":
return PanelType.PAST_GIRL_LIST;
case "PersonalPanel":
@@ -696,12 +729,8 @@ export class NavigationManager {
* 获取面板数据
*/
private getPanelData(panelType: PanelType): any {
switch (panelType) {
case PanelType.GIRL_DETAIL:
return this.selectedGirlId; // 使用当前选中的角色ID
default:
return null;
}
// 所有主页面都不需要特殊数据
return null;
}
/**