feat: hide preview controls on empty click

This commit is contained in:
2026-07-04 17:39:33 +08:00
parent 2ca0655c90
commit c40de68379
4 changed files with 43 additions and 0 deletions
+2
View File
@@ -121,6 +121,7 @@ Scene 坐标是 `QGraphicsScene` 中的坐标。
恢复规则:
- 控制层被隐藏后,用户再次点击预览区中的印花图片,应恢复控制层,并继续沿用原有拖动逻辑。
- 控制层显示时,用户点击没有命中印花图片、缩放控制点或旋转控制点的预览空白区域,应隐藏控制层。
- 控制层隐藏期间,隐藏的缩放控制点和旋转控制点不需要响应命中测试;恢复后原有缩放、旋转行为保持不变。
- 重新加载印花图片或创建新的印花图层时,控制层默认显示。
@@ -595,6 +596,7 @@ RGB 颜色距离
- 参数面板输入后预览同步。
- 预览拖动后参数面板同步。
- 点击预览区后按 `Esc`,印花选中框、缩放控制点和旋转控制点隐藏,但印花仍可见。
- 点击预览区灰色空白区域或衣服图上未命中印花的位置,印花选中框、缩放控制点和旋转控制点隐藏。
- 控制层隐藏后再次点击印花,控制层恢复,拖动、缩放、旋转仍按原有规则工作。
- 控制层显隐不改变 `TransformState`,也不影响导出结果。
- 白色衣服配浅色印花时能标记为低对比或不明显。
+1
View File
@@ -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)
+26
View File
@@ -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`
+14
View File
@@ -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()