mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-26 10:47:11 -06:00
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:
+42
-19
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user