Wire exact Scenario group selection and contextual admission

This commit is contained in:
2026-09-24 00:24:08 -07:00
parent 47917dd0ef
commit 879eb1d5c8
13 changed files with 1505 additions and 52 deletions
@@ -75,6 +75,7 @@ pub fn view<'a>(app: &'a App, owner: Id, out: Column<'a, Message>) -> Element<'a
.spacing(8)
.into();
};
let snapshot = app.multiselect_snapshot();
let tool = state.canvas_tool(owner);
let clean = !app.behavior.has_pending() && !app.draft_dirty() && !app.source_dirty();
// Resolve once per accepted view. An active spacing session owns its exact
@@ -138,6 +139,7 @@ pub fn view<'a>(app: &'a App, owner: Id, out: Column<'a, Message>) -> Element<'a
scene.scale = camera_state.scale;
scene.camera_pan = camera_state.pan;
scene.interaction = Some((context, tool, clean));
scene.selection = snapshot.clone().map(|snapshot| (context, snapshot));
scene.spacing_stamp = (coordinate_input
&& !app.source_rename.open()
&& keyboard
@@ -367,7 +369,7 @@ pub fn view<'a>(app: &'a App, owner: Id, out: Column<'a, Message>) -> Element<'a
let details = details_pane(
context,
state.scroll_restore(context, ScrollArea::Page),
sequence_rows(p, context, owner, details, clean).into(),
sequence_rows(p, context, owner, details, clean, snapshot.as_ref()).into(),
);
let mut form_panel = editor_panel(
Id::nil(),
@@ -908,7 +910,24 @@ fn sequence_rows<'a>(
owner: Id,
mut out: Column<'a, Message>,
enabled: bool,
snapshot: Option<&crate::diagram_selection::Snapshot>,
) -> Column<'a, Message> {
let choose = |id| {
snapshot.map_or_else(
|| Message::ScenarioCanvas(CanvasEvent::Select(context, id)),
|snapshot| {
selection::message(
context,
snapshot,
selection::Intent::Choose(
crate::diagram_usage::Target::ScenarioObject(id),
crate::app::multiselect::Choice::Replace,
),
)
},
)
};
let order_enabled = enabled && snapshot.is_none_or(|snapshot| snapshot.targets().len() <= 1);
if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Fragment { branches, .. },
..
@@ -917,10 +936,10 @@ fn sequence_rows<'a>(
for branch in branches {
out = out.push(sequence_action(
&format!("Operand: {}", p.named(*branch)),
Message::Select(*branch),
choose(*branch),
enabled,
));
out = sequence_rows(p, context, *branch, out, enabled);
out = sequence_rows(p, context, *branch, out, enabled, snapshot);
}
}
if let Some(steps) = p.elements.get(&owner).and_then(|e| e.steps()) {
@@ -929,17 +948,17 @@ fn sequence_rows<'a>(
row![
sequence_action(
&format!("{}. {}", i + 1, p.named(*id)),
Message::Select(*id),
choose(*id),
enabled
)
.width(Fill),
button("↑")
.padding(8)
.on_press_maybe((enabled && i > 0).then_some(Message::Command(
.on_press_maybe((order_enabled && i > 0).then_some(Message::Command(
Command::MoveStep(owner, i, i.saturating_sub(1))
))),
button("↓").padding(8).on_press_maybe(
(enabled && i + 1 < steps.len())
(order_enabled && i + 1 < steps.len())
.then_some(Message::Command(Command::MoveStep(owner, i, i + 1)))
)
]
@@ -960,7 +979,7 @@ fn sequence_rows<'a>(
enabled,
));
}
out = sequence_rows(p, context, *id, out, enabled);
out = sequence_rows(p, context, *id, out, enabled, snapshot);
}
}
out