Files
personal-toolbox/补充需求文档-01.md
home-PC 2c985e8d63 Phase 6: 一键多开 (工具组合) 功能
- 数据模型: ToolItem 新增 IsGroup(bool) + SubToolIds(List<string>) 字段

- 执行逻辑: ProcessExecutionService 改为 ExecuteAsync, 组合卡片遍历子工具逐一启动(500ms延迟), 孤儿ID跳过并打印警告

- 组合编辑: GroupEditViewModel + GroupEditWindow, 复选框列表勾选非组合工具

- 主界面: 标题栏新增 '+添加组合' 按钮(蓝色), 组合卡片右下角显示 📦 角标

- 右键菜单: 区分 '编辑工具' (普通) 和 '编辑组合' (IsGroup=true)

- 快捷键: HotKeyManager 适配 ExecuteAsync 异步调用

- 测试: 82 tests total (ProcessExecution 4->6, GroupEdit 5 new)
2026-05-10 00:15:39 +08:00

73 lines
4.3 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.
# 个人工具箱 (Personal ToolBox) - 补充需求文档
**特性模块:** 一键多开 / 工具组合 (Batch Execution / Tool Groups)
**文档版本:** V1.1 增量补充包
## 一、 需求分析与交互设计
1. **核心概念提取**:引入“**组合卡片 (Group Card)**”的概念。它在 UI 上的表现形式与普通应用卡片一致(同属一个网格布局,可被搜索、可绑定快捷键),但它的动作不是启动单一路径,而是批量触发其他已有工具的启动事件。
2. **UI/UX 变更**
* **主界面**:在原本的“添加工具”按钮旁,新增“**添加组合**”按钮。
* **卡片视觉区分**如果是组合卡片UI 上需有视觉提示(例如:图标右下角有一个叠层的小角标,或者副标题显示“包含 3 个应用”)。
* **组合编辑弹窗**:新增一个弹窗,用户可输入组合名称、选择图标,并通过**复选框列表 (Checkboxes)** 勾选当前工具箱中已存在的其他工具。
## 二、 数据模型与架构变更 (SDD)
为了最小化对现有代码的破坏,我们**不创建新的主模型**,而是直接扩展现有的 `ToolItem` 模型。
### 2.1 数据模型扩展 (`ToolItem.cs`)
在原有属性基础上,增加两个字段:
* `IsGroup` (bool): 标记该卡片是否为组合卡片。默认为 `false`
* `SubToolIds` (List<string>): 当 `IsGroup``true` 时,存储需要批量启动的子工具的 `Id` 列表。
**变更后的 `config.json` 示例:**
```json
{
"Tools": [
{
"Id": "uuid-001",
"Name": "VS Code",
"Path": "C:\\vscode.exe",
"IsGroup": false
},
{
"Id": "uuid-002",
"Name": "晨间工作流 (一键多开)",
"IconCode": "f0e8",
"IsGroup": true,
"SubToolIds": ["uuid-001", "uuid-another-id"],
"CategoryId": "1",
"HotKey": "Ctrl+Shift+W"
}
]
}
```
### 2.2 执行逻辑演进 (`ProcessExecutionService.cs`)
执行服务需要加入递归或循环逻辑:
1. 接收到 `ToolItem` 后,判断 `IsGroup`
2. 若为 `false`,走原有的单进程启动逻辑。
3. 若为 `true`,遍历 `SubToolIds`,从全局数据中查找到对应的 `ToolItem`
4. **防卡顿机制**:通过 `async/await``Task.Delay(500)`,在每次启动应用之间加入 500 毫秒的延迟,防止瞬间拉起大量进程导致系统假死。
5. **孤儿数据容错**:如果子工具被删除了(通过 ID 找不到),直接跳过并打印一条日志,不中断整个多开流程。
---
> "我们现在要补充一个非常关键的需求:**Phase 6: 一键多开 (工具组合) 功能**。
> 用户希望创建一个特殊的卡片,点击它时可以同时打开多个已配置的工具。为了保证与之前架构兼容,请帮我按以下步骤修改:
>
> **1. 更新数据模型 (`ToolItem.cs`)**
> - 新增属性 `public bool IsGroup { get; set; }`
> - 新增属性 `public ObservableCollection<string> SubToolIds { get; set; } = new();`
>
> **2. 更新执行逻辑 (`ProcessExecutionService.cs`)**
> - 将 `Execute` 方法改为异步方法 `public async Task ExecuteAsync(ToolItem item)`。
> - 在方法内部增加逻辑:如果 `item.IsGroup == true`,则遍历 `item.SubToolIds`,通过 `IDataService` 获取对应的子 `ToolItem`。
> - 使用 `foreach` 循环执行子工具。为了防止系统卡顿,每次拉起进程后加入 `await Task.Delay(500)`。
> - 如果通过 ID 找不到子工具(可能被删除了),调用 `ILogService` 打印警告:“组合启动跳过:找不到 ID 为 xxx 的工具”,并继续执行下一个。
>
> **3. UI 与交互更新 (`MainWindow.xaml` & `MainViewModel.cs`)**
> - 在主界面“添加工具”按钮旁边,新增一个“添加组合 (Add Group)”按钮。
> - 为组合卡片在 UI 上增加视觉区分:在 `ItemsControl` 的卡片 DataTemplate 中,利用 `DataTrigger` 绑定 `IsGroup` 属性。如果为 true显示一个形如“📦 组合”的 Badge 或角标文字。
>
> **4. 新增组合编辑弹窗 (`GroupEditWindow.xaml`)**
> - 创建一个新的弹窗用于编辑组合。
> - 包含:组合名称、图标、所属分类、快捷键。
> - 核心:一个包含当前所有非组合工具(`IsGroup == false`)的列表,每项前面带有一个 `CheckBox`。用户勾选后,保存时将选中的工具 ID 存入 `SubToolIds`