From 361ebd29bfb195e6e608509479225203cdaca628 Mon Sep 17 00:00:00 2001 From: nrq6993-a11y Date: Mon, 19 Oct 2026 21:43:55 +0300 Subject: [PATCH] G1: Free Distort corner drags show dX/dY measurement labels Honor Measurement Labels during envelope-style corner drags on the Free Transform tool, matching the Move handle readout. Co-authored-by: Cursor --- crates/tools/src/xform/free.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/tools/src/xform/free.rs b/crates/tools/src/xform/free.rs index e975be0f8..550a9baf0 100644 --- a/crates/tools/src/xform/free.rs +++ b/crates/tools/src/xform/free.rs @@ -189,7 +189,7 @@ impl FreeTransformTool { Op::Corners(h, mode) => { let q = distort_quad(d.rect, h, delta, mode); self.quad = Some(q); - self.measure = None; + self.measure = cx.measurement_labels.then(|| (p, cx.offset_label(delta.x, delta.y))); let corners: Vec = q.iter().map(|c| json!([c.x, c.y])).collect(); return Action::Preview("object.distort".into(), json!({ "corners": corners, "from": [d.rect.x0, d.rect.y0, d.rect.x1, d.rect.y1] })); } @@ -520,4 +520,23 @@ mod tests { assert_eq!(q[1], Point::new(8.0, 0.0)); assert_eq!(q[2], Point::new(10.0, 10.0)); } + + #[test] + fn distort_drag_shows_move_measurement_labels() { + let (d, id) = doc_with_rect(); + let mut s = Selection::default(); + s.add(id); + let p = paint(); + let cx = |on: bool| ToolContext { measurement_labels: on, ..cx(&d, &s, &p) }; + let mut t = FreeTransformTool::default(); + t.set_option("mode", &json!("distort")); + t.pointer(&cx(true), &ev(PointerKind::Down, 200.0, 200.0)); + t.pointer(&cx(true), &ev(PointerKind::Drag, 220.0, 230.0)); + let want = cx(true).offset_label(20.0, 30.0); + assert!(t.overlays(&cx(true)).iter().any(|o| matches!(o, Overlay::Measure { text, .. } if text == &want))); + t.pointer(&cx(true), &ev(PointerKind::Up, 220.0, 230.0)); + t.pointer(&cx(false), &ev(PointerKind::Down, 200.0, 200.0)); + t.pointer(&cx(false), &ev(PointerKind::Drag, 220.0, 230.0)); + assert!(t.overlays(&cx(false)).iter().all(|o| !matches!(o, Overlay::Measure { .. }))); + } }