Add Scenario sibling-block planner on integrated presentation model

This commit is contained in:
2026-09-23 23:56:30 -07:00
parent 8ddfadf440
commit 7d3d7b23e7
5 changed files with 967 additions and 24 deletions
+15 -19
View File
@@ -6,6 +6,7 @@ use iced::widget::{Column, column, text_input};
use std::{cell::RefCell, collections::BTreeSet};
mod camera;
pub(crate) mod focus;
pub(crate) mod group_reorder;
pub(crate) mod spacing;
use super::scenario_layout::{
Representation,
@@ -1253,26 +1254,21 @@ pub(crate) fn reorder(
occurrence: Id,
slot: Slot,
) -> Result<Command, String> {
let to = slot_index(p, owner, slot)?;
if p.elements.get(&occurrence).and_then(|e| e.parent) != Some(slot.parent) {
return Err(
"Reorder inside the occurrence's current sequence; dragging never changes its operand."
.into(),
);
let prepared = group_reorder::Prepared::new(
std::sync::Arc::new(p.clone()),
owner,
&[crate::diagram_usage::Target::ScenarioObject(occurrence)],
)?;
match prepared.plan(slot)? {
group_reorder::Plan::Change(command) => Ok(*command),
group_reorder::Plan::Noop => Ok(Command::SetSteps(
slot.parent,
p.elements[&slot.parent]
.steps()
.expect("admitted sequence")
.clone(),
)),
}
let mut steps = p.elements[&slot.parent]
.steps()
.expect("slot validated")
.clone();
let from = steps
.iter()
.position(|id| *id == occurrence)
.ok_or("This occurrence is not in the sequence.")?;
steps.remove(from);
steps.insert(to - usize::from(from < to), occurrence);
let command = Command::SetSteps(slot.parent, steps);
execute_batch(p, std::slice::from_ref(&command)).map_err(|error| error.to_string())?;
Ok(command)
}
fn compatible_binding(p: &Project, referenced: Id, local: Id) -> bool {
represented(p, referenced)