diff --git a/docs/tasks/T-609.md b/docs/tasks/T-609.md new file mode 100644 index 0000000..a9fc363 --- /dev/null +++ b/docs/tasks/T-609.md @@ -0,0 +1,87 @@ +--- +id: T-609 +title: AI工场终选区改为主图与详情图双单行轨道 +phase: 7 +deps: [T-608] +status: TODO +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 流程和登录策略。 + +## 执行记录 + +- 待执行。