From 6fb0d607122ec34e9d42b866029d5f28cda060c4 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 28 Jul 2025 10:59:48 -0700 Subject: [PATCH] improve viewport --- editor/src/dispatcher.rs | 9 ++++++++- .../messages/defer/defer_message_handler.rs | 19 +++++++++++++++---- editor/src/messages/defer/mod.rs | 2 +- .../input_preprocessor_message_handler.rs | 5 ++--- .../document/document_message_handler.rs | 4 +--- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/editor/src/dispatcher.rs b/editor/src/dispatcher.rs index 4be3e5362..432e77554 100644 --- a/editor/src/dispatcher.rs +++ b/editor/src/dispatcher.rs @@ -1,4 +1,5 @@ use crate::messages::debug::utility_types::MessageLoggingVerbosity; +use crate::messages::defer::DeferMessageContext; use crate::messages::dialog::DialogMessageContext; use crate::messages::layout::layout_message_handler::LayoutMessageContext; use crate::messages::prelude::*; @@ -133,7 +134,13 @@ impl Dispatcher { self.message_handlers.debug_message_handler.process_message(message, &mut queue, ()); } Message::Defer(message) => { - self.message_handlers.defer_message_handler.process_message(message, &mut queue, ()); + self.message_handlers.defer_message_handler.process_message( + message, + &mut queue, + DeferMessageContext { + viewport_bounds: self.message_handlers.input_preprocessor_message_handler.viewport_bounds, + }, + ); } Message::Dialog(message) => { let context = DialogMessageContext { diff --git a/editor/src/messages/defer/defer_message_handler.rs b/editor/src/messages/defer/defer_message_handler.rs index 440fffd83..9c6d1c53e 100644 --- a/editor/src/messages/defer/defer_message_handler.rs +++ b/editor/src/messages/defer/defer_message_handler.rs @@ -1,4 +1,9 @@ -use crate::messages::prelude::*; +use crate::messages::{input_mapper::utility_types::input_mouse::ViewportBounds, prelude::*}; + +#[derive(ExtractField)] +pub struct DeferMessageContext { + viewport_bounds: ViewportBounds, +} #[derive(Debug, Default, ExtractField)] pub struct DeferMessageHandler { @@ -8,14 +13,20 @@ pub struct DeferMessageHandler { } #[message_handler_data] -impl MessageHandler for DeferMessageHandler { - fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque, _: ()) { +impl MessageHandler for DeferMessageHandler { + fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque, context: DeferMessageContext) { match message { DeferMessage::AfterGraphRun { mut messages } => { self.after_graph_run.extend(messages.drain(..).map(|m| (self.current_graph_submission_id, m))); } DeferMessage::AfterViewportReady { messages } => { - self.after_viewport_resize.extend_from_slice(&messages); + if context.viewport_bounds == ViewportBounds::default() { + self.after_viewport_resize.extend_from_slice(&messages); + } else { + for message in messages { + responses.push_front(message); + } + } } DeferMessage::TriggerGraphRun(execution_id) => { self.current_graph_submission_id = execution_id; diff --git a/editor/src/messages/defer/mod.rs b/editor/src/messages/defer/mod.rs index 819bbf48e..3a7b0b3f7 100644 --- a/editor/src/messages/defer/mod.rs +++ b/editor/src/messages/defer/mod.rs @@ -4,4 +4,4 @@ mod defer_message_handler; #[doc(inline)] pub use defer_message::{DeferMessage, DeferMessageDiscriminant}; #[doc(inline)] -pub use defer_message_handler::DeferMessageHandler; +pub use defer_message_handler::{DeferMessageContext, DeferMessageHandler}; 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 1a8962d97..43c07a36d 100644 --- a/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs +++ b/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs @@ -17,6 +17,7 @@ pub struct InputPreprocessorMessageHandler { pub time: u64, pub keyboard: KeyStates, pub mouse: MouseState, + // The viewport bounds are loaded on the browser callback, not when the editor is initialized. pub viewport_bounds: ViewportBounds, } @@ -32,9 +33,7 @@ impl MessageHandler f for bounds in bounds_of_viewports { // TODO: Extend this to multiple viewports instead of setting it to the value of this last loop iteration self.viewport_bounds = bounds; - - responses.add(NavigationMessage::CanvasPan { delta: DVec2::ZERO }); - responses.add(NodeGraphMessage::SetGridAlignedEdges); + responses.add(DeferMessage::TriggerViewportReady); } } InputPreprocessorMessage::DoubleClick { editor_mouse_state, modifier_keys } => { diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index a350d803b..63cc946b7 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -1441,9 +1441,7 @@ impl MessageHandler> for DocumentMes } else { self.network_interface.document_bounds_document_space(true) }; - if bounds.is_some() { - responses.add(DeferMessage::TriggerViewportReady); - } else { + if bounds.is_none() { // If we don't have bounds yet, we need wait until the node graph has run once more responses.add(DeferMessage::AfterGraphRun { messages: vec![DocumentMessage::PTZUpdate.into()],