Merge pull request #3122 from nrq6993-a11y/stream/vc-feat1-g1-tool-measure-pref-gaps

G1: Pie, Live Corners, Width and Print Tiling honor measurement_labels
This commit is contained in:
BFlat
2026-10-20 02:34:34 +07:00
committed by GitHub
7 changed files with 23 additions and 8 deletions
+6 -1
View File
@@ -374,7 +374,10 @@ impl CornerDrag {
if !self.began {
return vec![];
}
let mut out = vec![Overlay::Measure { p: self.at, text: format!("Radius: {}", cx.len(self.radius)) }];
let mut out = vec![];
if cx.measurement_labels {
out.push(Overlay::Measure { p: self.at, text: format!("Radius: {}", cx.len(self.radius)) });
}
if self.at_limit {
out.push(Overlay::Path { path: self.corners_at_limit(), color: crate::builder::HIGHLIGHT_RED, width: 2.0, dashed: false });
}
@@ -465,6 +468,8 @@ mod tests {
assert!((radius(&a[1]) - 15.0).abs() < 1e-9);
assert!(matches!(&a[1], Action::Preview(_, v) if v["id"] == id.0));
assert!(t.overlays(&cx).iter().any(|o| matches!(o, Overlay::Measure { text, .. } if text == "Radius: 15.00 pt")));
let quiet = ToolContext { measurement_labels: false, ..crate::testutil::cx(&d, &s, &p) };
assert!(!t.overlays(&quiet).iter().any(|o| matches!(o, Overlay::Measure { .. })));
// Past the middle the corner is fully round; back outside it is square.
assert_eq!(radius(&t.pointer(&cx, &PointerEvent::new(PointerKind::Drag, 100.0, 100.0))[0]), 50.0);
assert_eq!(radius(&t.pointer(&cx, &PointerEvent::new(PointerKind::Drag, 260.0, 260.0))[0]), 0.0);
+3 -1
View File
@@ -399,7 +399,9 @@ impl Tool for DimensionTool {
for p in [a, b] {
out.push(Overlay::Anchor { p, color, filled: true, size: 6.0 });
}
if let Ok(text) = self.style.label(a.distance(b), false) {
if cx.measurement_labels
&& let Ok(text) = self.style.label(a.distance(b), false)
{
out.push(Overlay::Measure { p: self.at + Vec2::new(12.0, 12.0), text });
}
}
+3 -1
View File
@@ -1262,7 +1262,9 @@ impl Tool for PerspectiveSelectionTool {
}
}
}
if let Some((p, t)) = &self.measure {
if cx.measurement_labels
&& let Some((p, t)) = &self.measure
{
out.push(Overlay::Measure { p: *p, text: t.clone() });
}
out
+3 -1
View File
@@ -435,7 +435,9 @@ impl Tool for WidthTool {
let q = d.spot.p;
out.push(Overlay::Line { a: q + d.spot.n * d.left, b: q - d.spot.n * d.right, color: BLUE, dashed: false });
out.push(Overlay::Path { path: diamond(q, r), color: BLUE, width: 2.0, dashed: false });
out.push(Overlay::Measure { p: q + d.spot.n * (d.left + r * 3.0), text: format!("W: {}", cx.stroke_unit.readout(d.left + d.right)) });
if cx.measurement_labels {
out.push(Overlay::Measure { p: q + d.spot.n * (d.left + r * 3.0), text: format!("W: {}", cx.stroke_unit.readout(d.left + d.right)) });
}
} else if let Some(h) = &self.hover {
out.push(Overlay::Line { a: h.p + h.n * h.left, b: h.p - h.n * h.right, color: BLUE, dashed: true });
out.push(Overlay::Path { path: diamond(h.p, r), color: BLUE, width: 1.0, dashed: false });
+4 -2
View File
@@ -187,8 +187,8 @@ impl PieDrag {
}
/// The angle readout next to the pointer.
pub fn overlays(&self) -> Vec<Overlay> {
if !self.began {
pub fn overlays(&self, cx: &ToolContext) -> Vec<Overlay> {
if !self.began || !cx.measurement_labels {
return vec![];
}
vec![Overlay::Measure { p: self.at, text: format!("{:.1}°", self.angle) }]
@@ -275,6 +275,8 @@ mod tests {
assert!(v.get("pieStart").is_none(), "{v}");
assert!(t.transforming());
assert!(t.overlays(&c).iter().any(|o| matches!(o, Overlay::Measure { text, .. } if text == "90.0°")));
let quiet = ToolContext { measurement_labels: false, ..cx(&d, &s, &p) };
assert!(!t.overlays(&quiet).iter().any(|o| matches!(o, Overlay::Measure { .. })));
// Below the center and to the left: 225°, on the ellipse's own angles (not the page's).
let a = t.pointer(&c, &ev(PointerKind::Drag, Point::new(100.0, 200.0)));
assert!(matches!(&a[0], Action::Preview(_, v) if (v["pieEnd"].as_f64().unwrap() - 225.0).abs() < 1e-9), "{a:?}");
+3 -1
View File
@@ -79,7 +79,7 @@ impl Tool for PrintTilingTool {
fn overlays(&self, cx: &ToolContext) -> Vec<Overlay> {
match self.drag {
// How far the corner is from the artboard's.
Some((_, Some(r))) if self.began => {
Some((_, Some(r))) if self.began && cx.measurement_labels => {
vec![Overlay::Measure { p: self.last, text: cx.offset_label(self.last.x - r.x0, self.last.y - r.y0) }]
}
_ => vec![],
@@ -122,6 +122,8 @@ mod tests {
let a = t.pointer(&c, &ev(PointerKind::Drag, 2.0, 497.0));
assert_eq!(a, vec![Action::Preview("print.tiling.set".into(), json!({"origin": [0.0, 500.0], "artboard": 0}))]);
assert!(matches!(t.overlays(&c).as_slice(), [Overlay::Measure { .. }]));
let quiet = ToolContext { measurement_labels: false, ..cx(&d, &s, &pd) };
assert!(t.overlays(&quiet).is_empty());
assert_eq!(t.pointer(&c, &ev(PointerKind::Up, 2.0, 497.0)), vec![Action::Commit]);
assert!(!t.busy());
// A click alone changes nothing; a double click resets.
+1 -1
View File
@@ -714,7 +714,7 @@ impl Tool for SelectionTool {
match &self.state {
State::Marquee { start, cur, .. } => o.push(Overlay::Marquee(Rect::from_points(*start, *cur))),
State::Corner(c) => o.extend(c.overlays(cx)),
State::Pie(d) => o.extend(d.overlays()),
State::Pie(d) => o.extend(d.overlays(cx)),
State::Loaded { press: Some((start, cur)), .. } => o.push(Overlay::Marquee(Rect::from_points(*start, *cur))),
_ => {}
}