--- id: T-627 title: 压缩商品套图顶部空间并重排上下文操作栏 phase: 7 deps: [T-622] status: DONE created: 2026-07-14 --- ## 问题 / 背景 ⑥「商品套图」已在 T-622 落地,但当前顶部控件占用空间偏大,操作入口分散: - 内部「套图任务」使用 `QTabBar`,会继承主窗口 `TAB_STYLE` 的 `min-height: 34px`、上下 `padding: 8px` 等大导航样式,作为二级任务标签显得过高。 - 账号下拉框和商品 ID 输入框当前最小宽度分别为 180px、150px;账号、商品 ID 位于左侧,「拉取蝦皮主图」单独靠右,未形成连续的任务上下文操作组。 - 「添加图片」位于商品原图标题栏,「历史生成」「打开文件夹」位于生成结果工具栏,常用项目操作分散。 - 生成设置通过 `_prefixed_combo()` 把字段名重复写进每个选项,如「平台 Shopee」「国家 中国台湾」。信息可识别,但视觉重复;四项设置当前按两列两行排列,仍会占用额外纵向空间。 - 四项设置已能随已绑定的商品项目写入 `image_studio_projects.suite_settings_json`,同一次运行中新任务也能继承当前任务;但软件重启后第一个未绑定商品的新任务仍回到固定默认值,尚未形成“最近一次选择作为新任务默认值”的完整记忆语义。 顾客希望压缩顶部高度和输入控件宽度,将常用操作集中,并去掉四个下拉选项中的字段名前缀。 百分比按以下可用性边界解释,不直接做不可读的机械缩放: - 「任务列表高缩小到 33%」按**缩小约 33%、保留约 67% 高度**处理;若只保留当前高度的 33%,任务文字和关闭按钮会被裁切。 - 账号宽度可按当前 180px 的约 66% 起步,但须允许长账号名查看完整内容。 - 商品 ID 不按当前 150px 的 60% 固定成 90px;Shopee 商品 ID 常为 11~13 位,90px 无法完整展示。 本任务是 T-622 的后续 UI 决策:**覆盖 T-622 的 P2「下拉值内联前缀」展示规则和 P4 的具体宽度建议**,但不改变四项设置的真实值、保存方式和生成上下文语义。 ## 方案 ### 1. 压缩二级任务标签 - 仅为 `suiteTaskTabs` 增加对象级局部样式,不修改主窗口模块标签的全局 `TAB_STYLE`。 - 二级任务标签的最终可视总高度控制在 32~36px,文字、选中态、关闭按钮均不得裁切。 - 「新建套图任务」按钮与任务标签同行对齐;关闭按钮及新增按钮的有效点击区域不小于 24~28px。 - 保留任务标签可切换、可拖动、可关闭及新增任务行为。 ### 2. 统一顶部操作栏 把现有上下文条整理为左右两个连续操作组: - 左侧项目操作:`历史生成` → `打开结果文件夹` → `添加图片`。 - 右侧任务上下文:`账号` → 账号下拉框 → `商品ID` → 商品 ID 输入框 → `拉取蝦皮主图`。 - 在左右操作组之间加入弹性空间,使账号、商品 ID 和拉取按钮整体靠右,而不是只让拉取按钮靠右。 - 「打开文件夹」改名为「打开结果文件夹」,明确其打开当前生成批次目录的语义。 - 从商品原图标题栏和生成结果工具栏移除迁移后的重复按钮;商品原图标题栏保留标题和图片数量,生成结果工具栏保留标题、汇总、撤销及更多操作。 - 按钮迁移只调整视觉位置,不重新创建业务逻辑:历史切换的选中状态、打开目录、添加本地图片等原信号与行为保持不变。 - 保持键盘 Tab 顺序与视觉顺序一致;图标按钮如被采用,必须提供中文 tooltip 和 `accessibleName`。 ### 3. 控件宽度与长文本处理 - 账号下拉框:最小宽度 120px、推荐宽度约 140px、最大宽度 160px;长账号显示受限时,通过当前项及下拉项 tooltip 提供完整账号信息。 - 商品 ID 输入框:按 13 位数字和控件内边距通过字体度量确定宽度,并限制在约 120~140px;不得固定为 90px。 - 商品 ID 输入框在正常窗口和 Windows 100% / 125% / 150% 显示缩放下,应完整展示常见 11~13 位数字;已有外部「商品ID」标签时,placeholder 可缩短为「输入商品ID」。 - 窗口变窄时优先压缩弹性空白,不允许操作组重叠、按钮文字截断或控件移出可视区域。 ### 4. 简化生成设置并改为单行布局 - 四项下拉框改为四列单行排列,顺序固定为:`平台` → `站点` → `语言` → `比例`;每列上方保留紧凑、常驻的独立标签,下拉框本身位于同一行,避免只靠位置或当前值猜测字段含义。 - 四列使用等宽伸缩布局,并设置与当前选项匹配的合理最小宽度;左侧配置面板不得被拖到导致字段文字裁切或控件重叠的宽度。最小支持窗口和 Windows 100% / 125% / 150% 显示缩放下均不得产生横向滚动。 - 下拉框选项只显示真实值,如 `Shopee`、`中国台湾`、`繁体中文`、`1:1`,不再在每个选项中重复「平台 / 国家 / 语言 / 比例」。 - 不允许通过“截掉前两个字符”的字符串切片实现;应直接以真实值作为显示文本。 - 每个选项的 `itemData` 继续保存原始业务值,配置保存/恢复及 `build_suite_prompt()` 获得的值不得变化。 - 四个控件补充中文 tooltip 和无障碍名称;仅改变显示层,不改变平台、站点、语言和比例的选项集合。 ### 5. 记住最近一次下拉选择 - 保持已有项目级语义:已绑定账号+商品 ID 的项目继续把完整套图设置保存到 `image_studio_projects.suite_settings_json`;重新打开已有项目时,项目自己的设置优先于任何全局默认值。 - 在 `data/config.json` 增加 `product_suite.last_settings`,只保存四个下拉字段 `platform/country/language/ratio`;不得把商品 ID、账号、提示词、图片路径或其他业务数据写入该配置段。 - 用户切换任一生成设置后,先按 `product_suite.normalize_suite_settings()` 的允许值归一化,再通过现有 `appconfig` 读写入口更新最近一次选择;不得引入 `QSettings` 或第二份旁路配置文件。 - 软件启动后的第一个未绑定商品的新任务,以 `product_suite.last_settings` 为默认值;同一次运行中通过“+”新建任务时,仍优先继承当前任务设置;绑定或打开已有商品项目后,再由该项目设置覆盖新任务默认值。 - 旧配置没有 `product_suite.last_settings`、字段缺失或值非法时,使用现有默认值 `Shopee / 中国台湾 / 繁体中文 / 1:1`,并保持向后兼容。 - 配置 schema 变化须同步 `docs/04-architecture.md` 的 `data/config.json` 说明,并补 `appconfig` 归一化与保存测试;不得因频繁切换下拉框丢失配置文件中的其他设置或敏感字段隔离规则。 ## 验收要点 - 二级套图任务栏明显降低,但任务名称、关闭按钮、新增按钮显示完整;①~⑥主模块标签高度和样式不变。 - 顶部操作栏左侧依次为「历史生成 / 打开结果文件夹 / 添加图片」,右侧账号、商品 ID、拉取按钮连续排列并整体靠右。 - 「历史生成」切换状态和结果刷新正常;打开结果文件夹、添加图片、拉取蝦皮主图行为与改版前一致,界面中无重复入口。 - 长账号名可查看完整文本;11~13 位商品 ID 在常用字体和缩放比例下不被裁切。 - 四个下拉框同一行显示且只显示值,独立标签能明确字段含义;切换、保存、恢复后 `currentData()` 及生成提示词中的业务值与改版前一致。 - 已有商品项目重新打开后恢复自己的四项设置;未绑定商品的新任务在软件重启后采用最近一次选择;当前任务继承、已有项目设置和最近一次默认值之间的优先级符合本任务第 5 节。 - 旧版 `config.json` 无新增配置段时可正常启动并使用原默认值;非法最近值被归一化,保存最近值不覆盖其他配置。 - 在最小支持窗口、常规窗口以及 Windows 100% / 125% / 150% 显示缩放下检查:无文字重叠、无横向溢出、无按钮被遮挡,键盘 Tab 顺序正确。 - 自动验证:`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` 全绿。 ## 边界(不改什么) - 不修改商品套图项目、图片资产、生成任务的数据结构和 SQLite schema;仅允许增加本任务明确的 `data/config.json` 最近设置配置段。 - 不修改 cmhub 生图请求、轮询、下载、重试、并发和计费逻辑。 - 不修改拉取蝦皮主图的 CDP 流程、选择器或 Chrome 前台切换策略。 - 不修改①~⑤模块 UI,不修改主窗口全局标签样式。 - 不新增平台、站点、语言或比例选项,不改变现有配置值的含义。 ## 执行记录 - 2026-07-14 完成。 - ⑥二级任务标签改为 36px 独立紧凑样式,不再继承主模块 Tab 的大间距;顶部操作栏左侧集中「历史生成 / 打开结果文件夹 / 添加图片」,右侧集中账号、商品 ID 和拉取主图,账号下拉限制为 120~160px 并提供完整 tooltip,商品 ID 按 13 位数字字体度量控制在 120~140px。 - 生成设置改为四列同行等宽布局,保留「平台 / 站点 / 语言 / 比例」独立标签;下拉项只显示真实值,`itemData/currentData` 和生成提示词语义不变。 - `app/product_suite.py` 统一维护四类允许选项并归一化最近设置;`data/config.json` 新增 `product_suite.last_settings`。软件重启后的未绑定新任务读取最近四项选择,同会话新任务优先继承当前任务,绑定已有项目后再由 `suite_settings_json` 覆盖。配置更新后原位刷新共享 config,避免⑤后续保存丢失该段。 - 同步 `docs/04-architecture.md`、`docs/api.md` 与 `docs/routes.md`;新增纯逻辑、appconfig 和 GUI 测试,覆盖非法值回退、其他配置保留、四列顺序/等宽、工具栏位置、跨重启恢复及已有项目优先级。 - 1180×760 离屏截图检查通过,四个下拉框宽度均为 98px,顶部操作顺序为历史生成、打开结果文件夹、添加图片、账号、商品 ID、拉取主图,无重叠。 - 当前工作区全量测试只有任务开始前已存在的默认封面提示词改名导致 3 个旧 `papa1` 断言失败;在只包含 T-627 暂存内容的干净验证工作树中运行 `py -3.10 -m unittest discover -s tests`,473 项全部通过。`python -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`git diff --check` 全部通过。