Add named behavior creation and verified textual authoring examples

This commit is contained in:
2026-09-11 04:26:56 -07:00
committed by Codex
parent c4e1580bb0
commit 1516949567
55 changed files with 6734 additions and 34 deletions
+45 -3
View File
@@ -13,6 +13,7 @@ mod transition_context_tests;
mod view_copy_tests;
use crate::forms::Draft;
use crate::{
behavior,
document::Document,
source_workspace::{self, LIMITS, Workspace},
};
@@ -849,6 +850,7 @@ impl App {
}
fn execute(&mut self, command: Command) -> bool {
let command = crate::port_edit::repair_owner_change(self.project(), command);
let created = self.behavior.creation.created_by(self.project(), &command);
let scenario_selection = self
.behavior
.scenario
@@ -856,7 +858,16 @@ impl App {
.or_else(|| self.behavior.topology.created_selection(&command));
match self.document.execute(command) {
Ok(selected) => {
if let Some(id) = scenario_selection.or(selected) {
if let Some(created) = created {
self.layer = created.layer;
self.selected = created.behavior;
self.selected_node = None;
self.behavior.active_owner = Some(created.behavior);
self.behavior.diagram = behavior::state_view::State::default();
self.behavior.diagram.diagram = created.diagram;
self.page = Page::Behavior;
self.canvas_epoch = self.canvas_epoch.wrapping_add(1);
} else if let Some(id) = scenario_selection.or(selected) {
self.selected = id;
}
self.sync();
@@ -1020,6 +1031,8 @@ impl App {
window::close_requests().map(|id| Message::Request(Pending::Close(id))),
window::resize_events().map(|(_, size)| Message::WindowResized(size)),
architecture_authoring::subscription(self),
behavior::creation::subscription(self.behavior.creation.has_pending())
.map(|()| Message::Escape),
iced::event::listen_with(|event, status, _| {
let iced::Event::Keyboard(keyboard::Event::KeyPressed {
key,
@@ -1741,6 +1754,10 @@ impl App {
return self.update(Message::Add(child));
}
Message::Escape => {
if self.behavior.creation.has_pending() {
self.behavior.creation.acknowledge_commit();
self.status = "Behavior creation cancelled".into();
}
if self.connection.take().is_some() {
self.status = "Drawing cancelled · Select / move is active".into();
}
@@ -2284,7 +2301,28 @@ impl App {
}
Message::InspectorTab(tab) => self.inspector_tab = tab,
Message::Behavior(event) => {
if event.starts_form() && !self.behavior.has_pending() && !self.apply() {
if matches!(&event, behavior::Event::Creation(behavior::creation::Event::Open(layer)) if *layer != self.layer)
{
self.status =
"The active layer changed. Choose New in the current layer.".into();
return Task::none();
}
let creating = matches!(
&event,
behavior::Event::Creation(behavior::creation::Event::Open(..))
);
let focus_name = matches!(
&event,
behavior::Event::Creation(behavior::creation::Event::Choose(..))
);
if creating
&& (self.behavior.has_pending() || self.source_dirty() || self.draft_dirty())
{
self.status = "Apply or cancel the current draft before starting a new behavior. Your inputs are retained.".into();
return Task::none();
}
if !creating && event.starts_form() && !self.behavior.has_pending() && !self.apply()
{
return Task::none();
}
if event.is_submit() && (self.source_dirty() || self.draft_dirty()) {
@@ -2303,7 +2341,11 @@ impl App {
}
}
}
Ok(None) => {}
Ok(None) => {
if focus_name {
return iced::widget::operation::focus(behavior::creation::NAME_INPUT);
}
}
Err(error) => self.status = error,
}
}