Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions TeXmacs/progs/generic/format-geometry-edit.scm
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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)))))
21 changes: 21 additions & 0 deletions devel/201_70.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# [201_70] 修复图片缩放的撤销问题

## 如何测试
1. 新建文档,插入一张图片
2. 鼠标拖动图片的8个调整手柄(四个角和四条边)进行缩放
3. 释放左键后,按住 `Ctrl+Z` 撤销,应该只需要一次就能完全恢复到原始尺寸
4. 连续进行多次独立的拖拽缩放操作(独立指每次拖拽操作之间左键没有释放),每次撤销应该对应一次独立的拖拽操作
Copy link

Copilot AI Jan 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

测试步骤 4 的括号说明有语义错误:“独立的拖拽操作”一般指每次拖拽之间左键已经释放;当前写成“左键没有释放”会让测试步骤相互矛盾。建议改为“独立指每次拖拽操作之间左键已释放/每次拖拽都先松开左键再开始下一次”。

Suggested change
4. 连续进行多次独立的拖拽缩放操作(独立指每次拖拽操作之间左键没有释放),每次撤销应该对应一次独立的拖拽操作
4. 连续进行多次独立的拖拽缩放操作(“独立”指每次拖拽操作结束后先松开左键,再开始下一次拖拽),每次撤销应该对应一次独立的拖拽操作

Copilot uses AI. Check for mistakes.

## 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)` 结束编辑会话,将整个拖拽过程合并为一个撤销记录