style(ai-outfit): 明细表再缩「衣服图/结果·原因」、标题更宽 (§19.26)
承接 §19.25:_configure_detail_table_columns 把「衣服图」(col3) 初值 150→90、「结果/原因」(col5) 220→130(仍 Interactive 可手拖);「标题」 Stretch 自动吸收省下的宽度变更宽,短固定列(行/货号/状态)不变。 测试:列宽用例补断言 columnWidth(3)<=90、columnWidth(5)<=130。 全套 py37 通过(test_config_service 的 packaging 模板失败属并行 §19.13,无关)。 离屏冒烟:衣服图=90 / 结果·原因=130(Interactive)、标题 Stretch。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -275,6 +275,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
|||||||
|
|
||||||
- **左栏(数据源 + 标题/话术创作,~360px)**:`Excel` / `输出` 各为**行内一行**(标签 + 路径 + 浏览,省纵向空间);数据源概览(共 N 行 / 完成 / 待处理 / 失败);**「标题生成」组(§17)在上**:标题生成提示词编辑 +「保存」+「生成标题」(**无标题模型下拉**,模型由 `title_model` 配置定名,§17.3);**「穿搭生成话术」组在下**:模板下拉 + 按钮行 `新建/另存为/重命名/保存/删除` + 话术编辑框 + 下方「插入标题」「预览最终提示词」(预览为弹窗,数据行下拉在弹窗内,§7.3)。图片 AI 模型下拉在右栏;标题模型不放界面。
|
- **左栏(数据源 + 标题/话术创作,~360px)**:`Excel` / `输出` 各为**行内一行**(标签 + 路径 + 浏览,省纵向空间);数据源概览(共 N 行 / 完成 / 待处理 / 失败);**「标题生成」组(§17)在上**:标题生成提示词编辑 +「保存」+「生成标题」(**无标题模型下拉**,模型由 `title_model` 配置定名,§17.3);**「穿搭生成话术」组在下**:模板下拉 + 按钮行 `新建/另存为/重命名/保存/删除` + 话术编辑框 + 下方「插入标题」「预览最终提示词」(预览为弹窗,数据行下拉在弹窗内,§7.3)。图片 AI 模型下拉在右栏;标题模型不放界面。
|
||||||
- **中栏(结果 + 明细)**:顶部「最近结果」缩略图条——**只展示已完成的人物效果图**,新图自动加到最左、首图标「最新」,单击看大图、右键开所在文件夹;下方「处理明细」表(行 / 标题 / 货号 / 衣服图 / 状态 / 结果或原因),按 Excel 行顺序,状态用 完成 / 失败 / 生成中 / 待处理 / 跳过 徽章。
|
- **中栏(结果 + 明细)**:顶部「最近结果」缩略图条——**只展示已完成的人物效果图**,新图自动加到最左、首图标「最新」,单击看大图、右键开所在文件夹;下方「处理明细」表(行 / 标题 / 货号 / 衣服图 / 状态 / 结果或原因),按 Excel 行顺序,状态用 完成 / 失败 / 生成中 / 待处理 / 跳过 徽章。
|
||||||
|
- **列宽(§19.25 / §19.26)**:「行 / 货号 / 状态」是**窄固定列**(`QHeaderView.Fixed`,约 46 / 88 / 76px);「衣服图 / 结果·原因」也收窄为可手拖的小初值(`Interactive`,约 90 / 130px,§19.26 再缩);省下的横向空间全部让给**标题**——「标题」列设 `QHeaderView.Stretch` 吃满剩余宽度(其余列越窄,标题越宽)。由 `_configure_detail_table_columns()` 统一设置。
|
||||||
- **右栏(设置 + 运行,~400px)**:生成设置标题与「重试上次失败的行」同排;图片并发数 / 新请求间隔 / 单任务冷却 / 失败重试 / 分辨率 / JPG 质量保持 **3 列 × 2 行**;`AI 模型` 标签与下拉框同排;本次进度 + 统计(完成 / 失败 / 待处理);开始生成 / 停止生成同排;导出失败清单 / 打开输出目录同排;节省的纵向空间给实时日志(含 §8 心跳行)。
|
- **右栏(设置 + 运行,~400px)**:生成设置标题与「重试上次失败的行」同排;图片并发数 / 新请求间隔 / 单任务冷却 / 失败重试 / 分辨率 / JPG 质量保持 **3 列 × 2 行**;`AI 模型` 标签与下拉框同排;本次进度 + 统计(完成 / 失败 / 待处理);开始生成 / 停止生成同排;导出失败清单 / 打开输出目录同排;节省的纵向空间给实时日志(含 §8 心跳行)。
|
||||||
|
|
||||||
> **设计取舍:不做"实时单图大预览"。** 这是"开了走人、回头抽查"的批量工具;单图实时预览在并发时会产生"该显示哪一行"的歧义。改为「最近结果缩略图条」——只展示已落地成品,既保留"早发现话术/模型不对、及时停掉改话术"的价值,又因只显示成品而消除并发歧义。
|
> **设计取舍:不做"实时单图大预览"。** 这是"开了走人、回头抽查"的批量工具;单图实时预览在并发时会产生"该显示哪一行"的歧义。改为「最近结果缩略图条」——只展示已落地成品,既保留"早发现话术/模型不对、及时停掉改话术"的价值,又因只显示成品而消除并发歧义。
|
||||||
|
|||||||
@@ -602,9 +602,9 @@ class AiOutfitPanel(QWidget):
|
|||||||
widths = {
|
widths = {
|
||||||
0: 46, # 行
|
0: 46, # 行
|
||||||
2: 88, # 货号
|
2: 88, # 货号
|
||||||
3: 150, # 衣服图
|
3: 90, # 衣服图(§19.26 再缩,让位给标题)
|
||||||
4: 76, # 状态
|
4: 76, # 状态
|
||||||
5: 220, # 结果 / 原因
|
5: 130, # 结果 / 原因(§19.26 再缩)
|
||||||
}
|
}
|
||||||
for col, width in widths.items():
|
for col, width in widths.items():
|
||||||
header.setSectionResizeMode(col, QHeaderView.Fixed if col in (0, 2, 4) else QHeaderView.Interactive)
|
header.setSectionResizeMode(col, QHeaderView.Fixed if col in (0, 2, 4) else QHeaderView.Interactive)
|
||||||
|
|||||||
@@ -1457,3 +1457,21 @@
|
|||||||
- [x] `ai_outfit_panel.py`:新增处理明细表列宽配置;「行」「货号」「状态」固定窄列,「衣服图」「结果 / 原因」给可拖动默认宽度,「标题」使用 Stretch 占用剩余空间
|
- [x] `ai_outfit_panel.py`:新增处理明细表列宽配置;「行」「货号」「状态」固定窄列,「衣服图」「结果 / 原因」给可拖动默认宽度,「标题」使用 Stretch 占用剩余空间
|
||||||
- [x] `test_ai_outfit_panel.py`:补离屏测试,断言短字段列固定、标题列 Stretch
|
- [x] `test_ai_outfit_panel.py`:补离屏测试,断言短字段列固定、标题列 Stretch
|
||||||
- [~] 验证:`python -m py_compile src/app/widgets/ai_outfit_panel.py`、`python tests/test_ai_outfit_panel.py`、离屏启动主窗口通过;全套 `python -m unittest discover -s tests` 当前被工作区未提交的 `packaging/default_config/ai_models.json` 改动阻塞(模型顺序/额外条目与出厂模板规范不一致),待清理该文件后重跑
|
- [~] 验证:`python -m py_compile src/app/widgets/ai_outfit_panel.py`、`python tests/test_ai_outfit_panel.py`、离屏启动主窗口通过;全套 `python -m unittest discover -s tests` 当前被工作区未提交的 `packaging/default_config/ai_models.json` 改动阻塞(模型顺序/额外条目与出厂模板规范不一致),待清理该文件后重跑
|
||||||
|
|
||||||
|
### 19.26 处理明细表:再缩「衣服图 / 结果·原因」、再宽「标题」 — docs/11 §10
|
||||||
|
|
||||||
|
前置阅读:
|
||||||
|
|
||||||
|
- `docs/11-ai-outfit.md`(§10 中栏 列宽)
|
||||||
|
- `src/app/widgets/ai_outfit_panel.py`(`_configure_detail_table_columns`)
|
||||||
|
- `tests/test_ai_outfit_panel.py`(`test_detail_table_compacts_short_columns_and_stretches_title`)
|
||||||
|
|
||||||
|
背景:
|
||||||
|
|
||||||
|
承接 §19.25。「衣服图」「结果 / 原因」仍偏宽,再收窄,把更多横向空间让给 Stretch 的「标题」列。
|
||||||
|
|
||||||
|
任务:
|
||||||
|
|
||||||
|
- [x] `ai_outfit_panel.py` `_configure_detail_table_columns`:把「衣服图」(col 3) 初值 150→约 90、「结果 / 原因」(col 5) 初值 220→约 130(仍 `Interactive` 可手拖);「行/货号/状态」固定窄列与「标题」Stretch 不变 → 标题自动更宽
|
||||||
|
- [x] `test_ai_outfit_panel.py`:在既有列宽用例补断言——`columnWidth(3) <= 90`、`columnWidth(5) <= 130`(标题仍 Stretch、短列仍 Fixed 不变)
|
||||||
|
- [x] 验证:`test_ai_outfit_panel.py` + 全套 py37 通过(`test_config_service` 的 packaging 模板失败属并行 §19.13,无关);离屏断言新列宽
|
||||||
@@ -86,6 +86,9 @@ class TestAiOutfitPanelDefaults(unittest.TestCase):
|
|||||||
self.assertLessEqual(panel._table.columnWidth(0), 56)
|
self.assertLessEqual(panel._table.columnWidth(0), 56)
|
||||||
self.assertLessEqual(panel._table.columnWidth(2), 100)
|
self.assertLessEqual(panel._table.columnWidth(2), 100)
|
||||||
self.assertLessEqual(panel._table.columnWidth(4), 90)
|
self.assertLessEqual(panel._table.columnWidth(4), 90)
|
||||||
|
# §19.26: 衣服图 / 结果·原因 再收窄(仍可手拖)
|
||||||
|
self.assertLessEqual(panel._table.columnWidth(3), 90)
|
||||||
|
self.assertLessEqual(panel._table.columnWidth(5), 130)
|
||||||
|
|
||||||
def test_title_group_present_no_dropdown_preview_removed(self):
|
def test_title_group_present_no_dropdown_preview_removed(self):
|
||||||
"""标题生成组存在;无标题模型下拉(配置定名 §17.3);预览块已移除。"""
|
"""标题生成组存在;无标题模型下拉(配置定名 §17.3);预览块已移除。"""
|
||||||
|
|||||||
Reference in New Issue
Block a user