diff --git a/crates/tools/src/slice.rs b/crates/tools/src/slice.rs index 6d2a07b4a..8b092d8ad 100644 --- a/crates/tools/src/slice.rs +++ b/crates/tools/src/slice.rs @@ -326,25 +326,24 @@ impl Tool for SliceSelectionTool { } } o.extend(self.guides.iter().cloned()); - // Smart Guides › Measurement Labels: the size readouts while resizing or moving slices. - match self.drag.as_ref().filter(|_| cx.measurement_labels) { - Some(Drag::Resize { id, began: true, .. }) => { - if let Some(r) = cx.doc.slice_bounds(*id) { - o.push(Overlay::Measure { - p: Point::new(r.x1, r.y1) + Vec2::new(cx.tol(12.0), cx.tol(12.0)), - text: cx.size_label(r.width(), r.height()), - }); - } - } - Some(Drag::Move { ids, began: true, .. }) => { - if let Some(r) = ids.iter().filter_map(|id| cx.doc.slice_bounds(*id)).reduce(|a, b| a.union(b)) { - o.push(Overlay::Measure { - p: Point::new(r.x1, r.y1) + Vec2::new(cx.tol(12.0), cx.tol(12.0)), - text: cx.size_label(r.width(), r.height()), - }); - } - } - _ => {} + // Smart Guides › Transform Tools: W/H while resizing; Measurement Labels: while moving. + if let Some(Drag::Resize { id, began: true, .. }) = self.drag.as_ref() + && cx.transform_tools_guides + && let Some(r) = cx.doc.slice_bounds(*id) + { + o.push(Overlay::Measure { + p: Point::new(r.x1, r.y1) + Vec2::new(cx.tol(12.0), cx.tol(12.0)), + text: cx.size_label(r.width(), r.height()), + }); + } + if let Some(Drag::Move { ids, began: true, .. }) = self.drag.as_ref() + && cx.measurement_labels + && let Some(r) = ids.iter().filter_map(|id| cx.doc.slice_bounds(*id)).reduce(|a, b| a.union(b)) + { + o.push(Overlay::Measure { + p: Point::new(r.x1, r.y1) + Vec2::new(cx.tol(12.0), cx.tol(12.0)), + text: cx.size_label(r.width(), r.height()), + }); } o } @@ -566,4 +565,28 @@ mod tests { let grid = ToolContext { snap_to_grid: true, ..cx(&d, &sel, &p) }; assert!(near(resize(&grid, (60.0, 40.0), (99.0, 46.0), none), Rect::new(10.0, 10.0, 98.0, 45.0))); } + + #[test] + fn slice_resize_readout_honors_transform_tools_guides() { + let (d, a, _) = doc_with_slices(); + let p = paint(); + let mut sel = Selection::default(); + sel.set_slices([a]); + let measures = |t: &SliceSelectionTool, c: &ToolContext| t.overlays(c).iter().filter(|o| matches!(o, Overlay::Measure { .. })).count(); + for on in [true, false] { + let c = ToolContext { transform_tools_guides: on, ..cx(&d, &sel, &p) }; + let mut t = SliceSelectionTool::default(); + t.pointer(&c, &ev(PointerKind::Down, 60.0, 40.0)); + t.pointer(&c, &ev(PointerKind::Drag, 80.0, 50.0)); + assert_eq!(measures(&t, &c), usize::from(on), "transform tools {on}"); + t.pointer(&c, &ev(PointerKind::Up, 80.0, 50.0)); + } + let move_labels = ToolContext { measurement_labels: true, transform_tools_guides: false, ..cx(&d, &sel, &p) }; + let mut t = SliceSelectionTool::default(); + t.pointer(&move_labels, &ev(PointerKind::Down, 20.0, 20.0)); + t.pointer(&move_labels, &ev(PointerKind::Drag, 30.0, 25.0)); + assert_eq!(measures(&t, &move_labels), 1); + let no_labels = ToolContext { measurement_labels: false, transform_tools_guides: true, ..cx(&d, &sel, &p) }; + assert_eq!(measures(&t, &no_labels), 0, "move still follows measurement labels"); + } }