Bound Create labels within lifeline capsules and preserve Unicode test inputs

This commit is contained in:
2026-09-11 06:56:17 -07:00
parent fb77b857d2
commit cb611a71df
16 changed files with 1815 additions and 12 deletions
@@ -277,7 +277,7 @@ impl Rendering {
}
}
pub(in crate::behavior) fn draw_markers(&self, frame: &mut Frame, selected: Id) {
pub(in crate::behavior) fn draw_markers(&self, frame: &mut Frame, selected: Id, scale: f32) {
for marker in &self.markers {
let color = if selected == marker.event.occurrence || selected == marker.lifeline {
style::TEAL
@@ -302,13 +302,20 @@ impl Rendering {
},
),
);
frame.fill_text(Text {
content: short(&marker.name, 18),
position: marker.capsule.position() + iced::Vector::new(8., 6.),
size: 12.into(),
color,
..Default::default()
});
if let Some(clip) = birth_label_clip(marker.capsule, scale, frame.size()) {
// WGPU clipped frames start with an identity transform;
// neither the parent's scale nor its clip is inherited.
frame.with_clip(clip, |label| {
label.scale(scale);
label.fill_text(Text {
content: short(&marker.name, 18),
position: marker.capsule.position() + iced::Vector::new(8., 6.),
size: 12.into(),
color,
..Default::default()
});
});
}
}
MarkerKind::Death => {
for (a, b) in death_strokes(marker.center) {
@@ -323,6 +330,17 @@ impl Rendering {
}
}
fn birth_label_clip(capsule: Rectangle, scale: f32, viewport: Size) -> Option<Rectangle> {
if !scale.is_finite() || scale <= 0. {
return None;
}
Rectangle::new(
Point::new((capsule.x + 8.) * scale, (capsule.y + 4.) * scale),
Size::new((capsule.width - 16.) * scale, (capsule.height - 8.) * scale),
)
.intersection(&Rectangle::new(Point::ORIGIN, viewport))
}
fn marker_distance(marker: &EventMarker, point: Point) -> f32 {
match marker.event.kind {
MarkerKind::Birth => {