--- id: T-609 title: AI工场终选区改为主图与详情图双单行轨道 phase: 7 deps: [T-608] status: DONE created: 2026-07-11 --- ## 问题 / 背景 ⑥AI工场的「终选与排序」当前使用“主图列 + 详情图列 + 导出列”的横向三栏布局。主图、详情图各自的 `QListWidget` 保持默认列表展示,终选槽会纵向占用较大高度;在主图与详情图数量增多时,底部区域挤占照片池和生成设置的可见空间,也不符合 `docs/ui/tab6-ai-studio-v3.svg` 中“主图、详情图各一条横向排序轨道”的工作流表达。 运营在终选阶段的主要动作是:从照片池拖入、查看顺序、拖动重排和导出。主图(最多 9 张)与详情图(最多 12 张)应各自保持独立顺序,但应在同一终选区内以两条清晰、紧凑的横向轨道展示。 本任务目标:**把终选区改为主图一行、详情图一行的横向轨道,固定并压缩其垂直高度,将释放的空间交给上方照片池与生成设置区域,同时不改变终选数据和拖拽排序语义。** ## 方案 ### 1. 终选区改为双单行轨道 修改 `app/gui/tabs/image_studio.py` 的终选区布局: - 外层从横向三栏布局改为纵向结构:顶部为「终选与排序」标题与简短提示,下方依次为「主图终选」和「详情图终选」两条横向轨道。 - 每条轨道左侧保留固定宽度的中文类型/数量 label,例如 `主图 5/9`、`详情 3/12`;中间为对应的终选列表;右侧保留导出状态与「导出到文件夹」按钮,纵向跨两条轨道。 - `ImageStudioSelectionList` 明确设置为图标视图、从左到右流向、不换行、固定 item/grid 尺寸;不足数量仍显示稳定的「空位」槽,不因文字、状态或缩略图变化导致跳动。 - 主图轨道缩略图约 48px,详情图约 36~40px;在 1280px 宽的常用窗口下,9 个主图槽和 12 个详情图槽均应优先完整可见。更窄窗口允许轨道本身横向滚动,不得换为多行、重叠或压缩文字。 - 保持现有拖入、落在已占槽时插入顺延、同轨道拖动排序、Delete 移出终选和双击预览行为;主图、详情图仍为两套互不混淆的排序序列。 ### 2. 将释放的垂直空间让给上方工作区 - 终选区设为稳定的紧凑高度目标约 150~170px,避免 `QListWidget` 按纵向内容撑高底部。 - 保留根布局中上方 `main_splitter` 的 stretch 行为,让终选区压缩后释放的高度自动增加到上方工作区,优先扩大照片池可见区域;不额外创建浮动卡片或滚动嵌套。 - 导出区域改为紧凑、可扫读的右侧区域:保留部分导出提示、主图/详情图计数和导出按钮;不因布局改动隐藏现有导出冲突处理语义。 - 在 1280×820 和较窄窗口验证:两条终选轨道、导出按钮、照片池和生成设置均不重叠;窄窗口下列表能独立横向滚动,页面整体不出现不可达控件。 ### 3. 不改变业务数据与导出语义 - 继续使用已有 `image_studio_selections` 数据、`main` / `detail` 两类 selection、顺序字段、拖拽处理和导出服务。 - 不修改项目、资产、任务、终选 SQLite schema,不迁移历史数据。 - 不改变照片池、生成、原图下载队列、cmhub、蝦皮 CDP、导出文件名或覆盖/新建目录确认逻辑。 - 所有新增或调整的用户可见文案保持中文。 ## 验收要点 - 「终选与排序」内主图与详情图分别只显示一条横向轨道,不再是左右分栏的两个纵向列表。 - 主图最多 9 个槽、详情图最多 12 个槽;空位、缩略图、顺序标识和比例警示在单行内稳定显示。 - 在 1280×820 下,两条轨道与导出区域均完整可见,终选区高度约 150~170px;释放出的高度由上方照片池/生成设置区域获得。 - 在窄窗口下,单条终选轨道使用自身横向滚动,不换行、不重叠、不挤压为不可读文字。 - 从照片池拖到主图/详情图、拖动重排、插入顺延、删除移出、双击预览和状态禁用逻辑保持原行为;两类终选顺序写入 SQLite 后重启仍正确。 - 导出按钮、部分导出提示、终选数量和导出冲突处理仍可用,且不被终选轨道遮挡。 - 不改 SQLite schema、图片文件、cmhub、生图、原图下载、导出服务、CDP 或①至⑤模块。 ## 测试要求 更新或新增 `tests/test_gui.py`: - 覆盖终选区结构为标题 + 主图单行轨道 + 详情图单行轨道 + 导出区,不再依赖左右分栏。 - 覆盖主图 9 槽、详情图 12 槽的固定数量、图标尺寸、单行/不换行和稳定 grid 尺寸。 - 覆盖已有的拖入、插入顺延、同轨重排、Delete 移出和持久化顺序在新布局下仍正确。 - 覆盖 1280×820 与较窄宽度下的尺寸约束:终选区不异常撑高、控件不重叠,窄宽时横向滚动可用。 - 覆盖运行中禁用与导出按钮/提示仍可访问。 验证命令: ```bash python -m ruff check app tests main.py py -3.10 -m compileall app main.py py -3.10 -m unittest discover -s tests git diff --check ``` 人工验收建议: - 准备主图 9 张、详情图 12 张的项目,在 1280×820 下确认两条轨道的槽位、顺序、导出区域和照片池可见面积。 - 缩窄窗口后分别横向滚动主图和详情图轨道,验证不换行、不遮挡,并验证拖入、排序、删除和导出。 ## 边界(不改什么) - 不新增终选类型、批量导出模式、拖拽跨类型自动转换或本地图片导入。 - 不修改 `app/image_studio.py`、`app/image_studio_export.py`、SQLite schema 或历史终选记录。 - 不调整原图区、照片池缩略图尺寸、原图下载并发/重试或生成参数。 - 不改①至⑤模块、cmhub 协议、蝦皮 CDP 流程和登录策略。 ## 执行记录 - 2026-07-11:将 AI工场终选区改为标题行 + 主图单行轨道 + 详情图单行轨道;右侧导出状态和导出按钮跨两条轨道,终选区高度限制为 150~170px,释放的高度由上方工作区获得。 - 2026-07-11:终选列表明确使用图标模式、从左到右、不换行、固定 grid 和独立横向滚动;主图 9 槽使用 48px 缩略图,详情图 12 槽使用 38px 缩略图。空位保留可落入语义并以虚线槽稳定显示。 - 2026-07-11:保留拖入、插入顺延、同轨重排、Delete 移出、双击预览、SQLite 顺序持久化和导出逻辑;新增动态终选计数提示与 GUI 布局回归测试。 - 2026-07-11:人工截图检查 1280×820 下双轨道、导出区与照片池无重叠。干净 worktree 验证通过:`python -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`py -3.10 -m unittest discover -s tests`(387 项)、`git diff --check`。主工作区另有未提交默认提示词文件变更,未纳入本任务修改。