Improve scenario tool feedback and keep draft actions visible
This commit is contained in:
@@ -878,11 +878,14 @@ impl Scene {
|
|||||||
MessageKind::Timer { .. } => "timer · ",
|
MessageKind::Timer { .. } => "timer · ",
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let message_label = if let MessageKind::Timer { expression } = message_kind
|
let message_label = if !scenario {
|
||||||
{
|
r.map(|r| r.name.clone()).unwrap_or_else(|| e.name.clone())
|
||||||
expression.as_str()
|
} else if let MessageKind::Timer { expression } = message_kind {
|
||||||
|
format!("{} · {expression}", e.name)
|
||||||
|
} else if let Some(exchange) = r.filter(|r| r.name != e.name) {
|
||||||
|
format!("{} · {}", e.name, exchange.name)
|
||||||
} else {
|
} else {
|
||||||
r.map(|r| r.name.as_str()).unwrap_or(&e.name)
|
e.name.clone()
|
||||||
};
|
};
|
||||||
self.lines.push(Line {
|
self.lines.push(Line {
|
||||||
id: *id,
|
id: *id,
|
||||||
@@ -1603,6 +1606,23 @@ mod direct_canvas_tests {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
|
fn reused_exchange_messages_display_their_distinct_occurrence_names() {
|
||||||
|
let mut f = scenario::direct_tests::fixture();
|
||||||
|
f.project.elements.get_mut(&f.call).unwrap().name = "Route request".into();
|
||||||
|
f.project.elements.get_mut(&f.reply).unwrap().name = "Route response".into();
|
||||||
|
let scene = Scene::sequence(&f.project, f.owner, f.call);
|
||||||
|
let call = scene.lines.iter().find(|line| line.id == f.call).unwrap();
|
||||||
|
let reply = scene.lines.iter().find(|line| line.id == f.reply).unwrap();
|
||||||
|
assert!(call.label.starts_with("1. call · Route request"));
|
||||||
|
assert!(reply.label.starts_with("2. reply · Route response"));
|
||||||
|
assert!(call.label.ends_with(&f.project.relations[&f.exchange].name));
|
||||||
|
assert!(
|
||||||
|
reply
|
||||||
|
.label
|
||||||
|
.ends_with(&f.project.relations[&f.exchange].name)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
fn direct_drag_and_click_click_use_ordered_sources_and_publish_once() {
|
fn direct_drag_and_click_click_use_ordered_sources_and_publish_once() {
|
||||||
for drag in [false, true] {
|
for drag in [false, true] {
|
||||||
let (f, scene) = scene();
|
let (f, scene) = scene();
|
||||||
|
|||||||
@@ -1254,10 +1254,16 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen
|
|||||||
if !pending {
|
if !pending {
|
||||||
out = out.push(
|
out = out.push(
|
||||||
row![
|
row![
|
||||||
button("Select / reorder").on_press(Message::ScenarioCanvas(CanvasEvent::Choose(
|
button("Select / reorder")
|
||||||
context,
|
.on_press(Message::ScenarioCanvas(CanvasEvent::Choose(
|
||||||
CanvasTool::Select
|
context,
|
||||||
))),
|
CanvasTool::Select
|
||||||
|
)))
|
||||||
|
.style(if tool == CanvasTool::Select {
|
||||||
|
style::selected
|
||||||
|
} else {
|
||||||
|
style::nav
|
||||||
|
}),
|
||||||
pick_list(
|
pick_list(
|
||||||
vec![
|
vec![
|
||||||
MessageStyle::Asynchronous,
|
MessageStyle::Asynchronous,
|
||||||
@@ -1277,10 +1283,16 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen
|
|||||||
.text_size(12)
|
.text_size(12)
|
||||||
.padding(8)
|
.padding(8)
|
||||||
.width(Fill),
|
.width(Fill),
|
||||||
button("Draw message").on_press(Message::ScenarioCanvas(CanvasEvent::Choose(
|
button("Draw message")
|
||||||
context,
|
.on_press(Message::ScenarioCanvas(CanvasEvent::Choose(
|
||||||
CanvasTool::Message(style)
|
context,
|
||||||
))),
|
CanvasTool::Message(style)
|
||||||
|
)))
|
||||||
|
.style(if matches!(tool, CanvasTool::Message(_)) {
|
||||||
|
style::selected
|
||||||
|
} else {
|
||||||
|
style::nav
|
||||||
|
}),
|
||||||
]
|
]
|
||||||
.spacing(6),
|
.spacing(6),
|
||||||
);
|
);
|
||||||
@@ -1314,7 +1326,7 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen
|
|||||||
horizontal: scrollable::Scrollbar::default(),
|
horizontal: scrollable::Scrollbar::default(),
|
||||||
})
|
})
|
||||||
.height(if pending {
|
.height(if pending {
|
||||||
(app.window_size.height - 500.).clamp(160., 260.)
|
(app.window_size.height - 660.).clamp(110., 190.)
|
||||||
} else {
|
} else {
|
||||||
(app.window_size.height - 410.).clamp(180., 340.)
|
(app.window_size.height - 410.).clamp(180., 340.)
|
||||||
}),
|
}),
|
||||||
@@ -1524,24 +1536,28 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen
|
|||||||
if let Err(error) = &readiness {
|
if let Err(error) = &readiness {
|
||||||
form = form.push(label(error.clone()));
|
form = form.push(label(error.clone()));
|
||||||
}
|
}
|
||||||
form = form.push(
|
let footer = row![
|
||||||
row![
|
button("Create")
|
||||||
button("Create")
|
.padding(9)
|
||||||
.padding(9)
|
.on_press_maybe(readiness.is_ok().then_some(event(Event::Submit))),
|
||||||
.on_press_maybe(readiness.is_ok().then_some(event(Event::Submit))),
|
action("Cancel", event(Event::Cancel))
|
||||||
action("Cancel", event(Event::Cancel))
|
]
|
||||||
]
|
.spacing(7);
|
||||||
.spacing(7),
|
|
||||||
);
|
|
||||||
out = out.push(
|
out = out.push(
|
||||||
container(scrollable(form).height((app.window_size.height - 470.).clamp(190., 280.)))
|
container(
|
||||||
.padding(14)
|
column![
|
||||||
.style(style::card),
|
scrollable(form).height((app.window_size.height - 650.).clamp(110., 240.)),
|
||||||
|
footer
|
||||||
|
]
|
||||||
|
.spacing(9),
|
||||||
|
)
|
||||||
|
.padding(14)
|
||||||
|
.style(style::card),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if lines(p, owner).is_empty() && p.elements[&owner].steps().is_none_or(Vec::is_empty) {
|
if lines(p, owner).is_empty() && p.elements[&owner].steps().is_none_or(Vec::is_empty) {
|
||||||
out = out.push(container(label("Add lifelines for the participating work or actors, then create messages between them.")).padding(16).width(Fill).style(style::card));
|
out = out.push(container(label("Add lifelines for the participating work or actors, then create messages between them.")).padding(16).width(Fill).style(style::card));
|
||||||
} else {
|
} else if !pending {
|
||||||
out = sequence_rows(p, owner, out);
|
out = sequence_rows(p, owner, out);
|
||||||
}
|
}
|
||||||
super::scenario_scroll::observe(context, ScrollArea::Page, scrollable(out.padding(24)))
|
super::scenario_scroll::observe(context, ScrollArea::Page, scrollable(out.padding(24)))
|
||||||
|
|||||||
+27
-39
@@ -182,46 +182,34 @@ The independent bounded-browser review reports no remaining medium/high finding.
|
|||||||
Linux native R6 workflows remain a root-owned acceptance gate. See
|
Linux native R6 workflows remain a root-owned acceptance gate. See
|
||||||
release-data-verification.md. Main remains a8f451e; R6 is not yet accepted.
|
release-data-verification.md. Main remains a8f451e; R6 is not yet accepted.
|
||||||
|
|
||||||
## Latest root runtime checkpoint — Computer Use stopped by user
|
## Latest root checkpoint — native scenario trial and refinement
|
||||||
|
|
||||||
User physically pressed Escape during the first combined-Windows capture. Root
|
User reauthorized Computer Use; root resumed on the frozen combined dfd2e41
|
||||||
stopped all Computer Use input; new native authorization is required. Before that,
|
Windows binary. Its 1440x900 trial created a named Call/Reply pair at a middle
|
||||||
Linux b35dede launched but its first capture timed out awaiting WSLg app access.
|
slot, set Origin/Latitude to route.origin.latitude, blocked navigation without
|
||||||
The pending async question asks whether to retry Linux and approve the window.
|
losing the pending draft, and verified Undo/Redo plus Save All. The saved model
|
||||||
Do not interpret elapsed time as permission. Code work remains authorized.
|
has57 objects/5 links/3 expected checks in ui-scenario-data-windows-dfd2e41/model.
|
||||||
|
Valid reordering retained occurrence selection. Moving a reply before its call
|
||||||
|
was rejected without history; Undo restored the preceding valid reorder. Inner
|
||||||
|
scroll and injected Escape canceled armed message gestures. Saved trial exec63022
|
||||||
|
closed normally with exit0 and no output. Older exec43338/57994 also exited0.
|
||||||
|
|
||||||
b35dede Windows native property browser passed at1440x900 and1100x700:32-field
|
Observed UI issues are being fixed locally: identical tool styling, exchange
|
||||||
pages showed distinct names, page/root navigation did not edit the field/expression,
|
names obscuring distinct message names, and draft Create/Cancel hidden by nested
|
||||||
recursive Origin/Next coordinate/Latitude was selected, expression changed to
|
scrolling. Root owns scenario.rs plus occurrence label construction in behavior.rs.
|
||||||
origin.next.latitude + 0.5, Save All/reopen preserved it and the separate Destination
|
Native verification of the fixes, ALT/reuse/resize and Linux workflows remains.
|
||||||
value. The reopened properties confirmed the path/expression. Windows app1966548
|
Combined Linux286 desktop tests, strict all-target Clippy and release build pass;
|
||||||
closed normally; exec94220 exited0 with only newline. Frozen binary SHA256
|
logs desktop{-clippy,-release}-dfd2e41.log in Linux target/linux-verification.
|
||||||
717B8D5AFF501F42473E043BD49EE3E5E017ABBBC84AB8C3AE85AA37121FBD50.
|
|
||||||
Evidence/model: ui-r6-browser-windows under the release evidence directory.
|
|
||||||
|
|
||||||
b35dede Linux264 tests, strict Clippy and optimized build passed. Frozen ELF in
|
Semantic core/source5 checkpoint346fb24 passed345 core tests (one intentional
|
||||||
ui-r6-linux SHA256 EEDF02913CE69C4D5F2B820A48E375A0D22791A2CEC721D9E29F5532370B9E40.
|
ignored probe) and strict Clippy; independent nine-finding recheck is closed.
|
||||||
Its exec43338 is still running; last listed WSLg window4524780. No Linux R6 native
|
Semantic checkout server test checkpointc746ab6 passes42 existing server tests
|
||||||
interaction/visual acceptance occurred. Do not reuse old bindings without inventory.
|
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.
|
||||||
|
|
||||||
DATA and Linux integration checkouts fast-forwarded to combined1bf8ebc (production
|
Next: verify scenario UI fixes on Windows/Linux; integrate semantic core/source,
|
||||||
merge dfd2e41). Windows286 tests, strict Clippy/release pass, independent scenario
|
spec and authorized API; implement semantic GUI; integrate direct process editing.
|
||||||
recheck has no medium/high finding. Combined Windows frozen binary in
|
Broader coverage/lifecycle/hosted/help/release gates in PLAN remain active. Main
|
||||||
ui-scenario-data-windows-dfd2e41, SHA256
|
is4101434 (docs pointer on productiona8f451e); this integration is not yet accepted.
|
||||||
8BC031CF6124859D31082BB0FFB0335C406D54E12ECAD8493CE50A23923E5589,
|
|
||||||
exec57994 running; first capture stopped by user, no native acceptance. Linux
|
|
||||||
combined286 tests passed; Clippy/release still running in exec27433. Root owns
|
|
||||||
both integration targets and native. Poll exact session/logs before recording pass.
|
|
||||||
|
|
||||||
Semantic core remains isolated and under independent review. Original five findings
|
|
||||||
were fixed; four additional constructor/canonical/reset/artifact-owner findings
|
|
||||||
prompted immutable independent proposals, agreement over canonical target slots,
|
|
||||||
one application and final expected/prepared audits. Core is running new regressions;
|
|
||||||
do not accept until independent recheck. Historical closed facts may outlive current
|
|
||||||
families; current-family applicability applies to new review resolutions. A proposed
|
|
||||||
stronger historical gate was withdrawn as inconsistent with that contract.
|
|
||||||
|
|
||||||
Next: finish core gates/review and process-editing design; after native permission,
|
|
||||||
resume R6 Linux and combined scenario Windows/Linux workflows in their copied models.
|
|
||||||
Then source5 semantic GUI/API/spec integration and remaining release milestones.
|
|
||||||
No goal completion or blocked status is justified by this single native interruption.
|
|
||||||
|
|||||||
@@ -73,5 +73,6 @@ Finish and independently verify R6, then semantic R3 reconciliation and direct
|
|||||||
scenario/process gestures. Complete lifecycle/recovery, hosted editing, guidance
|
scenario/process gestures. Complete lifecycle/recovery, hosted editing, guidance
|
||||||
and fresh cross-disciplinary Windows/Linux acceptance. No subsystem checkpoint
|
and fresh cross-disciplinary Windows/Linux acceptance. No subsystem checkpoint
|
||||||
completes the first release. Current work is making measured implementation,
|
completes the first release. Current work is making measured implementation,
|
||||||
review and runtime progress. User stopped Computer Use with Escape after Windows
|
review and runtime progress. User reauthorized Computer Use. Root resumed combined Windows scenario tests;
|
||||||
R6 verification; native input awaits reauthorization, while code work continues.
|
middle insertion, history, save, reorder and scroll/Escape cancellation passed.
|
||||||
|
Three native UI findings are being refined; Linux acceptance remains pending.
|
||||||
|
|||||||
@@ -234,3 +234,25 @@ workflow. Its Windows/Linux native tasks remain pending, including scroll/resize
|
|||||||
cancellation, middle/operand insertion, execution spans and save recovery. Root
|
cancellation, middle/operand insertion, execution spans and save recovery. Root
|
||||||
owns final integration into main and native acceptance; process editing remains
|
owns final integration into main and native acceptance; process editing remains
|
||||||
outside this task.
|
outside this task.
|
||||||
|
|
||||||
|
|
||||||
|
## Root combined Windows native trial — 2026-09-06
|
||||||
|
|
||||||
|
Frozen dfd2e41 binary above, 1440x900. Native drag inserted Routed request and
|
||||||
|
its correlated reply before the original third call. The Origin/Latitude value
|
||||||
|
route.origin.latitude was authored in the bounded browser. Navigation while
|
||||||
|
pending retained the draft. Create produced57 objects; Undo removed both messages
|
||||||
|
(55), Redo restored them, Save All persisted the pair and qualified value. Saved
|
||||||
|
steps are original call/reply, Routed request/reply, original second call/reply.
|
||||||
|
Valid selected-message reorder retained selection; invalid reply-before-call
|
||||||
|
reorder reported reply_order and added no history. Undo restored the saved order.
|
||||||
|
Inner-canvas scrolling and injected Escape cleared armed source gestures, verified
|
||||||
|
by the next lifeline click starting a new source without completing a draft.
|
||||||
|
The saved app closed normally (exec63022 exit0, no runtime output).
|
||||||
|
|
||||||
|
Native findings: active/inactive tools looked identical, line labels used the
|
||||||
|
shared exchange name despite distinct occurrence names, and Create/Cancel needed
|
||||||
|
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.
|
||||||
|
|||||||
Reference in New Issue
Block a user