Files
vue-desktop/.qoder/quests/window-drag-resize-control.md
2025-09-25 13:36:38 +08:00

315 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 窗体功能增强设计文档
## 1. 概述
### 1.1 功能目标
1. 为项目中的窗体组件添加8个方向的拖拽调整尺寸功能增强用户交互体验
2. 修复窗体最大化、最小化、还原功能存在的问题
3. 完善窗体状态管理和事件通知机制
### 1.2 当前系统分析
通过代码分析发现,当前系统已具备以下基础功能:
- 窗体创建、销毁、移动功能
- 窗体最大化、最小化、还原功能
- 基本的事件管理系统
- 窗体状态管理和配置
但现有功能存在以下问题:
1. 缺少用户通过鼠标拖拽调整窗体尺寸的功能
2. 窗体最大化、最小化、还原功能实现不完整,缺少与事件系统的完整集成
3. 窗体状态变更时未正确触发`windowFormDataUpdate`事件通知
## 2. 架构设计
### 2.1 整体架构
```mermaid
graph TD
A[用户操作] --> B[窗体功能处理器]
B --> C[窗体状态管理]
C --> D[UI更新引擎]
D --> E[界面重渲染]
C --> F[事件通知系统]
G[窗体服务] --> C
H[事件管理器] --> F
```
### 2.2 核心组件
| 组件名称 | 职责 | 说明 |
| --------------------- | ------------------ | -------------------------------------- |
| WindowOperationHandler | 窗体操作处理核心 | 处理最大化、最小化、还原和拖拽调整尺寸操作 |
| WindowManager | 窗体状态管理 | 管理窗体状态变更和配置更新 |
| WindowRenderer | UI更新引擎 | 应用新状态到窗体界面 |
| WindowEventManager | 事件管理器 | 发布窗体状态变更事件 |
## 3. 功能设计
### 3.1 窗体状态操作
窗体支持以下状态操作:
| 操作 | 状态变更 | 事件触发 | 说明 |
| ------ | ---------------------------- | ------------------------------------------ | ------------------------------------------ |
| 最大化 | default/minimized → maximized | windowFormMaximize, windowFormDataUpdate | 窗体占据除任务栏外的整个屏幕空间 |
| 最小化 | default/maximized → minimized | windowFormMinimize | 窗体隐藏,仅在任务栏保留图标 |
| 还原 | minimized/maximized → default | windowFormRestore, windowFormDataUpdate | 窗体恢复到正常尺寸和位置 |
### 3.2 拖拽调整尺寸方向定义
窗体支持8个方向的拖拽调整尺寸具体如下
```mermaid
graph TD
subgraph 窗体
direction LR
A[↖] --- B[↑] --- C[↗]
D[←] --- E[窗体内容] --- F[→]
G[↙] --- H[↓] --- I[↘]
end
classDef corner fill:#f9f,stroke:#333;
classDef edge fill:#bbf,stroke:#333;
class A,C,G,I,corner
class B,D,F,H,edge
```
| 方向 | 标识符 | 影响属性 | 说明 |
| ------ | ----------- | ------------------- | ------------------ |
| 左上角 | topLeft | width, height, x, y | 同时调整宽高和位置 |
| 上边缘 | top | height, y | 调整高度和垂直位置 |
| 右上角 | topRight | width, height, y | 调整宽高和垂直位置 |
| 右边缘 | right | width | 仅调整宽度 |
| 右下角 | bottomRight | width, height | 仅调整宽高 |
| 下边缘 | bottom | height | 仅调整高度 |
| 左下角 | bottomLeft | width, height, x | 调整宽高和水平位置 |
| 左边缘 | left | width, x | 调整宽度和水平位置 |
### 3.3 交互流程
```mermaid
sequenceDiagram
participant U as 用户
participant WH as 窗体句柄
participant WOH as 操作处理器
participant WM as 窗体管理器
participant WR as 窗体渲染器
participant EM as 事件管理器
U->>WH: 执行操作(最大化/最小化/还原/拖拽)
WH->>WOH: 处理操作请求
WOH->>WM: 更新窗体状态
WM->>WR: 应用新状态
WM->>EM: 发布状态变更事件
EM->>EM: 发布windowFormDataUpdate事件
WR->>U: 更新界面显示
```
## 4. 数据模型
### 4.1 窗体状态数据结构
```typescript
interface IWindowFormDataUpdateParams {
/** 窗口id */
id: string;
/** 窗口状态 */
state: TWindowFormState;
/** 窗口宽度 */
width: number;
/** 窗口高度 */
height: number;
/** 窗口x坐标(左上角) */
x: number;
/** 窗口y坐标(左上角) */
y: number;
}
type TWindowFormState = 'default' | 'minimized' | 'maximized';
```
### 4.2 窗体尺寸配置扩展
在现有`WindowConfig`接口基础上增加最小/最大尺寸限制:
| 字段 | 类型 | 必填 | 说明 |
| --------- | ------- | ---- | -------------------------- |
| minWidth | number | 可选 | 窗体最小宽度(像素) |
| minHeight | number | 可选 | 窗体最小高度(像素) |
| maxWidth | number | 可选 | 窗体最大宽度(像素) |
| maxHeight | number | 可选 | 窗体最大高度(像素) |
| resizable | boolean | 可选 | 是否可调整尺寸默认为true |
### 4.3 拖拽状态数据结构
```typescript
interface ResizeState {
/** 是否正在调整尺寸 */
isResizing: boolean;
/** 调整方向 */
direction: ResizeDirection;
/** 起始鼠标位置 */
startX: number;
/** 起始鼠标位置 */
startY: number;
/** 起始窗体宽度 */
startWidth: number;
/** 起始窗体高度 */
startHeight: number;
/** 起始窗体X坐标 */
startXPosition: number;
/** 起始窗体Y坐标 */
startYPosition: number;
}
type ResizeDirection =
'topLeft' | 'top' | 'topRight' |
'right' | 'bottomRight' | 'bottom' |
'bottomLeft' | 'left' | 'none';
```
## 5. 事件系统设计
### 5.1 修复事件触发问题
当前窗体状态变更时未正确触发`windowFormDataUpdate`事件,需要修复以下问题:
1. 在最大化操作完成后,应触发`windowFormDataUpdate`事件,携带窗体新状态和尺寸信息
2. 在最小化操作完成后,应触发`windowFormDataUpdate`事件,携带窗体新状态信息
3. 在还原操作完成后,应触发`windowFormDataUpdate`事件,携带窗体新状态和尺寸信息
### 5.2 新增事件定义
在现有`IWindowFormEvent`接口中添加以下事件:
| 事件名称 | 参数类型 | 触发时机 |
| --------------------- | --------------------------- | ---------------- |
| windowFormResizeStart | string | 开始调整窗体尺寸 |
| windowFormResizing | IWindowFormDataUpdateParams | 调整尺寸过程中 |
| windowFormResizeEnd | string | 完成窗体尺寸调整 |
### 5.3 事件触发流程
```mermaid
graph TD
A[窗体状态变更] --> B{是否需要更新数据?}
B -->|是| C[构造更新数据]
C --> D[触发windowFormDataUpdate事件]
B -->|否| E[直接触发状态事件]
D --> F[通知监听组件]
E --> F
```
## 6. 核心逻辑设计
### 6.1 窗体状态变更逻辑修复
当前窗体状态变更逻辑存在以下问题需要修复:
1. **最大化逻辑问题**
- 未正确保存原始窗体尺寸和位置信息
- 未触发`windowFormDataUpdate`事件通知
2. **最小化逻辑问题**
- 未触发`windowFormDataUpdate`事件通知
3. **还原逻辑问题**
- 未正确恢复窗体尺寸和位置
- 未触发`windowFormDataUpdate`事件通知
### 6.2 边缘检测算法
窗体边缘需要划分8个可拖拽区域每个区域宽度为8px
```mermaid
graph TD
subgraph 边缘区域划分
direction LR
A[8px↖] --- B[8px↑] --- C[8px↗]
D[8px←] --- E[窗体内容] --- F[8px→]
G[8px↙] --- H[8px↓] --- I[8px↘]
end
```
### 6.3 尺寸计算规则
1. **最小尺寸限制**窗体宽度不能小于minWidth高度不能小于minHeight
2. **最大尺寸限制**窗体宽度不能大于maxWidth高度不能大于maxHeight
3. **位置边界**:窗体不能被拖拽到屏幕外
### 6.4 拖拽处理流程
1. 鼠标按下时检测是否在边缘区域
2. 根据鼠标位置确定拖拽方向
3. 记录初始状态数据
4. 鼠标移动时实时计算新尺寸
5. 应用新尺寸并触发重渲染
6. 鼠标释放时结束拖拽状态
## 7. UI/UX设计
### 7.1 视觉反馈
- 鼠标悬停在可拖拽边缘时,光标应变为对应方向的调整光标
- 拖拽过程中窗体应有半透明遮罩效果
- 拖拽完成后应有平滑的过渡动画
### 7.2 响应式适配
- 在不同屏幕分辨率下保持边缘区域的可点击性
- 支持触屏设备的拖拽操作
- 在窗体尺寸接近最小/最大限制时提供视觉提示
## 8. 性能优化
### 8.1 事件处理优化
- 使用防抖机制减少高频事件触发
- 在拖拽过程中暂停不必要的重渲染
- 使用requestAnimationFrame优化动画性能
### 8.2 内存管理
- 及时清理事件监听器
- 复用计算对象避免频繁创建
- 在窗体销毁时清理所有相关资源
## 9. 安全考虑
### 9.1 边界检查
- 确保窗体不能被调整到超出屏幕边界
- 验证尺寸参数的有效性
- 防止负值或异常大值的输入
### 9.2 权限控制
- 只有具有调整权限的窗体才能被调整尺寸
- 外部应用的窗体尺寸调整需通过SDK接口
## 10. 测试策略
### 10.1 单元测试
- 边缘检测算法准确性测试
- 尺寸计算边界条件测试
- 事件发布/订阅机制测试
### 10.2 集成测试
- 不同方向拖拽功能测试
- 尺寸限制功能测试
- 与现有窗体功能集成测试
### 10.3 用户体验测试
- 拖拽流畅性测试
- 视觉反馈效果测试
- 不同设备兼容性测试