From be1eb9ee36b1754d9445c6b148bd053da6a21b47 Mon Sep 17 00:00:00 2001 From: ila Date: Tue, 23 Jun 2026 17:09:42 +0800 Subject: [PATCH] =?UTF-8?q?style(ai-outfit):=20=E6=98=8E=E7=BB=86=E8=A1=A8?= =?UTF-8?q?=E5=86=8D=E7=BC=A9=E3=80=8C=E8=A1=A3=E6=9C=8D=E5=9B=BE/?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=C2=B7=E5=8E=9F=E5=9B=A0=E3=80=8D=E3=80=81?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E6=9B=B4=E5=AE=BD=20(=C2=A719.26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 承接 §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 --- docs/11-ai-outfit.md | 1 + src/app/widgets/ai_outfit_panel.py | 4 ++-- tasks.md | 18 ++++++++++++++++++ tests/test_ai_outfit_panel.py | 3 +++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/11-ai-outfit.md b/docs/11-ai-outfit.md index 0194ead..f97be04 100644 --- a/docs/11-ai-outfit.md +++ b/docs/11-ai-outfit.md @@ -275,6 +275,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只 - **左栏(数据源 + 标题/话术创作,~360px)**:`Excel` / `输出` 各为**行内一行**(标签 + 路径 + 浏览,省纵向空间);数据源概览(共 N 行 / 完成 / 待处理 / 失败);**「标题生成」组(§17)在上**:标题生成提示词编辑 +「保存」+「生成标题」(**无标题模型下拉**,模型由 `title_model` 配置定名,§17.3);**「穿搭生成话术」组在下**:模板下拉 + 按钮行 `新建/另存为/重命名/保存/删除` + 话术编辑框 + 下方「插入标题」「预览最终提示词」(预览为弹窗,数据行下拉在弹窗内,§7.3)。图片 AI 模型下拉在右栏;标题模型不放界面。 - **中栏(结果 + 明细)**:顶部「最近结果」缩略图条——**只展示已完成的人物效果图**,新图自动加到最左、首图标「最新」,单击看大图、右键开所在文件夹;下方「处理明细」表(行 / 标题 / 货号 / 衣服图 / 状态 / 结果或原因),按 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 心跳行)。 > **设计取舍:不做"实时单图大预览"。** 这是"开了走人、回头抽查"的批量工具;单图实时预览在并发时会产生"该显示哪一行"的歧义。改为「最近结果缩略图条」——只展示已落地成品,既保留"早发现话术/模型不对、及时停掉改话术"的价值,又因只显示成品而消除并发歧义。 diff --git a/src/app/widgets/ai_outfit_panel.py b/src/app/widgets/ai_outfit_panel.py index e200e8b..3c0b4dd 100644 --- a/src/app/widgets/ai_outfit_panel.py +++ b/src/app/widgets/ai_outfit_panel.py @@ -602,9 +602,9 @@ class AiOutfitPanel(QWidget): widths = { 0: 46, # 行 2: 88, # 货号 - 3: 150, # 衣服图 + 3: 90, # 衣服图(§19.26 再缩,让位给标题) 4: 76, # 状态 - 5: 220, # 结果 / 原因 + 5: 130, # 结果 / 原因(§19.26 再缩) } for col, width in widths.items(): header.setSectionResizeMode(col, QHeaderView.Fixed if col in (0, 2, 4) else QHeaderView.Interactive) diff --git a/tasks.md b/tasks.md index cbf395b..56b8b3e 100644 --- a/tasks.md +++ b/tasks.md @@ -1457,3 +1457,21 @@ - [x] `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` 改动阻塞(模型顺序/额外条目与出厂模板规范不一致),待清理该文件后重跑 + +### 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,无关);离屏断言新列宽 \ No newline at end of file diff --git a/tests/test_ai_outfit_panel.py b/tests/test_ai_outfit_panel.py index b02c96d..dfd4a67 100644 --- a/tests/test_ai_outfit_panel.py +++ b/tests/test_ai_outfit_panel.py @@ -86,6 +86,9 @@ class TestAiOutfitPanelDefaults(unittest.TestCase): self.assertLessEqual(panel._table.columnWidth(0), 56) self.assertLessEqual(panel._table.columnWidth(2), 100) 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): """标题生成组存在;无标题模型下拉(配置定名 §17.3);预览块已移除。"""