diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue b/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue index 44e8ada..1811b49 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue @@ -312,33 +312,34 @@ const addFloatingPanel = () => { showTitleBar: true, // 2. 向Area添加一个TabPage。TabPage的初始设置为填充满父容器 tabPages: [ - { - id: `tabpage-${areaIdCounter - 1}-1`, - title: `标签页 1`, - // TabPage填充满父容器 - width: 100, - height: 100, - // 3. 向TabPage添加一个Panel。Panel的初始设置为填充满父容器 - panels: [ - { - id: `panel-${areaIdCounter - 1}-1-1`, - title: `面板 ${areaIdCounter - 1}`, - x: 0, - y: 0, - width: 100, - height: 100, - collapsed: false, - toolbarExpanded: false, - // 添加随机测试内容以便合并测试 - content: generateRandomContent(areaIdCounter - 1) - } - ] - } ] } + const newTabPage = { + id: `tabpage-${areaIdCounter - 1}-1`, + title: `标签页 1`, + // TabPage填充满父容器 + width: 100, + height: 100, + // 3. 向TabPage添加一个Panel。Panel的初始设置为填充满父容器 + panels: [ + ] + } + const newPanel = { + id: `panel-${areaIdCounter - 1}-1-1`, + title: `面板 ${areaIdCounter - 1}`, + x: 0, + y: 0, + width: 100, + height: 100, + collapsed: false, + toolbarExpanded: false, + // 添加随机测试内容以便合并测试 + content: generateRandomContent(areaIdCounter - 1) + } + newTabPage.panels.push(newPanel) + newArea.tabPages.push(newTabPage) floatingAreas.value.push(newArea) } - // 更新区域位置 const onUpdatePosition = (id, position) => { const area = floatingAreas.value.find(a => a.id === id) diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/ToDoList.md b/AutoRobot/Windows/Robot/Web/src/DockLayout/ToDoList.md index 9f6164e..0cda8a0 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/ToDoList.md +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/ToDoList.md @@ -39,34 +39,47 @@ 4.1. Area的merge行为只接受一个Area参数. 4.1. 如果目标Area内容区为空,则将源Area内容区的子组件添加到目标Area内容区。这个源Area保存到DockLayout的的隐藏列表中。 4.2. 如果目标Area内容区已经包含一个TabPage,则将源Area的TabPage组件的每个标签页添加到目标Area的Tabpage中。这个源Area和源Area的TabPage组件保存到DockLayout的的隐藏列表中。 -5. 当将源Area拖动到外部边缘指示器时 +5. 当将源Area拖动到外部边缘指示器时 ✅ **已完成** + +**核心功能实现**: + - ✅ 外部边缘停靠检测和执行逻辑 + - ✅ 并排布局创建(createSideBySideLayout函数) + - ✅ ResizeBar集成和事件处理 + 5.1. 如果主区域内只有一个Area(目标区域),则压缩目标Area的空间,源区域和目标区域并排放置在主区域内。 - - 实现压缩目标Area空间的逻辑(已实现) - - 设置源Area和目标Area的并排布局(已实现) - - 在并排的Area之间添加ResizeBar组件以支持拖动调整大小 - - ResizeBar的方向根据停靠方向动态设置: + - ✅ 实现压缩目标Area空间的逻辑(已完成) + - ✅ 设置源Area和目标Area的并排布局(已完成) + - ✅ 在并排的Area之间添加ResizeBar组件以支持拖动调整大小 + - ✅ ResizeBar的方向根据停靠方向动态设置: * 左右停靠:使用水平ResizeBar(垂直分割线) * 上下停靠:使用垂直ResizeBar(水平分割线) - - 确保ResizeBar支持最小/最大尺寸限制 + - ✅ 确保ResizeBar支持最小/最大尺寸限制 + 5.2. 如果主区域内没有Area,则从隐藏列表中取出Area,如果隐藏列表中没有Area,则创建一个Area,将主区域内的组件添加到Area中作为目标Area。 压缩目标Area的空间,源区域和目标区域并排放置在主区域内。 - - 检查隐藏列表是否有可用Area - - 如果没有隐藏Area,创建新的Area - - 将主区域内的组件移动到新创建的Area中作为目标Area - - 执行并排放置逻辑(复用5.1的实现) - - 添加ResizeBar支持拖动调整 + - ✅ 检查隐藏列表是否有可用Area + - ✅ 如果没有隐藏Area,创建新的Area + - ✅ 将主区域内的组件移动到新创建的Area中作为目标Area + - ✅ 自动迁移tabPages和receivedContent + - ✅ 清空主区域内容为并排布局做准备 + - ✅ 创建默认tabPage当主区域为空时 + - ✅ 执行并排放置逻辑(复用5.1的实现) + - ✅ 添加ResizeBar支持拖动调整 + +**技术特性**: 5.3. 并排停靠后的ResizeBar集成 - - 在并排的Area之间动态插入ResizeBar组件 - - ResizeBar的事件处理: + - ✅ 在并排的Area之间动态插入ResizeBar组件 + - ✅ ResizeBar的事件处理: * resize事件:实时调整并排Area的尺寸比例 * resizeStart/resizeEnd事件:处理调整开始/结束状态 - - 保持Area的最小尺寸限制(避免调整过小无法使用) - - 调整后更新Area的ratio属性以保持布局持久化 - - 支持双向调整:拖动ResizeBar可以同时影响两个Area的大小 + - ✅ 保持Area的最小尺寸限制(避免调整过小无法使用) + - ✅ 调整后更新Area的ratio属性以保持布局持久化 + - ✅ 支持双向调整:拖动ResizeBar可以同时影响两个Area的大小 + 5.4. ResizeBar的样式和交互优化 - - ResizeBar的显示条件:仅在并排布局中存在时显示 - - 鼠标悬停效果:高亮显示ResizeBar指示器 - - 拖动时的视觉反馈:实时显示调整效果 - - 确保ResizeBar不会影响Area的拖拽和停靠功能 + - ✅ ResizeBar的显示条件:仅在并排布局中存在时显示 + - ✅ 鼠标悬停效果:高亮显示ResizeBar指示器 + - ✅ 拖动时的视觉反馈:实时显示调整效果 + - ✅ 确保ResizeBar不会影响Area的拖拽和停靠功能 ### ResizeBar集成技术要求 1. ResizeBar组件依赖