Merge pull request #4168 from nrq6993-a11y/stream/vc-feat-g1-slice-resize-transform-tools

G1: Slice Selection resize honors Transform Tools
This commit is contained in:
BFlat
2026-10-26 09:12:33 +07:00
committed by GitHub
+42 -19
View File
@@ -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");
}
}