Keep raw route gesture baseline separate from wrapped presentation

This commit is contained in:
2026-10-01 19:27:39 -07:00
parent ebb6a9980b
commit d0896ced75
6 changed files with 125 additions and 9 deletions
+10 -3
View File
@@ -96,6 +96,9 @@ struct Scene {
font_version: Option<iced::advanced::graphics::text::Version>,
work: Option<Arc<crate::app::allocation_drag::Preview>>,
view: ProjectedView,
/// Core routing is the gesture baseline. Presentation-only wrapping must
/// never become a frozen label in a later core preview.
core_routed: Arc<RoutedView>,
routed: Arc<RoutedView>,
}
struct CachedScene {
@@ -541,7 +544,8 @@ impl DiagramCanvas<'_> {
{
return scene.clone();
}
let mut routed = preview.routed.clone();
let core_routed = preview.routed.clone();
let mut routed = core_routed.clone();
let label_layout = if profile == label_layout_experiment::Profile::Baseline {
None
} else {
@@ -559,6 +563,7 @@ impl DiagramCanvas<'_> {
font_version,
work: Some(preview.clone()),
view: preview.placement.view.clone(),
core_routed,
routed,
});
*state.work_cache.borrow_mut() = Some(scene.clone());
@@ -596,7 +601,7 @@ impl DiagramCanvas<'_> {
self.project.diagrams[&self.diagram].clone()
};
let view = self.projected(&diagram);
let mut routed = Arc::new(
let core_routed = Arc::new(
if let Some(gesture) = state
.route_drag
.as_ref()
@@ -613,6 +618,7 @@ impl DiagramCanvas<'_> {
route_diagram(self.project, &diagram, &view)
},
);
let mut routed = core_routed.clone();
let label_layout = if profile == label_layout_experiment::Profile::Baseline {
None
} else {
@@ -630,6 +636,7 @@ impl DiagramCanvas<'_> {
font_version,
work: None,
view,
core_routed,
routed,
});
*state.cache.borrow_mut() = Some(CachedScene {
@@ -658,7 +665,7 @@ impl DiagramCanvas<'_> {
route: EdgeRoute,
profile: label_layout_experiment::Profile,
) {
let baseline = self.scene_with_profile(state, profile).routed.clone();
let baseline = self.scene_with_profile(state, profile).core_routed.clone();
state.route_drag = Some(Gesture {
context: self.context,
start: world,
@@ -421,17 +421,19 @@ fn coincident_attachment_handles_honor_explicit_end_choice() {
EdgeEnd::Target,
)));
let c = canvas(&app, 1.);
let core_routed = Arc::new(route_diagram(
c.project,
&c.project.diagrams[&c.diagram],
&projection::project_view(c.project, c.diagram),
));
let mut scene = Scene {
label_layout: None,
profile: label_layout_experiment::Profile::Baseline,
font_version: None,
work: None,
view: projection::project_view(c.project, c.diagram),
routed: Arc::new(route_diagram(
c.project,
&c.project.diagrams[&c.diagram],
&projection::project_view(c.project, c.diagram),
)),
routed: core_routed.clone(),
core_routed,
};
let routed = Arc::make_mut(&mut scene.routed);
let edge = routed.edges.get_mut(&c.selected).unwrap();
@@ -609,7 +609,7 @@ mod tests {
handle: Handle::Label { original: offset },
route: p.diagrams[&id].routes[0].clone(),
changed: true,
baseline: scene.routed.clone(),
baseline: scene.core_routed.clone(),
});
preview
.route_drag
@@ -758,6 +758,7 @@ mod tests {
));
let plain = c.scene_with_profile(&state, Profile::Baseline);
assert!(plain.label_layout.is_none());
assert!(Arc::ptr_eq(&plain.core_routed, &plain.routed));
assert_eq!(
*plain.routed,
route_diagram(&p, &p.diagrams[&id], &plain.view)