//! Saved Scenario navigation is presentation state, never a document edit. use super::*; use crate::behavior::scenario_layout::{Representation, presentation::checked_owner}; impl App { pub(super) fn enter_scenario_representation(&mut self, representation: Representation) -> bool { let Some(owner) = checked_owner(self.project(), representation) else { self.status = "This Scenario view is no longer available or has an incompatible owner.".into(); return false; }; self.layer = self.project().elements[&owner].layer(); self.page = Page::Behavior; self.behavior.active_owner = Some(owner); match representation { Representation::Saved { diagram } => self.active_diagram = Some(diagram), Representation::Derived { .. } => { if self .active_diagram .is_some_and(|id| self.saved_scenario_diagram(id)) { self.active_diagram = None; } } } self.selected_node = None; if self .behavior .scenario .enter_representation(self.canvas_document, owner, representation) { self.canvas_epoch = self.canvas_epoch.wrapping_add(1); } true } /// Reconcile after navigation/adoption without selecting or applying a draft. /// A retained invalid Saved identity remains unavailable; it must not silently /// turn into a different automatic Scenario or another saved arrangement. pub(super) fn reconcile_scenario_workspace(&mut self) { if self.page == Page::Diagram && !self.behavior.has_pending() && let Some(diagram) = self .active_diagram .filter(|id| self.saved_scenario_diagram(*id)) { self.enter_scenario_representation(Representation::Saved { diagram }); } if self.page != Page::Behavior { self.behavior.scenario.leave(); return; } if let Some(rep @ Representation::Saved { diagram }) = self.behavior.scenario.representation() { // The requested view is authoritative until explicit navigation // retires it. This also recovers the same view when Undo restores it. if let Some(owner) = checked_owner(self.project(), rep) { self.active_diagram = Some(diagram); self.layer = self.project().elements[&owner].layer(); self.behavior.active_owner = Some(owner); self.behavior .scenario .enter_representation(self.canvas_document, owner, rep); } else if let Some(owner) = self.behavior.scenario.owner() { self.behavior .scenario .enter_representation(self.canvas_document, owner, rep); } return; } let Some(owner) = behavior::selected_owner(self) else { self.behavior.scenario.leave(); return; }; if self .project() .elements .get(&owner) .is_some_and(|e| e.kind() == Kind::Scenario) { self.behavior.scenario.enter(self.canvas_document, owner); } else { self.behavior.scenario.leave(); } } } #[cfg(test)] mod tests; #[cfg(test)] mod adoption_tests; #[cfg(test)] mod owner_navigation_tests;