From 2927ff6e85c5ebb9bcd240408ceaaa13f3df960a Mon Sep 17 00:00:00 2001 From: nrq6993-a11y Date: Tue, 20 Oct 2026 13:39:03 +0300 Subject: [PATCH] G1: Place tool shows placement size in measurement labels while dragging. Honor Show Measurement Labels on the file Place cursor so sizing drags get W/H readouts like other draw tools. Co-authored-by: Cursor --- crates/tools/src/place.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/crates/tools/src/place.rs b/crates/tools/src/place.rs index a885b0ca3..34fabb6d4 100644 --- a/crates/tools/src/place.rs +++ b/crates/tools/src/place.rs @@ -124,7 +124,12 @@ impl Tool for PlaceTool { fn overlays(&self, cx: &ToolContext) -> Vec { let Some((a, b)) = self.drag else { return vec![] }; - self.target(a, b, cx.tol(3.0)).map(Overlay::Marquee).into_iter().collect() + let Some(r) = self.target(a, b, cx.tol(3.0)) else { return vec![] }; + let mut o = vec![Overlay::Marquee(r)]; + if cx.measurement_labels { + o.push(Overlay::Measure { p: b, text: cx.size_label(r.width(), r.height()) }); + } + o } fn cursor(&self, _cx: &ToolContext, _p: Point, _mods: Mods) -> Cursor { @@ -226,6 +231,27 @@ mod tests { assert!(!t.claims_key(&c, ToolKey::Escape), "an empty cursor takes no keys"); } + #[test] + fn measurement_labels_gate_the_place_size_readout() { + let (d, _) = doc_with_rect(); + let (s, p) = (Default::default(), paint()); + let base = cx(&d, &s, &p); + let mut t = loaded(1); + t.pointer(&base, &ev(PointerKind::Down, 100.0, 100.0)); + t.pointer(&base, &ev(PointerKind::Drag, 20.0, 90.0)); + let r = Rect::new(20.0, 60.0, 100.0, 100.0); + for on in [false, true] { + let c = ToolContext { measurement_labels: on, ..base }; + let o = t.overlays(&c); + assert!(o.iter().any(|x| matches!(x, Overlay::Marquee(_)))); + let measures = o.iter().filter(|x| matches!(x, Overlay::Measure { .. })).count(); + assert_eq!(measures, usize::from(on), "measurement labels {on}"); + if on { + assert!(o.iter().any(|x| matches!(x, Overlay::Measure { p, text, .. } if *p == Point::new(20.0, 90.0) && text == &c.size_label(r.width(), r.height())))); + } + } + } + #[test] fn arrows_cycle_and_escape_discards() { let (d, _) = doc_with_rect();