Files
cmshoppe/docs/tasks/T-569.md
T

86 lines
5.0 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.
---
id: T-569
title: ②封面画廊上下条切换与未保存选择拦截
phase: 7
deps: [T-567]
status: DONE
created: 2026-07-09
---
## 问题 / 背景
T-567 的封面画廊只处理当前单条任务。运营批量检查时需要在弹窗内连续查看上一条/下一条商品,而不是关闭弹窗后回到列表再双击。切换记录时,如果当前画廊已经勾选了另一张候选但尚未保存,必须避免静默丢失选择。
## 方案(改哪个文件、改成什么)
### 上一条/下一条按钮
- 在 T-567 封面画廊弹窗底部增加「上一条」「下一条」。
- 目标任务来自②当前表格模型的相邻可见行,必须尊重当前筛选结果和排序。
- 第一条时「上一条」置灰;最后一条时「下一条」置灰。
- 切换记录时只刷新弹窗内容区和内部当前 task,不重建整个窗口;窗口大小和位置保持不变。
### 键盘切换
- 支持 `↑` / `↓` 键切换上一条/下一条,和按钮走同一个切换函数。
- 画廊内 `QRadioButton` 设置 `ClickFocus` 或 `NoFocus`,避免方向键在 radio 组内改变候选选择而不是切换记录。
- 输入框/按钮等获得焦点时如不适合消费方向键,应保持 Qt 默认行为;不为键盘切换破坏可访问性。
### 未保存选择拦截
- 判断条件:当前 radio 选中路径 != DB 当前 `task.new_cover_path`。
- 在按钮切换、方向键切换、关闭弹窗前都必须进入同一套拦截流程。
- 弹三态确认框,按钮必须是中文:
- 「保存」:调用 `db.update_generated_cover()`;如任务已提交线上,先弹 T-567 同款“本地换封面不会回滚蝦皮,重复更新会再次提交线上”确认;保存成功后继续切换/关闭。
- 「不保存」:丢弃当前勾选,继续切换/关闭。
- 「取消」:留在当前任务,不切换、不关闭。
- 保存失败时保留当前任务和弹窗,显示中文错误。
### 与 T-568 的关系
- 如果 T-568 已完成且当前任务正在单任务重生:
- 可允许切换到其它任务,但切回时必须刷新最新 DB/候选;
- 当前任务运行中时画廊显示“生成中”状态,不显示旧 `new_cover_path` 为当前有效图误导用户。
- 如果 T-568 尚未完成,本任务只需保证 T-567 基础画廊切换逻辑正确。
## 验收要点
- 上一条/下一条按钮按当前②可见列表相邻行切换;边界按钮置灰。
- `↑` / `↓` 与按钮共用切换逻辑;方向键不会改变 radio 选中。
- 切换记录不改变弹窗尺寸和屏幕位置。
- 当前有未保存选择时,按钮切换、键盘切换、关闭弹窗都会弹中文三态确认。
- 「保存 / 不保存 / 取消」三种路径行为正确;保存失败不切换。
- 已提交线上任务保存前仍弹二次警示。
- 验证命令:
- `py -3.10 -m unittest tests.test_gui`
- `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`
## 边界(不改什么)
- 不改 T-566 数据层契约。
- 不改 T-568 单任务重新生成逻辑。
- 不改 cmhub/AI 请求、DB schema、Excel、③更新、CDP/Shopee。
## 执行记录
- 2026-07-09 完成 T-569。
- 修改 `app/gui/tabs/generate.py`:
- ②封面画廊新增「上一条」「下一条」按钮,目标任务来自打开画廊时②当前可见表格任务列表,按相邻行切换,首尾边界按钮自动置灰。
- 切换任务时只刷新弹窗内部任务、旧封面和候选画廊内容,不重建整个窗口,窗口尺寸和位置保持不变;切换时会重新读取 DB 最新任务和候选文件。
- 支持 `↑` / `↓` 键走同一套上一条/下一条切换逻辑;候选 `QRadioButton` 改为 `ClickFocus`,避免方向键在 radio 组内改候选。
- 增加统一未保存选择拦截:按钮切换、方向键切换、取消/关闭弹窗前,如果当前选中候选不同于当前 DB 封面指针,会弹中文三态确认「保存 / 不保存 / 取消」。保存路径复用 `db.update_generated_cover()`,已提交线上任务仍先弹“本地换封面不会回滚蝦皮,重复更新会再次提交线上”确认;保存失败保留当前任务。
- 与 T-568 兼容:单任务封面重生运行中切换回该任务时显示“封面重新生成中”,完成/失败后继续刷新 DB 和候选列表。
- 修改 `tests/test_gui.py`:
- 覆盖上一条/下一条按当前可见列表切换、边界按钮状态、切换不改变窗口尺寸/位置。
- 覆盖 `↑`/`↓` 键切换任务且不改变候选 radio 选择。
- 覆盖未保存选择在切换和关闭时的「保存 / 不保存 / 取消」三种路径,以及已提交任务保存前的二次确认。
- 验证通过:
- `py -3.10 -m unittest tests.test_gui`
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`(302 tests;PySide6 字体目录警告不影响结果)
- `git diff --check`