improve viewport

This commit is contained in:
Adam
2025-07-28 10:59:48 -07:00
parent 35ce634571
commit 6fb0d60712
5 changed files with 27 additions and 12 deletions
+8 -1
View File
@@ -1,4 +1,5 @@
use crate::messages::debug::utility_types::MessageLoggingVerbosity; use crate::messages::debug::utility_types::MessageLoggingVerbosity;
use crate::messages::defer::DeferMessageContext;
use crate::messages::dialog::DialogMessageContext; use crate::messages::dialog::DialogMessageContext;
use crate::messages::layout::layout_message_handler::LayoutMessageContext; use crate::messages::layout::layout_message_handler::LayoutMessageContext;
use crate::messages::prelude::*; use crate::messages::prelude::*;
@@ -133,7 +134,13 @@ impl Dispatcher {
self.message_handlers.debug_message_handler.process_message(message, &mut queue, ()); self.message_handlers.debug_message_handler.process_message(message, &mut queue, ());
} }
Message::Defer(message) => { 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) => { Message::Dialog(message) => {
let context = DialogMessageContext { let context = DialogMessageContext {
@@ -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)] #[derive(Debug, Default, ExtractField)]
pub struct DeferMessageHandler { pub struct DeferMessageHandler {
@@ -8,14 +13,20 @@ pub struct DeferMessageHandler {
} }
#[message_handler_data] #[message_handler_data]
impl MessageHandler<DeferMessage, ()> for DeferMessageHandler { impl MessageHandler<DeferMessage, DeferMessageContext> for DeferMessageHandler {
fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque<Message>, _: ()) { fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque<Message>, context: DeferMessageContext) {
match message { match message {
DeferMessage::AfterGraphRun { mut messages } => { DeferMessage::AfterGraphRun { mut messages } => {
self.after_graph_run.extend(messages.drain(..).map(|m| (self.current_graph_submission_id, m))); self.after_graph_run.extend(messages.drain(..).map(|m| (self.current_graph_submission_id, m)));
} }
DeferMessage::AfterViewportReady { messages } => { 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) => { DeferMessage::TriggerGraphRun(execution_id) => {
self.current_graph_submission_id = execution_id; self.current_graph_submission_id = execution_id;
+1 -1
View File
@@ -4,4 +4,4 @@ mod defer_message_handler;
#[doc(inline)] #[doc(inline)]
pub use defer_message::{DeferMessage, DeferMessageDiscriminant}; pub use defer_message::{DeferMessage, DeferMessageDiscriminant};
#[doc(inline)] #[doc(inline)]
pub use defer_message_handler::DeferMessageHandler; pub use defer_message_handler::{DeferMessageContext, DeferMessageHandler};
@@ -17,6 +17,7 @@ pub struct InputPreprocessorMessageHandler {
pub time: u64, pub time: u64,
pub keyboard: KeyStates, pub keyboard: KeyStates,
pub mouse: MouseState, pub mouse: MouseState,
// The viewport bounds are loaded on the browser callback, not when the editor is initialized.
pub viewport_bounds: ViewportBounds, pub viewport_bounds: ViewportBounds,
} }
@@ -32,9 +33,7 @@ impl MessageHandler<InputPreprocessorMessage, InputPreprocessorMessageContext> f
for bounds in bounds_of_viewports { for bounds in bounds_of_viewports {
// TODO: Extend this to multiple viewports instead of setting it to the value of this last loop iteration // TODO: Extend this to multiple viewports instead of setting it to the value of this last loop iteration
self.viewport_bounds = bounds; self.viewport_bounds = bounds;
responses.add(DeferMessage::TriggerViewportReady);
responses.add(NavigationMessage::CanvasPan { delta: DVec2::ZERO });
responses.add(NodeGraphMessage::SetGridAlignedEdges);
} }
} }
InputPreprocessorMessage::DoubleClick { editor_mouse_state, modifier_keys } => { InputPreprocessorMessage::DoubleClick { editor_mouse_state, modifier_keys } => {
@@ -1441,9 +1441,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
} else { } else {
self.network_interface.document_bounds_document_space(true) self.network_interface.document_bounds_document_space(true)
}; };
if bounds.is_some() { if bounds.is_none() {
responses.add(DeferMessage::TriggerViewportReady);
} else {
// If we don't have bounds yet, we need wait until the node graph has run once more // If we don't have bounds yet, we need wait until the node graph has run once more
responses.add(DeferMessage::AfterGraphRun { responses.add(DeferMessage::AfterGraphRun {
messages: vec![DocumentMessage::PTZUpdate.into()], messages: vec![DocumentMessage::PTZUpdate.into()],