Add named behavior creation and verified textual authoring examples
This commit is contained in:
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user