From 3fda69ced5a7661e5d6729062683b85340c1970d Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Thu, 7 Aug 2025 16:36:59 +0200 Subject: [PATCH 1/2] Actively submit graph evaluations while we are still waiting for results --- editor/src/dispatcher.rs | 1 + .../messages/defer/defer_message_handler.rs | 10 +++- .../messages/dialog/dialog_message_handler.rs | 11 +++- .../dialog/new_document_dialog/mod.rs | 2 +- .../new_document_dialog_message_handler.rs | 52 +++++++++++++------ .../input_preprocessor_message_handler.rs | 8 +++ 6 files changed, 62 insertions(+), 22 deletions(-) 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..8e9f9e622c 100644 --- a/editor/src/messages/defer/defer_message_handler.rs +++ b/editor/src/messages/defer/defer_message_handler.rs @@ -17,8 +17,10 @@ impl MessageHandler> for DeferMessageHandl fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque, context: DeferMessageContext) { match message { DeferMessage::AfterGraphRun { mut messages } => { + log::debug!("queing run"); 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); @@ -27,6 +29,7 @@ impl MessageHandler> for DeferMessageHandl self.current_graph_submission_id = execution_id + 1; } DeferMessage::TriggerGraphRun(execution_id, document_id) => { + log::debug!("trigger run"); let after_graph_run = self.after_graph_run.entry(document_id).or_default(); if after_graph_run.is_empty() { return; @@ -37,11 +40,14 @@ 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 => { + log::debug!("navigation ready"); for message in self.after_viewport_resize.drain(..).rev() { responses.add_front(message); } 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..fd283a5bc5 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,24 +29,37 @@ impl MessageHandler for NewDocumentDialogMessageHa let create_artboard = !self.infinite && self.dimensions.x > 0 && self.dimensions.y > 0; if create_artboard { + 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() * -0.5, + }); responses.add(NodeGraphMessage::RunDocumentGraph); - responses.add(DeferMessage::AfterGraphRun { + if *context.viewport_bounds != ViewportBounds::default() { + log::debug!("already got bounds"); + responses.add(InputPreprocessorMessage::BoundsOfViewports { + bounds_of_viewports: vec![context.viewport_bounds.clone()], + }); + } + responses.add(DeferMessage::AfterNavigationReady { 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(), + // DeferMessage::AfterGraphRun { + // messages: vec![ + // DeferMessage::AfterGraphRun { + // messages: vec![DocumentMessage::ZoomCanvasToFitAll.into(), DocumentMessage::DeselectAllLayers.into()], + // } + // .into(), + // DocumentMessage::ZoomCanvasToFitAll.into(), + // DocumentMessage::DeselectAllLayers.into(), + // ], + // } + // .into(), + DocumentMessage::ZoomCanvasToFitAll.into(), + DocumentMessage::DeselectAllLayers.into(), ], }); - 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); From 559758b5516abd3187b1a7125a33732b6553b02e Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Thu, 7 Aug 2025 17:01:43 +0200 Subject: [PATCH 2/2] Cleanup --- .../messages/defer/defer_message_handler.rs | 3 --- .../new_document_dialog_message_handler.rs | 22 +++---------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/editor/src/messages/defer/defer_message_handler.rs b/editor/src/messages/defer/defer_message_handler.rs index 8e9f9e622c..d4738ff7e8 100644 --- a/editor/src/messages/defer/defer_message_handler.rs +++ b/editor/src/messages/defer/defer_message_handler.rs @@ -17,7 +17,6 @@ impl MessageHandler> for DeferMessageHandl fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque, context: DeferMessageContext) { match message { DeferMessage::AfterGraphRun { mut messages } => { - log::debug!("queing run"); 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); @@ -29,7 +28,6 @@ impl MessageHandler> for DeferMessageHandl self.current_graph_submission_id = execution_id + 1; } DeferMessage::TriggerGraphRun(execution_id, document_id) => { - log::debug!("trigger run"); let after_graph_run = self.after_graph_run.entry(document_id).or_default(); if after_graph_run.is_empty() { return; @@ -47,7 +45,6 @@ impl MessageHandler> for DeferMessageHandl } } DeferMessage::TriggerNavigationReady => { - log::debug!("navigation ready"); for message in self.after_viewport_resize.drain(..).rev() { responses.add_front(message); } 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 fd283a5bc5..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 @@ -33,32 +33,16 @@ impl<'a> MessageHandler