Keep state canvas focus tree stable when placement controls change

This commit is contained in:
2026-09-12 07:19:23 -07:00
parent b25065c442
commit e2c027e54c
2 changed files with 51 additions and 8 deletions
+19 -8
View File
@@ -141,12 +141,16 @@ pub fn view<'a>(app: &'a App, machine: Id, mut out: Column<'a, Message>) -> Elem
label: format!("{} · {}", p.named(element), p.elements[&element].kind()),
})
.collect::<Vec<_>>();
// Keep the optional picker in its own stable slot. Inserting it as a
// sibling before the canvas would replace the positional Iced focus tree.
let missing_spacing = if missing.is_empty() { 0.0_f32 } else { 8.0 };
let mut missing_controls = Column::new();
if !missing.is_empty() {
let position = Position {
x: (48. - state.pan.x) / state.zoom,
y: (90. - state.pan.y) / state.zoom,
};
out = out.push(
missing_controls = missing_controls.push(
pick_list(missing, None::<Choice>, move |c| {
event(Event::Place {
context,
@@ -173,13 +177,20 @@ pub fn view<'a>(app: &'a App, machine: Id, mut out: Column<'a, Message>) -> Elem
.width(Fill)
.height(Fill)
.into();
out = out.push(crate::diagram::focus::wrap(
canvas.map(event),
context,
crate::app::diagram_removal::focus_enabled(app),
app.busy,
Message::DiagramTraverse,
));
out = out.push(
column![
missing_controls,
crate::diagram::focus::wrap(
canvas.map(event),
context,
crate::app::diagram_removal::focus_enabled(app),
app.busy,
Message::DiagramTraverse,
)
]
.spacing(missing_spacing)
.height(Fill),
);
let base: Element<'_, Message> = container(out.spacing(8))
.padding(14)
.width(Fill)