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 <cursoragent@cursor.com>
This commit is contained in:
nrq6993-a11y
2026-10-21 15:42:36 +07:00
committed by bflatastic
co-authored by Cursor
parent e76a9c1a45
commit 2927ff6e85
+27 -1
View File
@@ -124,7 +124,12 @@ impl Tool for PlaceTool {
fn overlays(&self, cx: &ToolContext) -> Vec<Overlay> {
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();