正确移除标签页

This commit is contained in:
zqm
2026-01-08 14:51:40 +08:00
parent e4354d07bc
commit 40da33a81e

View File

@@ -262,13 +262,12 @@ const onPanelClose = (event) => {
const areaId = event.areaId; const areaId = event.areaId;
const panelId = event.panelId; const panelId = event.panelId;
if (shouldOperateAreaInsteadOfPanel(areaId)) { // 始终只关闭面板不关闭整个Area除非没有剩余面板
onCloseFloatingArea({ areaId });
} else {
panelActions.close(panelId, areaId); panelActions.close(panelId, areaId);
const area = floatingAreas.value.find(a => a.id === areaId); const area = floatingAreas.value.find(a => a.id === areaId);
if (area && area.children) { if (area && area.children) {
for (const child of area.children) { const areaChildrenArray = Array.isArray(area.children) ? area.children : [area.children];
for (const child of areaChildrenArray) {
if (child.type === 'TabPage' && child.children) { if (child.type === 'TabPage' && child.children) {
// 处理TabPage的children可能是单个Panel或Panel数组 // 处理TabPage的children可能是单个Panel或Panel数组
const isArray = Array.isArray(child.children); const isArray = Array.isArray(child.children);
@@ -283,18 +282,28 @@ const onPanelClose = (event) => {
child.children.splice(i, 1); child.children.splice(i, 1);
} else { } else {
// 如果是单个Panel移除整个TabPage // 如果是单个Panel移除整个TabPage
const tabPageIndex = area.children.indexOf(child); const tabPageIndex = areaChildrenArray.indexOf(child);
if (tabPageIndex !== -1) { if (tabPageIndex !== -1) {
if (Array.isArray(area.children)) {
area.children.splice(tabPageIndex, 1); area.children.splice(tabPageIndex, 1);
} else {
// 如果area.children是单个对象直接设为null
area.children = null;
}
} }
break; break;
} }
// 如果Panel数组为空移除TabPage // 如果Panel数组为空移除TabPage
if (child.children.length === 0) { if (Array.isArray(child.children) && child.children.length === 0) {
const tabPageIndex = area.children.indexOf(child); const tabPageIndex = areaChildrenArray.indexOf(child);
if (tabPageIndex !== -1) { if (tabPageIndex !== -1) {
if (Array.isArray(area.children)) {
area.children.splice(tabPageIndex, 1); area.children.splice(tabPageIndex, 1);
} else {
// 如果area.children是单个对象直接设为null
area.children = null;
}
} }
} }
break; break;
@@ -304,6 +313,27 @@ const onPanelClose = (event) => {
} }
} }
} }
// 检查Area是否还有子元素如果没有关闭整个Area
if (area && area.children) {
let hasChildren = false;
const areaChildrenArray = Array.isArray(area.children) ? area.children : [area.children];
for (const child of areaChildrenArray) {
if (child.type === 'TabPage' && child.children) {
const tabChildrenArray = Array.isArray(child.children) ? child.children : [child.children];
if (tabChildrenArray.length > 0) {
hasChildren = true;
break;
}
}
}
if (!hasChildren) {
onCloseFloatingArea({ areaId });
}
} else {
// Area没有children直接关闭
onCloseFloatingArea({ areaId });
} }
}; };
@@ -492,39 +522,76 @@ const onTabClose = async (data) => {
console.log(`✅ 找到目标Area和TabPage:`, { areaId, tabPageId, panelId }); console.log(`✅ 找到目标Area和TabPage:`, { areaId, tabPageId, panelId });
// 2. 调用TabPageActions处理关闭请求 // 2. 调用PanelHandler的close方法回收Panel资源
panelActions.close(panelId, areaId);
console.log(`📌 调用PanelHandler回收Panel资源`);
// 3. 调用TabPageActions处理关闭请求
await tabPageActions.requestClose(tabPageId, areaId); await tabPageActions.requestClose(tabPageId, areaId);
// 3. 移除Panel // 4. 移除Panel
if (Array.isArray(targetTabPage.children)) { if (Array.isArray(targetTabPage.children)) {
targetTabPage.children.splice(panelIndex, 1); targetTabPage.children.splice(panelIndex, 1);
console.log(`📌 从TabPage移除Panel后剩余Panel数量: ${targetTabPage.children.length}`); console.log(`📌 从TabPage移除Panel后剩余Panel数量: ${targetTabPage.children.length}`);
} else { } else {
// 当TabPage只有一个Panel时我们将children设置为null
// 这样shouldShowTabs计算属性会返回false不显示标签栏
// 但TabPage仍然存在
targetTabPage.children = null; targetTabPage.children = null;
console.log(`📌 移除了唯一的Panel`); console.log(`📌 移除了唯一的PanelTabPage不显示标签栏`);
} }
// 4. 如果TabPage有子元素移除整个TabPage // 5. 检查TabPage是否还有子元素
if (!targetTabPage.children || (Array.isArray(targetTabPage.children) && targetTabPage.children.length === 0)) { // 当targetTabPage.children为null时TabPage仍然存在只是不显示标签栏
// 从Area的children中移除TabPage // 只有当children为undefined或空数组时才认为TabPage没有子元素
targetArea.children = null; let hasTabPageChildren = true;
if (Array.isArray(targetTabPage.children)) {
hasTabPageChildren = targetTabPage.children.length > 0;
} else if (targetTabPage.children === undefined) {
hasTabPageChildren = false;
}
// 6. 只有当TabPage没有任何子元素时才移除TabPage
if (!hasTabPageChildren) {
console.log(`📌 TabPage已无Panel移除TabPage`); console.log(`📌 TabPage已无Panel移除TabPage`);
// 7. 实际从Area的children中移除TabPage
if (Array.isArray(targetArea.children)) {
const tabPageIndex = targetArea.children.indexOf(targetTabPage);
if (tabPageIndex !== -1) {
targetArea.children.splice(tabPageIndex, 1);
}
} else {
// 如果Area的children是单个TabPage直接设为null
targetArea.children = null;
} }
// 5. 更新floatingAreas中的Area配置 // 8. 检查Area是否还有子元素
let hasAreaChildren = false;
if (Array.isArray(targetArea.children)) {
hasAreaChildren = targetArea.children.length > 0;
} else {
hasAreaChildren = !!targetArea.children;
}
// 9. 只有当Area没有任何子元素时才关闭整个Area
if (!hasAreaChildren) {
console.log(`📌 Area已无子元素关闭整个Area`);
onCloseFloatingArea({ areaId });
return;
}
}
// 10. 更新floatingAreas中的Area配置
const areaIndex = floatingAreas.value.findIndex(a => a.id === areaId); const areaIndex = floatingAreas.value.findIndex(a => a.id === areaId);
if (areaIndex !== -1) { if (areaIndex !== -1) {
floatingAreas.value[areaIndex] = { ...targetArea }; floatingAreas.value[areaIndex] = { ...targetArea };
console.log(`📌 更新floatingAreas中的Area配置`); console.log(`📌 更新floatingAreas中的Area配置`);
// 6. 触发Area更新事件确保状态同步 // 11. 触发Area更新事件确保状态同步
areaActions.updateState(areaId, { children: targetArea.children }); areaActions.updateState(areaId, { children: targetArea.children });
console.log(`📌 触发Area更新事件`); console.log(`📌 触发Area更新事件`);
// 7. 调用PanelHandler的close方法回收Panel资源
panelActions.close(panelId, areaId);
console.log(`📌 调用PanelHandler回收Panel资源`);
console.log(`✅ 成功移除标签页和回收Panel: areaId=${areaId}, panelId=${panelId}`); console.log(`✅ 成功移除标签页和回收Panel: areaId=${areaId}, panelId=${panelId}`);
} }
} catch (error) { } catch (error) {
@@ -642,7 +709,7 @@ const setupEventListeners = () => {
// Panel相关事件 // Panel相关事件
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_TOGGLE_COLLAPSE, () => emit('toggleCollapse'), { componentId: 'dock-layout' })); unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_TOGGLE_COLLAPSE, () => emit('toggleCollapse'), { componentId: 'dock-layout' }));
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_MAXIMIZE, onMaximize, { componentId: 'dock-layout' })); unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_MAXIMIZE, onMaximize, { componentId: 'dock-layout' }));
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_CLOSE_REQUEST, onCloseFloatingArea, { componentId: 'dock-layout' })); unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_CLOSE_REQUEST, onPanelClose, { componentId: 'dock-layout' }));
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_CLOSE, onPanelClose, { componentId: 'dock-layout' })); unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_CLOSE, onPanelClose, { componentId: 'dock-layout' }));
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_TOGGLE_TOOLBAR, () => emit('toggleToolbar'), { componentId: 'dock-layout' })); unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_TOGGLE_TOOLBAR, () => emit('toggleToolbar'), { componentId: 'dock-layout' }));
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_MAXIMIZE_SYNC, onPanelMaximizeSync, { componentId: 'dock-layout' })); unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.PANEL_MAXIMIZE_SYNC, onPanelMaximizeSync, { componentId: 'dock-layout' }));