From bedbea7e7686c3bb8d79669cca09f65e0bcc1b7d Mon Sep 17 00:00:00 2001 From: zqm Date: Thu, 6 Nov 2025 13:32:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DPanel=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=90=8C=E6=AD=A5=EF=BC=9A=E5=BD=93Area?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=8C=96=E6=88=96=E8=BF=98=E5=8E=9F=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86TabPage=E5=B1=82?= =?UTF-8?q?=E7=BA=A7=E7=BB=93=E6=9E=84=EF=BC=8C=E5=90=8C=E6=AD=A5=E6=9B=B4?= =?UTF-8?q?=E6=96=B0Panel=E7=9A=84maximized=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Robot/Web/src/DockLayout/DockLayout.vue | 95 +++++++++++-------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue b/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue index 539cc72..8911f50 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue @@ -159,26 +159,31 @@ const onToggleCollapse = (id) => { const onMaximize = (panelId) => { // 查找包含该面板的区域 for (const area of floatingAreas.value) { - if (area.panels && area.panels.length === 1 && area.panels[0].id === panelId) { - // 当区域只包含一个Panel时,切换Area和Panel的最大化状态 - const isCurrentlyMaximized = area.WindowState === '最大化' || area.WindowState === 'maximized' - - // 使用Vue推荐的方式更新响应式数据 - if (isCurrentlyMaximized) { - // 切换为正常状态 - area.WindowState = '正常' - // 确保Panel也恢复正常状态 - 使用展开运算符创建新对象确保响应式 - area.panels[0] = { ...area.panels[0], maximized: false } - } else { - // 切换为最大化状态 - area.WindowState = '最大化' - // 同时最大化Panel - 使用展开运算符创建新对象确保响应式 - area.panels[0] = { ...area.panels[0], maximized: true } + // 正确处理层级结构:Area -> TabPage -> Panel + if (area.tabPages) { + for (const tabPage of area.tabPages) { + if (tabPage.panels && tabPage.panels.length === 1 && tabPage.panels[0].id === panelId) { + // 当区域只包含一个Panel时,切换Area和Panel的最大化状态 + const isCurrentlyMaximized = area.WindowState === '最大化' || area.WindowState === 'maximized' + + // 使用Vue推荐的方式更新响应式数据 + if (isCurrentlyMaximized) { + // 切换为正常状态 + area.WindowState = '正常' + // 确保Panel也恢复正常状态 - 使用展开运算符创建新对象确保响应式 + tabPage.panels[0] = { ...tabPage.panels[0], maximized: false } + } else { + // 切换为最大化状态 + area.WindowState = '最大化' + // 同时最大化Panel - 使用展开运算符创建新对象确保响应式 + tabPage.panels[0] = { ...tabPage.panels[0], maximized: true } + } + + console.log('Panel最大化按钮触发,切换Area状态:', area.WindowState) + console.log('Panel最大化状态:', tabPage.panels[0].maximized) + break + } } - - console.log('Panel最大化按钮触发,切换Area状态:', area.WindowState) - console.log('Panel最大化状态:', area.panels[0].maximized) - break } } } @@ -207,14 +212,20 @@ const onCloseFloatingArea = (id) => { // 关闭面板 const onClosePanel = (areaId, panelId) => { const area = floatingAreas.value.find(a => a.id === areaId) - if (area && area.panels) { - const panelIndex = area.panels.findIndex(p => p.id === panelId) - if (panelIndex !== -1) { - area.panels.splice(panelIndex, 1) - - // 如果区域内没有面板了,可以考虑关闭整个区域 - if (area.panels.length === 0) { - onCloseFloatingArea(areaId) + // 正确处理层级结构:Area -> TabPage -> Panel + if (area && area.tabPages) { + for (const tabPage of area.tabPages) { + if (tabPage.panels) { + const panelIndex = tabPage.panels.findIndex(p => p.id === panelId) + if (panelIndex !== -1) { + tabPage.panels.splice(panelIndex, 1) + + // 如果区域内没有面板了,可以考虑关闭整个区域 + if (tabPage.panels.length === 0) { + onCloseFloatingArea(areaId) + } + break + } } } } @@ -289,15 +300,20 @@ const onPanelDragEnd = () => { // 监听floatingAreas变化,确保当Area最大化时,Panel也会自动最大化 watch(floatingAreas, (newAreas) => { newAreas.forEach(area => { - // 当区域只包含一个Panel且Area状态变为最大化时,Panel也应该最大化 - if (area.panels && area.panels.length === 1) { - const isAreaMaximized = area.WindowState === '最大化' || area.WindowState === 'maximized'; - const isPanelMaximized = area.panels[0].maximized; - - // 如果状态不一致,更新Panel的maximized属性 - if (isAreaMaximized !== isPanelMaximized) { - area.panels[0] = { ...area.panels[0], maximized: isAreaMaximized }; - console.log(`Area ${area.id} 状态变化,同步Panel最大化状态为:`, isAreaMaximized); + // 正确处理层级结构:Area -> TabPage -> Panel + if (area.tabPages) { + for (const tabPage of area.tabPages) { + // 当区域只包含一个Panel且Area状态变为最大化时,Panel也应该最大化 + if (tabPage.panels && tabPage.panels.length === 1) { + const isAreaMaximized = area.WindowState === '最大化' || area.WindowState === 'maximized'; + const isPanelMaximized = tabPage.panels[0].maximized; + + // 如果状态不一致,更新Panel的maximized属性 + if (isAreaMaximized !== isPanelMaximized) { + tabPage.panels[0] = { ...tabPage.panels[0], maximized: isAreaMaximized }; + console.log(`Area ${area.id} 状态变化,同步Panel最大化状态为:`, isAreaMaximized); + } + } } } }); @@ -307,9 +323,10 @@ watch(floatingAreas, (newAreas) => { const onPanelMaximizeSync = ({ areaId, maximized }) => { // 查找对应的Area const area = floatingAreas.value.find(a => a.id === areaId); - if (area && area.panels && area.panels.length === 1) { - // 更新Panel的maximized状态 - area.panels[0] = { ...area.panels[0], maximized }; + // 正确处理层级结构:Area -> TabPage -> Panel + if (area && area.tabPages && area.tabPages.length === 1 && area.tabPages[0].panels && area.tabPages[0].panels.length === 1) { + // 更新TabPage中Panel的maximized状态 + area.tabPages[0].panels[0] = { ...area.tabPages[0].panels[0], maximized }; console.log(`同步Area ${areaId} 的Panel最大化状态为:`, maximized); } }