diff --git a/docs/08-image-editor-design.md b/docs/08-image-editor-design.md index 4816e06..2638afa 100644 --- a/docs/08-image-editor-design.md +++ b/docs/08-image-editor-design.md @@ -121,6 +121,7 @@ Scene 坐标是 `QGraphicsScene` 中的坐标。 恢复规则: - 控制层被隐藏后,用户再次点击预览区中的印花图片,应恢复控制层,并继续沿用原有拖动逻辑。 +- 控制层显示时,用户点击没有命中印花图片、缩放控制点或旋转控制点的预览空白区域,应隐藏控制层。 - 控制层隐藏期间,隐藏的缩放控制点和旋转控制点不需要响应命中测试;恢复后原有缩放、旋转行为保持不变。 - 重新加载印花图片或创建新的印花图层时,控制层默认显示。 @@ -595,6 +596,7 @@ RGB 颜色距离 - 参数面板输入后预览同步。 - 预览拖动后参数面板同步。 - 点击预览区后按 `Esc`,印花选中框、缩放控制点和旋转控制点隐藏,但印花仍可见。 +- 点击预览区灰色空白区域或衣服图上未命中印花的位置,印花选中框、缩放控制点和旋转控制点隐藏。 - 控制层隐藏后再次点击印花,控制层恢复,拖动、缩放、旋转仍按原有规则工作。 - 控制层显隐不改变 `TransformState`,也不影响导出结果。 - 白色衣服配浅色印花时能标记为低对比或不明显。 diff --git a/src/app/widgets/image_canvas.py b/src/app/widgets/image_canvas.py index b9434b7..ba7d133 100644 --- a/src/app/widgets/image_canvas.py +++ b/src/app/widgets/image_canvas.py @@ -508,6 +508,7 @@ class ImageCanvas(QWidget): return tag = self._hit_test(scene_pos) if tag is None: + self._hide_controls() return if tag == _T_PRINT and not self._controls_visible: self._set_controls_visible(True) diff --git a/tasks.md b/tasks.md index 40644ba..6badf7a 100644 --- a/tasks.md +++ b/tasks.md @@ -1675,3 +1675,29 @@ - [x] 控制层隐藏后再次点击印花,控制层恢复,并可继续拖动、缩放、旋转 - [x] 控制层显隐不改变 X/Y、宽高、角度,也不影响单张导出和批量导出 - [x] 通过必要语法检查和离屏 GUI 验证:`python -m py_compile src/app/widgets/image_canvas.py tests/test_image_canvas.py`、`python tests/test_image_canvas.py` + +### 19.35 添加印花预览:点击空白区域隐藏控制层 — docs/08 §5.1 + +前置阅读: + +- `docs/08-image-editor-design.md`(§5.1 预览控制层显隐) +- `src/app/widgets/image_canvas.py`(`_hit_test`、`_on_press`、`_hide_controls`) +- `tests/test_image_canvas.py` + +背景: + +§19.34 已支持按 `Esc` 隐藏选中框和控制点。用户继续要求:点击图片两边的灰色预览区域时,也能隐藏当前印花的选中框和控制点,便于快速查看接近最终导出的干净预览。 + +任务: + +- [x] 文档:补充点击未命中印花 / 控制点的预览空白区域时隐藏控制层 +- [x] `image_canvas.py`:`_on_press` 命中测试为空时调用 `_hide_controls()`,不启动拖动 +- [x] `image_canvas.py`:点击空白区域只隐藏控制层,不隐藏 `_print_item`,不修改 `TransformState` +- [x] 测试:补充点击空白 scene 坐标隐藏控制层且状态不变 + +验收: + +- [x] 控制层显示时,点击预览两侧灰色区域会隐藏选中框、缩放控制点和旋转控制点 +- [x] 点击空白区域后印花图片仍显示,X/Y、宽高、角度不变 +- [x] 点击印花图片仍恢复控制层并保持原有拖动行为 +- [x] 验证:`python -m py_compile src/app/widgets/image_canvas.py tests/test_image_canvas.py`、`python tests/test_image_canvas.py` diff --git a/tests/test_image_canvas.py b/tests/test_image_canvas.py index f08ca5f..b771878 100644 --- a/tests/test_image_canvas.py +++ b/tests/test_image_canvas.py @@ -91,6 +91,20 @@ class TestImageCanvasControls(unittest.TestCase): self.assertTrue(self._controls_visible(canvas)) self.assertEqual(canvas._drag_tag, "print") + def test_clicking_empty_canvas_hides_controls_without_changing_transform(self): + from PySide6.QtCore import QPointF + + canvas = self._canvas() + before = self._state_tuple(canvas) + + canvas._on_press(QPointF(-20.0, -20.0)) + + self.assertFalse(canvas._controls_visible) + self.assertFalse(self._controls_visible(canvas)) + self.assertTrue(canvas._print_item.isVisible()) + self.assertIsNone(canvas._drag_tag) + self.assertEqual(self._state_tuple(canvas), before) + def test_loading_print_restores_controls_visible_by_default(self): canvas = self._canvas() canvas._hide_controls()