diff --git a/AutoRobot/Windows/Robot/Web/package-lock.json b/AutoRobot/Windows/Robot/Web/package-lock.json index 6ede139..c2a3ee1 100644 --- a/AutoRobot/Windows/Robot/Web/package-lock.json +++ b/AutoRobot/Windows/Robot/Web/package-lock.json @@ -2321,6 +2321,7 @@ "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -2448,6 +2449,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2462,6 +2464,7 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -2521,6 +2524,7 @@ "resolved": "http://47.111.181.23:8081/repository/npm-public/vue/-/vue-3.5.22.tgz", "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.22", "@vue/compiler-sfc": "3.5.22", diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue b/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue index 8911f50..5dfa6db 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue @@ -36,6 +36,9 @@ :id="tabPage.id" :title="tabPage.title" :panels="tabPage.panels" + @tabDragStart="onTabDragStart(area.id, $event)" + @tabDragMove="onTabDragMove(area.id, $event)" + @tabDragEnd="onTabDragEnd" > { // 获取父容器尺寸以计算居中位置 @@ -297,6 +308,64 @@ const onPanelDragEnd = () => { panelDragState.value.currentAreaId = null } +// TabPage拖拽开始 +const onTabDragStart = (areaId, event) => { + const area = floatingAreas.value.find(a => a.id === areaId) + // 只有当Area中只有一个TabPage时才允许通过TabPage的页标签移动Area + if (area && area.tabPages && area.tabPages.length === 1) { + tabDragState.value.isDragging = true + tabDragState.value.currentAreaId = areaId + tabDragState.value.startClientPos = { + x: event.clientX, + y: event.clientY + } + tabDragState.value.startAreaPos = { + x: area.x, + y: area.y + } + console.log('TabPage拖拽开始,移动Area:', areaId) + } +} + +// TabPage拖拽移动 +const onTabDragMove = (areaId, event) => { + if (tabDragState.value.isDragging && tabDragState.value.currentAreaId === areaId) { + const area = floatingAreas.value.find(a => a.id === areaId) + if (area) { + // 计算移动距离 + const deltaX = event.clientX - tabDragState.value.startClientPos.x + const deltaY = event.clientY - tabDragState.value.startClientPos.y + + // 计算新位置 + let newLeft = tabDragState.value.startAreaPos.x + deltaX + let newTop = tabDragState.value.startAreaPos.y + deltaY + + // 确保不超出父容器边界 + if (dockLayoutRef.value) { + const parentRect = dockLayoutRef.value.getBoundingClientRect() + + // 严格边界检查 + newLeft = Math.max(0, Math.min(newLeft, parentRect.width - area.width)) + newTop = Math.max(0, Math.min(newTop, parentRect.height - area.height)) + } + + // 更新位置 + area.x = newLeft + area.y = newTop + + // 调试信息 + console.log('TabPage拖拽移动,Area新位置:', { x: newLeft, y: newTop }) + } + } +} + +// TabPage拖拽结束 +const onTabDragEnd = () => { + console.log('TabPage拖拽结束') + tabDragState.value.isDragging = false + tabDragState.value.currentAreaId = null +} + // 监听floatingAreas变化,确保当Area最大化时,Panel也会自动最大化 watch(floatingAreas, (newAreas) => { newAreas.forEach(area => { diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/TabPage.vue b/AutoRobot/Windows/Robot/Web/src/DockLayout/TabPage.vue index a5ea3f8..a09ead0 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/TabPage.vue +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/TabPage.vue @@ -7,10 +7,13 @@ :key="panel.id" :class="['tab-item', { 'active': activeTabIndex === index }]" @click="setActiveTab(index)" + @mousedown="onTabDragStart(index, $event)" >
{{ panel.title }} +