Retire Scenario selection input without invalidating new reveal contexts

This commit is contained in:
2026-09-24 00:43:42 -07:00
parent a0a70340a6
commit ca1f18e6b0
2 changed files with 21 additions and 12 deletions
+21 -4
View File
@@ -216,11 +216,14 @@ mod direct_scenario_tests {
let _ = app.update(Message::ScenarioCanvas(CanvasEvent::Select(
context, f.sender,
)));
assert_eq!(
app.scenario_context(),
Some(context),
"same-owner selection retains gesture context"
let fresh = app.scenario_context().unwrap();
assert_eq!(fresh.visit, context.visit);
assert_eq!(fresh.representation, context.representation);
assert_ne!(
fresh.epoch, context.epoch,
"selection retires older gestures"
);
let context = fresh;
let _ = app.update(Message::ScenarioCanvas(CanvasEvent::Reorder {
context,
occurrence: created,
@@ -1379,6 +1382,10 @@ impl App {
}
let preview_read_only = self.process_preview_primary().is_some();
let selection_boundary = self.multiselect_boundary();
let scenario_selection_before = self.scenario_context().and_then(|context| {
self.multiselect_snapshot()
.map(|selection| (context, selection))
});
// Reject delayed gestures before they can retire newer input ownership.
if let Message::Connection(
crate::connection_edit::Event::Endpoint(captured, _)
@@ -1644,6 +1651,16 @@ impl App {
{
self.reconcile_multiselect();
}
if let Some((context, selection)) = scenario_selection_before
&& self.scenario_context() == Some(context)
&& self.multiselect_snapshot().as_ref() != Some(&selection)
{
// Legacy singleton selection retires old spacing packets. If the
// action already advanced its context, its new navigation/reveal
// owns that context and must not be retired by reconciliation.
self.behavior.scenario.cancel_spacing();
self.canvas_epoch = self.canvas_epoch.wrapping_add(1);
}
if preview_read_only && self.process_preview_primary().is_none() && self.draft.is_none() {
self.refresh_draft();
}
@@ -20,7 +20,6 @@ impl App {
return;
};
let scope = selection::context(context).scope;
let before = self.multiselect_snapshot();
let visible = selection::visible(self.project(), context, self.selected);
let old = self
.diagram_selection
@@ -46,13 +45,6 @@ impl App {
selected.clear();
}
}
if before.is_some() && self.multiselect_snapshot() != before {
// Legacy singleton selection also retires captured spacing input.
// This must not change the camera lifetime: blank selection input
// and a new background pan can share the same pointer press.
self.behavior.scenario.cancel_spacing();
self.canvas_epoch = self.canvas_epoch.wrapping_add(1);
}
}
pub(super) fn inspect_scenario_multiselect_primary(&mut self) {