diff --git a/TeXmacs/progs/generic/format-geometry-edit.scm b/TeXmacs/progs/generic/format-geometry-edit.scm index 8a8d705835..06247681fd 100644 --- a/TeXmacs/progs/generic/format-geometry-edit.scm +++ b/TeXmacs/progs/generic/format-geometry-edit.scm @@ -518,6 +518,7 @@ (define image-resize-start-y #f) (define image-resize-orig-w #f) (define image-resize-orig-h #f) +(define image-resize-mark #f) (define (image-get-bbox t) ;; 获取图片节点的边界框坐标列表 (x1 y1 x2 y2) @@ -592,7 +593,10 @@ ((s) (when (> (- oh sy) 0.1) (tree-set! t 2 (cm->str (- oh sy))) (refresh-window))))))) (define (image-reset-drag-state!) - ;; 重置5个拖拽变量的值,以便下一次重新使用 + ;; 重置拖拽变量和编辑会话标记的值,以便下一次重新使用 + (when image-resize-mark + (mark-cancel image-resize-mark) + (set! image-resize-mark #f)) (set! image-resize-handle #f) (set! image-resize-start-x #f) (set! image-resize-start-y #f) @@ -615,7 +619,9 @@ (set! image-resize-start-x x) (set! image-resize-start-y y) (set! image-resize-orig-w (if dims (car dims) (cm->tmpt 1))) - (set! image-resize-orig-h (if dims (cadr dims) (cm->tmpt 1)))))) + (set! image-resize-orig-h (if dims (cadr dims) (cm->tmpt 1))) + (set! image-resize-mark (mark-new)) + (mark-start image-resize-mark)))) (former key x y mods time data)) ((== key "dragging-left") (if image-resize-handle @@ -624,5 +630,8 @@ (- x image-resize-start-x) (- y image-resize-start-y))) (former key x y mods time data))) ((== key "end-drag-left") + (when image-resize-mark + (mark-end image-resize-mark) + (set! image-resize-mark #f)) (image-reset-drag-state!) (former key x y mods time data))))) diff --git a/devel/201_70.md b/devel/201_70.md new file mode 100644 index 0000000000..ff6fde1d4f --- /dev/null +++ b/devel/201_70.md @@ -0,0 +1,21 @@ +# [201_70] 修复图片缩放的撤销问题 + +## 如何测试 +1. 新建文档,插入一张图片 +2. 鼠标拖动图片的8个调整手柄(四个角和四条边)进行缩放 +3. 释放左键后,按住 `Ctrl+Z` 撤销,应该只需要一次就能完全恢复到原始尺寸 +4. 连续进行多次独立的拖拽缩放操作(独立指每次拖拽操作之间左键没有释放),每次撤销应该对应一次独立的拖拽操作 + +## 2026/1/30 +### What +在图片鼠标拖拽缩放功能中添加编辑会话标记,将整个拖拽过程作为一个事务处理,避免撤销时逐帧回退 + +### Why +原实现中,鼠标拖拽缩放图片时,每帧修改都会调用 `tree-set!` 触发独立的撤销记录,导致用户需要按多次 `Ctrl+Z` 才能完全撤销一次拖拽操作 + +这不符合用户直觉,每次拖拽应该对应一次撤销操作,与表格格线拖动等操作保持一致 + +### How +1. 在 `format-geometry-edit.scm` 中添加 `image-resize-mark` 全局变量(编辑会话标记) +2. 在鼠标开始拖拽时(`start-drag-left`)调用 `(mark-new)` 创建标记并 `(mark-start)` 开始编辑会话 +3. 在鼠标结束拖拽时(`end-drag-left`)调用 `(mark-end)` 结束编辑会话,将整个拖拽过程合并为一个撤销记录