feat: preview and commit Saved Scenario spacing gestures

This commit is contained in:
2026-09-13 01:32:42 -07:00
parent 46ff127373
commit 07e611fb94
13 changed files with 2516 additions and 55 deletions
+21
View File
@@ -11,6 +11,7 @@ mod reference_authoring;
#[cfg(test)]
mod review_navigation_tests;
mod scenario_diagram;
mod scenario_spacing;
pub(crate) mod source_rename;
mod source_symbols;
#[cfg(test)]
@@ -1271,6 +1272,9 @@ impl App {
])
}
pub fn update(&mut self, message: Message) -> Task<Message> {
if let Message::ScenarioCanvas(behavior::scenario::CanvasEvent::Spacing(event)) = &message {
return self.scenario_spacing(*event);
}
// Reject stale rename intents before camera/reveal reconciliation or
// source interaction can disturb a newer navigation destination.
if let Message::SourceRename(event) = &message
@@ -1330,6 +1334,7 @@ impl App {
| Message::TopologyCanvas(crate::behavior::topology::CanvasEvent::Camera(..))
);
let before = self.camera_boundary();
let spacing_selected = self.selected;
let task = self.update_inner(message);
if window_resized && let Some((_, _, epoch)) = &mut self.pending_diagram_reveal {
*epoch = self.canvas_epoch;
@@ -1344,6 +1349,13 @@ impl App {
{
self.diagram_navigation_focus = None;
}
if (self.camera_boundary() != before
|| self.selected != spacing_selected
|| !self.spacing_enabled())
&& self.behavior.scenario.cancel_spacing()
{
self.canvas_epoch = self.canvas_epoch.wrapping_add(1);
}
if !camera && self.camera_boundary() != before {
self.camera_epoch = self.camera_epoch.wrapping_add(1);
self.camera_boundary_epoch = self.canvas_epoch;
@@ -1378,6 +1390,9 @@ impl App {
Message::ScenarioCanvas(Scenario::Camera(c, lifetime, Camera::Focus))
if valid_scenario(*c) && *lifetime == scope.epoch =>
{
if self.behavior.scenario.cancel_spacing() {
self.canvas_epoch = self.canvas_epoch.wrapping_add(1);
}
return canvas_workspace::focus_task(scope, Camera::Focus);
}
Message::TopologyCanvas(Process::Camera(c, lifetime, Camera::Focus))
@@ -1403,6 +1418,9 @@ impl App {
_ => return Task::none(),
}
let task = self.update(message);
if self.behavior.scenario.cancel_spacing() {
self.canvas_epoch = self.canvas_epoch.wrapping_add(1);
}
// Reapplying Fit or a tool also ends a held gesture. Focus is stamped
// after the action, for Iced's final-view ordering.
if self.camera_epoch == scope.epoch {
@@ -1972,6 +1990,9 @@ impl App {
{
return Task::none();
}
if self.behavior.scenario.cancel_spacing() {
self.canvas_epoch = self.canvas_epoch.wrapping_add(1);
}
match input {
Event::Focus
| Event::Traverse(_)