Clip behavior card labels to their bounds

This commit is contained in:
2026-09-11 10:23:36 -07:00
parent 7831abeed5
commit 4da92ab481
3 changed files with 253 additions and 18 deletions
+36 -18
View File
@@ -1069,6 +1069,17 @@ struct BoxItem {
detail: String,
marker: Option<Kind>,
}
fn box_text_clip(rect: Rectangle, scale: f32, viewport: Size) -> Option<Rectangle> {
if !scale.is_finite() || scale <= 0. || rect.width <= 20. || rect.height <= 16. {
return None;
}
Rectangle::new(
Point::new((rect.x + 10.) * scale, (rect.y + 8.) * scale),
Size::new((rect.width - 20.) * scale, (rect.height - 16.) * scale),
)
.intersection(&Rectangle::new(Point::ORIGIN, viewport))
}
struct Line {
id: Id,
points: Vec<Point>,
@@ -2134,24 +2145,31 @@ impl canvas::Program<Message> for Scene {
}
}
for b in &self.boxes {
f.fill_text(Text {
content: short(&b.title, ((b.rect.width - 25.) / 7.) as usize),
position: Point::new(b.rect.x + 12., b.rect.y + 12.),
size: 13.into(),
color: if b.id == self.selected {
style::TEAL
} else {
style::INK
},
..Default::default()
});
if !b.detail.is_empty() {
f.fill_text(Text {
content: short(&b.detail, ((b.rect.width - 25.) / 6.) as usize),
position: Point::new(b.rect.x + 12., b.rect.y + 39.),
size: 11.into(),
color: style::MUTED,
..Default::default()
if let Some(clip) = box_text_clip(b.rect, self.scale, f.size()) {
// Clipped child frames start with an identity transform. Match
// the card's scale explicitly, as for lifecycle Create labels.
f.with_clip(clip, |label| {
label.scale(self.scale);
label.fill_text(Text {
content: short(&b.title, ((b.rect.width - 25.) / 7.) as usize),
position: Point::new(b.rect.x + 12., b.rect.y + 12.),
size: 13.into(),
color: if b.id == self.selected {
style::TEAL
} else {
style::INK
},
..Default::default()
});
if !b.detail.is_empty() {
label.fill_text(Text {
content: short(&b.detail, ((b.rect.width - 25.) / 6.) as usize),
position: Point::new(b.rect.x + 12., b.rect.y + 39.),
size: 11.into(),
color: style::MUTED,
..Default::default()
});
}
});
}
}