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

View file

@ -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 {

View file

@ -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<DeferMessage, ()> for DeferMessageHandler {
fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque<Message>, _: ()) {
impl MessageHandler<DeferMessage, DeferMessageContext> for DeferMessageHandler {
fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque<Message>, 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;

View file

@ -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};

View file

@ -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<InputPreprocessorMessage, InputPreprocessorMessageContext> 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 } => {

View file

@ -1441,9 +1441,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> 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()],