97 lines
3.5 KiB
Rust
97 lines
3.5 KiB
Rust
//! 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;
|