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

4.3 KiB
Raw Permalink Blame History

个人工具箱 (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): 当 IsGrouptrue 时,存储需要批量启动的子工具的 Id 列表。

变更后的 config.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/awaitTask.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