Preserve scenario viewport when editing a diagram message

This commit is contained in:
2026-09-06 05:43:56 +03:00
parent c6c07cc3a3
commit ae1602ad7a
3 changed files with 46 additions and 8 deletions
+8 -4
View File
@@ -1221,8 +1221,11 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen
} }
})); }));
let pending = app.behavior.has_pending(); let pending = app.behavior.has_pending();
// Keep the canvas at a stable widget-tree position when a form replaces
// the palette, so Iced retains the user's current sequence viewport.
let mut controls = column![].spacing(12);
if !pending { if !pending {
out = out controls = controls
.push( .push(
row![ row![
action("+ Lifeline", event(Event::Start(owner, Tool::Lifeline))), action("+ Lifeline", event(Event::Start(owner, Tool::Lifeline))),
@@ -1252,7 +1255,7 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen
MessageStyle::CallReply MessageStyle::CallReply
}; };
if !pending { if !pending {
out = out.push( controls = controls.push(
row![ row![
button("Select / reorder") button("Select / reorder")
.on_press(Message::ScenarioCanvas(CanvasEvent::Choose( .on_press(Message::ScenarioCanvas(CanvasEvent::Choose(
@@ -1296,14 +1299,15 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen
] ]
.spacing(6), .spacing(6),
); );
out = out.push(label(if matches!(tool, CanvasTool::Message(_)) { controls = controls.push(label(if matches!(tool, CanvasTool::Message(_)) {
"Draw message · choose the highlighted sequence position on a lifeline, then click or drag to another lifeline · Escape cancels" "Draw message · choose the highlighted sequence position on a lifeline, then click or drag to another lifeline · Escape cancels"
} else { "Select a lifeline or occurrence · drag the selected occurrence’s ↕ handle to reorder within its sequence" })); } else { "Select a lifeline or occurrence · drag the selected occurrence’s ↕ handle to reorder within its sequence" }));
} else { } else {
out = out.push(label( controls = controls.push(label(
"Pending form · the canvas remains visible · apply or cancel below", "Pending form · the canvas remains visible · apply or cancel below",
)); ));
} }
out = out.push(controls);
let mut scene = Scene::sequence(p, owner, app.selected); let mut scene = Scene::sequence(p, owner, app.selected);
scene.interaction = Some(( scene.interaction = Some((
context, context,
+13 -4
View File
@@ -204,12 +204,21 @@ logs desktop{-clippy,-release}-dfd2e41.log in Linux target/linux-verification.
Semantic core/source5 checkpoint346fb24 passed345 core tests (one intentional Semantic core/source5 checkpoint346fb24 passed345 core tests (one intentional
ignored probe) and strict Clippy; independent nine-finding recheck is closed. ignored probe) and strict Clippy; independent nine-finding recheck is closed.
Semantic checkout server test checkpointc746ab6 passes42 existing server tests Semantic checkout server test checkpointc746ab6 passes42 existing server tests
and strict Clippy after seven current-output assertions changed to5. Semantic API and strict Clippy after seven current-output assertions changed to5. User explicitly reconfirmed REST work after two automatic review rejections.
production additions were rejected twice by automatic approval review; a direct The scoped retry is approved; semantic query/preview/apply and HTTP tests are
authorization question is pending. No API route bodies were retained. Spec work implemented, with independent transport review and schema validation active.
continues independently. Process direct editing is active in codex/process-direct. Normative source5 spec02f99a9 passed strict generation and extracted examples;
independent no-op-guarantee finding was fixed in29df024. Process direct editing is active in codex/process-direct.
Next: verify scenario UI fixes on Windows/Linux; integrate semantic core/source, Next: verify scenario UI fixes on Windows/Linux; integrate semantic core/source,
spec and authorized API; implement semantic GUI; integrate direct process editing. spec and authorized API; implement semantic GUI; integrate direct process editing.
Broader coverage/lifecycle/hosted/help/release gates in PLAN remain active. Main Broader coverage/lifecycle/hosted/help/release gates in PLAN remain active. Main
is4101434 (docs pointer on productiona8f451e); this integration is not yet accepted. is4101434 (docs pointer on productiona8f451e); this integration is not yet accepted.
Latest native refinement c6c07cc: pinned actions/mode feedback/names pass normal
and compact Windows inspection. Native ALT creation, operand pair insertion,
correlation spans, invalid order, Save/Undo/Redo passed (saved62 objects). Canvas
remount on entering/leaving forms loses the viewed region; stable controls sibling
fix is being verified next. Exact evidence is in release-scenario-editing.md.
Linux287 tests/strict Clippy/release passed c6c07cc. Process7a1e12b passes303 desktop
tests; independent Exchange-first continuation finding is being fixed by worker.
+25
View File
@@ -256,3 +256,28 @@ inner and outer scrolling. Root is refining those three issues before accepting
the milestone. ALT/reuse/resize/save recovery and Linux native remain pending. the milestone. ALT/reuse/resize/save recovery and Linux native remain pending.
Root UI refinement checks:287 desktop tests passed, strict all-target desktop Clippy passed, optimized Windows desktop build passed. Native verification of this refinement remains pending. Root UI refinement checks:287 desktop tests passed, strict all-target desktop Clippy passed, optimized Windows desktop build passed. Native verification of this refinement remains pending.
## Refined Windows native results and viewport finding
c6c07cc Windows frozen binary SHA256
4A49AD95C466BACBD1D1EA96FFF983BDA2F5DA9B7DCCBF91C387655CEF88B419,
ui-scenario-refined-windows. Native1440x900 and1100x700 show differentiated tool
selection, occurrence-first message names and pinned Create/Cancel. A pending
Navigation outcome ALT fragment retained its name and route.available guard across
width/height resizing. Create produced the fragment and two operands. Native
click-click in its first operand explicitly captured that operand's append slot;
Available route plus correlated Reply were created on Navigation request. Execution
bar ends at that reply. Reply-before-call reorder rejects with reply_order. Save
All writes62 objects/5 links/3 checks; exact nested source shows the guarded operand
contains only that correlated pair. Undo removes both (60); Redo restores saved62.
The saved native trial was closed before the next refinement.
Native also found the canvas jumps to its start whenever the palette is replaced
by a form or restored. Diagnosis: conditional siblings change its Iced widget-tree
position. Group the controls as one stable sibling and verify that actual viewport
is retained across drawing/form/cancel/create. This is distinct from deliberate
new-selection reveal (not implemented yet). Linux287 tests, strict Clippy and
optimized build pass for c6c07cc; native Linux remains pending.
Stable-canvas refinement:287 desktop tests, strict all-target Clippy and optimized Windows build passed. Native retention trial remains pending.