From ae1602ad7adaa8f7fb668f77a87308eecdf933a9 Mon Sep 17 00:00:00 2001 From: "sorokin.oleg.edu" Date: Sun, 6 Sep 2026 05:43:56 +0300 Subject: [PATCH] Preserve scenario viewport when editing a diagram message --- crates/oa-desktop/src/behavior/scenario.rs | 12 +++++++---- harness/STATE.md | 17 +++++++++++---- harness/release-scenario-editing.md | 25 ++++++++++++++++++++++ 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/crates/oa-desktop/src/behavior/scenario.rs b/crates/oa-desktop/src/behavior/scenario.rs index 95e00ea4..d3deb3ba 100644 --- a/crates/oa-desktop/src/behavior/scenario.rs +++ b/crates/oa-desktop/src/behavior/scenario.rs @@ -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(); + // 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 { - out = out + controls = controls .push( row![ 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 }; if !pending { - out = out.push( + controls = controls.push( row![ button("Select / reorder") .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), ); - 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" } else { "Select a lifeline or occurrence · drag the selected occurrence’s ↕ handle to reorder within its sequence" })); } else { - out = out.push(label( + controls = controls.push(label( "Pending form · the canvas remains visible · apply or cancel below", )); } + out = out.push(controls); let mut scene = Scene::sequence(p, owner, app.selected); scene.interaction = Some(( context, diff --git a/harness/STATE.md b/harness/STATE.md index 6e4e0701..84fc4cb9 100644 --- a/harness/STATE.md +++ b/harness/STATE.md @@ -204,12 +204,21 @@ logs desktop{-clippy,-release}-dfd2e41.log in Linux target/linux-verification. Semantic core/source5 checkpoint346fb24 passed345 core tests (one intentional ignored probe) and strict Clippy; independent nine-finding recheck is closed. Semantic checkout server test checkpointc746ab6 passes42 existing server tests -and strict Clippy after seven current-output assertions changed to5. Semantic API -production additions were rejected twice by automatic approval review; a direct -authorization question is pending. No API route bodies were retained. Spec work -continues independently. Process direct editing is active in codex/process-direct. +and strict Clippy after seven current-output assertions changed to5. User explicitly reconfirmed REST work after two automatic review rejections. +The scoped retry is approved; semantic query/preview/apply and HTTP tests are +implemented, with independent transport review and schema validation active. +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, spec and authorized API; implement semantic GUI; integrate direct process editing. Broader coverage/lifecycle/hosted/help/release gates in PLAN remain active. Main 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. diff --git a/harness/release-scenario-editing.md b/harness/release-scenario-editing.md index 1ed70390..69ad036b 100644 --- a/harness/release-scenario-editing.md +++ b/harness/release-scenario-editing.md @@ -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. 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.