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

107 lines
6.6 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-635
title: 商品套图原图取消固定六个占位并强化添加入口
status: TODO
phase: 7
deps: [T-631]
created: 2026-07-14
---
# T-635 商品套图原图取消固定六个占位并强化添加入口
## 问题 / 背景
⑥「商品套图」当前会在真实商品原图不足 6 张时,向 `ProductOriginalList` 补入带“添加”图标的空 `QListWidgetItem`,因此全新商品虽然没有任何原图,界面仍固定显示 6 个图片位置。这个展示容易让用户误以为必须上传 6 张或最多只能上传 6 张,也让列表项数量与真实资产数量不一致;实际业务上限一直是 16 张。
顶部「添加图片」目前使用普通灰色按钮样式,与「历史生成」「打开结果文件夹」视觉权重相同。取消 6 个可点击占位后,它会成为添加本地图片的唯一显式入口,需要提高辨识度,但不能抢占底部「生成套图」主操作的层级。
T-631 曾明确保留“最少 6 个展示位”语义。本任务只覆盖该项旧约定;T-631 已完成的自然增高、外层滚动、勾选、批量删除、排序和预览行为继续保留。
## 目标
1. 商品没有真实原图时,列表真实项数量为 `0`,不再生成 6 个空图片位置。
2. 商品原图区域仍保留稳定、可识别的空状态和拖放范围,不因零图片完全塌陷。
3. 有图时只显示真实资产,并继续按实际数量自然向下扩展,最多 16 张。
4. 使用现有信息蓝强化「添加图片」,同时保持「生成套图」为页面唯一实心主按钮。
## 实现方案
### 1. 列表只承载真实资产
- 删除 `_refresh_originals()` 中将列表补足到 6 项的占位循环。
- `ProductOriginalList.count()`、可勾选项和可排序项都只对应当前项目的真实资产;不得用 `UserRole=None` 的假图片项维持布局。
- 原图计数继续显示真实数量与上限,例如无图时为 `0/16`、两张时为 `2/16`。
- 删除 `_on_original_clicked()` 中点击假占位项后打开文件选择框的分支;添加本地图片统一从顶部「添加图片」进入,拖放和粘贴仍可直接导入。
### 2. 零图片空状态
- 无真实图片时,列表内部显示简洁文字 `暂无商品原图`,但该文字不能作为 `QListWidgetItem` 参与数量、选择、排序或删除。
- 可通过列表绘制或等价的非数据项方式实现空状态;不得重新引入一个“空状态图片项”。
- 空列表保留约一行缩略图的稳定高度,继续接受文件拖放和剪贴板图片粘贴;不得把区域高度收缩为 0。
- 空列表时「已选 0 张」正常显示,「全选」「反选」保持禁用。
- 更新列表 tooltip,移除“点击占位图添加”的旧描述,只保留仍然有效的拖放、粘贴和排序提示。
### 3. 自适应高度与上限
- `content_row_count()` 和高度计算改为按真实图片数计算:0 张保留一行空状态高度,1 至 16 张按真实数量和可用列数计算行数。
- 保持横向、纵向内部滚动条关闭,由现有外层配置滚动区承载页面滚动。
- 真实图片上限仍为 `MAX_ORIGINAL_ASSETS = 16`,不修改导入、拉取、排序和存储协议。
### 4. 强化「添加图片」按钮
- 为 `suiteAddImagesButton` 增加对象级次要强调样式,复用项目现有信息蓝语义:
- 默认:文字和边框 `#0969da`,背景 `#eef4ff`,文字加粗;
- hover:背景 `#dbeafe`;
- pressed:背景 `#c7ddff`;
- disabled:背景 `#f6f8fa`、边框 `#d8dee4`、文字 `#8c959f`。
- 不使用成功绿、警告橙或危险红,也不改成与「生成套图」相同的实心蓝主按钮。
- 少于 16 张且未在导入、未在生成时保持可用;达到 16 张、正在导入或正在生成时禁用。
- 普通 tooltip 使用 `添加本地商品原图`;达到上限时提示 `已达到16张商品原图上限`。容量判断必须与导入服务使用同一资产口径,避免按钮显示可用但导入立即报满。
### 5. 保持既有交互
- 真实图片的勾选、全选、反选、右键批量删除、悬停删除、双击预览和拖拽排序保持不变。
- 未下载的蝦皮原图仍可单击触发后台下载,不因移除空占位而改变。
- 空状态和按钮样式不写入 SQLite 或配置文件,不影响商品项目持久化。
## 验收标准
- [ ] 全新商品没有原图时,`original_list.count()` 为 `0`,界面不显示 6 个“添加”缩略图。
- [ ] 零图片时显示 `暂无商品原图` 和 `0/16`,列表保留一行稳定高度;全选、反选不可用。
- [ ] 空列表仍可接收拖入文件和粘贴图片,成功后立即替换为空状态并显示真实缩略图。
- [ ] 1、2、5 张原图时分别只显示 1、2、5 个真实图片项,不自动补足到 6 个。
- [ ] 6、7、16 张时继续按宽度自然换行,列表内部无横向或纵向滚动条,外层页面滚动正常。
- [ ] 达到 16 张后不能继续通过「添加图片」导入;真实上限和原有中文数量提示保持不变。
- [ ] 「添加图片」使用定义的蓝色次要强调样式,hover、pressed、disabled 状态清晰;「生成套图」仍是唯一实心主按钮。
- [ ] 导入或生成期间「添加图片」禁用,结束后按真实容量恢复;tooltip 与当前状态一致。
- [ ] 真实图片的下载、勾选、批量删除、预览、排序及生成流程回归通过。
- [ ] 不修改数据库 schema、图片目录、cmhub、CDP 或其他标签页。
## 测试要求
- 更新 `tests/test_product_suite_gui.py` 中原来断言固定 6 项的用例,改为断言列表项数量等于真实资产数。
- 覆盖 0 张时非数据项空状态、稳定高度、拖放/粘贴信号和选择按钮禁用。
- 覆盖 1、2、5、6、7、16 张下的真实项数量和动态高度。
- 覆盖「添加图片」普通、满 16 张、导入中和生成中的样式/启用状态及 tooltip。
- 保留 T-631 已有勾选、右键、键盘删除、排序和批量事务测试。
- 在 `1180x760` 与项目支持的最小窗口尺寸下检查空状态、按钮文字和原图区域无重叠。
## 验证
```bash
py -3.10 -m unittest tests.test_product_suite_gui
py -3.10 -m unittest discover -s tests
python -m ruff check app tests main.py
py -3.10 -m compileall app main.py
git diff --check
```
## 非目标
- 不降低或提高最多 16 张商品原图的业务上限。
- 不新增第二个“添加图片”按钮或新的图片导入方式。
- 不调整拉取蝦皮主图、生成套图、删除本地资产或图片下载逻辑。
- 不修改 T-631 除“最少 6 个展示位”以外的既有行为。
## 执行记录