diff --git a/editor/src/dispatcher.rs b/editor/src/dispatcher.rs index db58efaff2..0c098833a3 100644 --- a/editor/src/dispatcher.rs +++ b/editor/src/dispatcher.rs @@ -143,6 +143,7 @@ impl Dispatcher { let context = DialogMessageContext { portfolio: &self.message_handlers.portfolio_message_handler, preferences: &self.message_handlers.preferences_message_handler, + viewport_bounds: &self.message_handlers.input_preprocessor_message_handler.viewport_bounds, }; self.message_handlers.dialog_message_handler.process_message(message, &mut queue, context); } diff --git a/editor/src/messages/defer/defer_message_handler.rs b/editor/src/messages/defer/defer_message_handler.rs index 460eeaba3b..d4738ff7e8 100644 --- a/editor/src/messages/defer/defer_message_handler.rs +++ b/editor/src/messages/defer/defer_message_handler.rs @@ -19,6 +19,7 @@ impl MessageHandler> for DeferMessageHandl DeferMessage::AfterGraphRun { mut messages } => { let after_graph_run = self.after_graph_run.entry(context.portfolio.active_document_id.unwrap_or(DocumentId(0))).or_default(); after_graph_run.extend(messages.drain(..).map(|m| (self.current_graph_submission_id, m))); + responses.add(NodeGraphMessage::RunDocumentGraph); } DeferMessage::AfterNavigationReady { messages } => { self.after_viewport_resize.extend_from_slice(&messages); @@ -37,8 +38,10 @@ impl MessageHandler> for DeferMessageHandl for (_, message) in elements.rev() { responses.add_front(message); } - if !after_graph_run.is_empty() { - responses.add(NodeGraphMessage::RunDocumentGraph); + for (id, messages) in self.after_graph_run.iter() { + if !messages.is_empty() { + responses.add(PortfolioMessage::SubmitGraphRender { document_id: *id, ignore_hash: false }); + } } } DeferMessage::TriggerNavigationReady => { diff --git a/editor/src/messages/dialog/dialog_message_handler.rs b/editor/src/messages/dialog/dialog_message_handler.rs index 0853abc045..03e1f12e92 100644 --- a/editor/src/messages/dialog/dialog_message_handler.rs +++ b/editor/src/messages/dialog/dialog_message_handler.rs @@ -1,10 +1,13 @@ +use super::new_document_dialog::NewDocumentDialogMessageContext; use super::simple_dialogs::{self, AboutGraphiteDialog, ComingSoonDialog, DemoArtworkDialog, LicensesDialog}; +use crate::messages::input_mapper::utility_types::input_mouse::ViewportBounds; use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::prelude::*; #[derive(ExtractField)] pub struct DialogMessageContext<'a> { pub portfolio: &'a PortfolioMessageHandler, + pub viewport_bounds: &'a ViewportBounds, pub preferences: &'a PreferencesMessageHandler, } @@ -19,11 +22,15 @@ pub struct DialogMessageHandler { #[message_handler_data] impl MessageHandler> for DialogMessageHandler { fn process_message(&mut self, message: DialogMessage, responses: &mut VecDeque, context: DialogMessageContext) { - let DialogMessageContext { portfolio, preferences } = context; + let DialogMessageContext { + portfolio, + preferences, + viewport_bounds, + } = context; match message { DialogMessage::ExportDialog(message) => self.export_dialog.process_message(message, responses, ExportDialogMessageContext { portfolio }), - DialogMessage::NewDocumentDialog(message) => self.new_document_dialog.process_message(message, responses, ()), + DialogMessage::NewDocumentDialog(message) => self.new_document_dialog.process_message(message, responses, NewDocumentDialogMessageContext { viewport_bounds }), DialogMessage::PreferencesDialog(message) => self.preferences_dialog.process_message(message, responses, PreferencesDialogMessageContext { preferences }), DialogMessage::CloseAllDocumentsWithConfirmation => { diff --git a/editor/src/messages/dialog/new_document_dialog/mod.rs b/editor/src/messages/dialog/new_document_dialog/mod.rs index c179de74d1..cf9f7455da 100644 --- a/editor/src/messages/dialog/new_document_dialog/mod.rs +++ b/editor/src/messages/dialog/new_document_dialog/mod.rs @@ -4,4 +4,4 @@ mod new_document_dialog_message_handler; #[doc(inline)] pub use new_document_dialog_message::{NewDocumentDialogMessage, NewDocumentDialogMessageDiscriminant}; #[doc(inline)] -pub use new_document_dialog_message_handler::NewDocumentDialogMessageHandler; +pub use new_document_dialog_message_handler::{NewDocumentDialogMessageContext, NewDocumentDialogMessageHandler}; diff --git a/editor/src/messages/dialog/new_document_dialog/new_document_dialog_message_handler.rs b/editor/src/messages/dialog/new_document_dialog/new_document_dialog_message_handler.rs index c107b68248..51cf615184 100644 --- a/editor/src/messages/dialog/new_document_dialog/new_document_dialog_message_handler.rs +++ b/editor/src/messages/dialog/new_document_dialog/new_document_dialog_message_handler.rs @@ -1,8 +1,13 @@ -use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::prelude::*; +use crate::messages::{input_mapper::utility_types::input_mouse::ViewportBounds, layout::utility_types::widget_prelude::*}; use glam::{IVec2, UVec2}; use graph_craft::document::NodeId; +#[derive(ExtractField)] +pub struct NewDocumentDialogMessageContext<'a> { + pub viewport_bounds: &'a ViewportBounds, +} + /// A dialog to allow users to set some initial options about a new document. #[derive(Debug, Clone, Default, ExtractField)] pub struct NewDocumentDialogMessageHandler { @@ -12,8 +17,8 @@ pub struct NewDocumentDialogMessageHandler { } #[message_handler_data] -impl MessageHandler for NewDocumentDialogMessageHandler { - fn process_message(&mut self, message: NewDocumentDialogMessage, responses: &mut VecDeque, _: ()) { +impl<'a> MessageHandler> for NewDocumentDialogMessageHandler { + fn process_message(&mut self, message: NewDocumentDialogMessage, responses: &mut VecDeque, context: NewDocumentDialogMessageContext<'a>) { match message { NewDocumentDialogMessage::Name(name) => self.name = name, NewDocumentDialogMessage::Infinite(infinite) => self.infinite = infinite, @@ -24,21 +29,18 @@ impl MessageHandler for NewDocumentDialogMessageHa let create_artboard = !self.infinite && self.dimensions.x > 0 && self.dimensions.y > 0; if create_artboard { - responses.add(NodeGraphMessage::RunDocumentGraph); - responses.add(DeferMessage::AfterGraphRun { - messages: vec![ - GraphOperationMessage::NewArtboard { - id: NodeId::new(), - artboard: graphene_std::Artboard::new(IVec2::ZERO, self.dimensions.as_ivec2()), - } - .into(), - NodeGraphMessage::ForceRunDocumentGraph.into(), - DeferMessage::AfterGraphRun { - messages: vec![DeferMessage::TriggerNavigationReady.into()], - } - .into(), - ], + responses.add(GraphOperationMessage::NewArtboard { + id: NodeId::new(), + artboard: graphene_std::Artboard::new(IVec2::ZERO, self.dimensions.as_ivec2()), }); + responses.add(NavigationMessage::CanvasPan { delta: self.dimensions.as_dvec2() }); + responses.add(NodeGraphMessage::RunDocumentGraph); + // If we already have bounds, we won't receive a viewport bounds update so we just fabricate one ourselves + if *context.viewport_bounds != ViewportBounds::default() { + responses.add(InputPreprocessorMessage::BoundsOfViewports { + bounds_of_viewports: vec![context.viewport_bounds.clone()], + }); + } responses.add(DeferMessage::AfterNavigationReady { messages: vec![DocumentMessage::ZoomCanvasToFitAll.into(), DocumentMessage::DeselectAllLayers.into()], }); diff --git a/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs b/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs index 1a8962d974..52e20d1d7b 100644 --- a/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs +++ b/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs @@ -36,6 +36,14 @@ impl MessageHandler f responses.add(NavigationMessage::CanvasPan { delta: DVec2::ZERO }); responses.add(NodeGraphMessage::SetGridAlignedEdges); } + responses.add(DeferMessage::AfterGraphRun { + messages: vec![ + DeferMessage::AfterGraphRun { + messages: vec![DeferMessage::TriggerNavigationReady.into()], + } + .into(), + ], + }); } InputPreprocessorMessage::DoubleClick { editor_mouse_state, modifier_keys } => { self.update_states_of_modifier_keys(modifier_keys, keyboard_platform, responses);