From cd185626d72dc48bbc16cdf7887644db016657e2 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Thu, 31 Jul 2025 12:07:58 +0200 Subject: [PATCH 1/2] Fix double click in path tool not working --- editor/src/messages/defer/defer_message.rs | 1 + .../messages/defer/defer_message_handler.rs | 16 ++++++++++++---- .../document/document_message_handler.rs | 13 +++++++------ .../portfolio/portfolio_message_handler.rs | 19 ++++++++++++------- .../messages/tool/tool_messages/path_tool.rs | 9 +++++++-- editor/src/node_graph_executor.rs | 10 ++++------ 6 files changed, 43 insertions(+), 25 deletions(-) diff --git a/editor/src/messages/defer/defer_message.rs b/editor/src/messages/defer/defer_message.rs index b49eee8159..605838260d 100644 --- a/editor/src/messages/defer/defer_message.rs +++ b/editor/src/messages/defer/defer_message.rs @@ -3,6 +3,7 @@ use crate::messages::prelude::*; #[impl_message(Message, Defer)] #[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)] pub enum DeferMessage { + SetGraphSubmissionIndex(u64), TriggerGraphRun(u64), AfterGraphRun { messages: Vec }, TriggerNavigationReady, diff --git a/editor/src/messages/defer/defer_message_handler.rs b/editor/src/messages/defer/defer_message_handler.rs index 598f9646d7..04f711e58a 100644 --- a/editor/src/messages/defer/defer_message_handler.rs +++ b/editor/src/messages/defer/defer_message_handler.rs @@ -17,14 +17,22 @@ impl MessageHandler for DeferMessageHandler { DeferMessage::AfterNavigationReady { messages } => { self.after_viewport_resize.extend_from_slice(&messages); } + DeferMessage::SetGraphSubmissionIndex(execution_id) => { + self.current_graph_submission_id = execution_id + 1; + } DeferMessage::TriggerGraphRun(execution_id) => { - self.current_graph_submission_id = execution_id; - for message in self.after_graph_run.extract_if(.., |x| x.0 < self.current_graph_submission_id) { - responses.push_front(message.1); + if self.after_graph_run.is_empty() { + return; + } + // Find the index of the last message we can process + let num_elements_to_remove = self.after_graph_run.binary_search_by_key(&(execution_id + 1), |x| x.0).unwrap_or_else(|pos| pos - 1); + let elements = self.after_graph_run.drain(0..=num_elements_to_remove); + for (_, message) in elements.rev() { + responses.push_front(message); } } DeferMessage::TriggerNavigationReady => { - for message in self.after_viewport_resize.drain(..) { + for message in self.after_viewport_resize.drain(..).rev() { responses.push_front(message); } } diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index cf8f90534c..fc5d1a4af1 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -1880,14 +1880,15 @@ impl DocumentMessageHandler { let previous_network = std::mem::replace(&mut self.network_interface, network_interface); + // Push the UpdateOpenDocumentsList message to the bus in order to update the save status of the open documents + responses.add(PortfolioMessage::UpdateOpenDocumentsList); + responses.add(NodeGraphMessage::SelectedNodesUpdated); + responses.add(NodeGraphMessage::ForceRunDocumentGraph); + // TODO: Remove once the footprint is used to load the imports/export distances from the edge - responses.push_front(NodeGraphMessage::UnloadWires.into()); - responses.push_front(NodeGraphMessage::SetGridAlignedEdges.into()); + responses.add(NodeGraphMessage::UnloadWires); + responses.add(NodeGraphMessage::SetGridAlignedEdges); - // Push the UpdateOpenDocumentsList message to the bus in order to update the save status of the open documents - responses.push_front(NodeGraphMessage::ForceRunDocumentGraph.into()); - responses.push_front(NodeGraphMessage::SelectedNodesUpdated.into()); - responses.push_front(PortfolioMessage::UpdateOpenDocumentsList.into()); Some(previous_network) } pub fn redo_with_history(&mut self, ipp: &InputPreprocessorMessageHandler, responses: &mut VecDeque) { diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 37eabd96de..1348281b88 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -363,13 +363,15 @@ impl MessageHandler> for Portfolio self.executor.update_font_cache(self.persistent_data.font_cache.clone()); for document_id in self.document_ids.iter() { let inspect_node = self.inspect_node_id(); - let _ = self.executor.submit_node_graph_evaluation( + if let Ok(message) = self.executor.submit_node_graph_evaluation( self.documents.get_mut(document_id).expect("Tried to render non-existent document"), ipp.viewport_bounds.size().as_uvec2(), timing_information, inspect_node, true, - ); + ) { + responses.add(message); + } } if self.active_document_mut().is_some() { @@ -846,11 +848,14 @@ impl MessageHandler> for Portfolio ignore_hash, ); - if let Err(description) = result { - responses.add(DialogMessage::DisplayDialogError { - title: "Unable to update node graph".to_string(), - description, - }); + match result { + Err(description) => { + responses.add(DialogMessage::DisplayDialogError { + title: "Unable to update node graph".to_string(), + description, + }); + } + Ok(message) => responses.add(message), } } PortfolioMessage::ToggleRulers => { diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index e04b75d3f4..0af9c8adea 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -2199,6 +2199,7 @@ impl Fsm for PathToolFsmState { } // Deselect all points if the user clicks the filled region of the shape else if tool_data.drag_start_pos.distance(input.mouse.position) <= DRAG_THRESHOLD { + log::debug!("clicked filled region"); shape_editor.deselect_all_points(); shape_editor.deselect_all_segments(); } @@ -2229,7 +2230,9 @@ impl Fsm for PathToolFsmState { tool_data.snapping_axis = None; tool_data.sliding_point_info = None; - responses.add(DocumentMessage::EndTransaction); + if drag_occurred || extend_selection { + responses.add(DocumentMessage::EndTransaction); + } responses.add(PathToolMessage::SelectedPointUpdated); tool_data.snap_manager.cleanup(responses); tool_data.opposite_handle_position = None; @@ -2282,7 +2285,9 @@ impl Fsm for PathToolFsmState { tool_data.saved_points_before_anchor_convert_smooth_sharp.clear(); responses.add(DocumentMessage::EndTransaction); - responses.add(PathToolMessage::SelectedPointUpdated); + responses.add(DeferMessage::AfterGraphRun { + messages: vec![PathToolMessage::SelectedPointUpdated.into()], + }); } return PathToolFsmState::Ready; diff --git a/editor/src/node_graph_executor.rs b/editor/src/node_graph_executor.rs index aa439960dd..a129b2d279 100644 --- a/editor/src/node_graph_executor.rs +++ b/editor/src/node_graph_executor.rs @@ -133,7 +133,7 @@ impl NodeGraphExecutor { } /// Adds an evaluate request for whatever current network is cached. - pub(crate) fn submit_current_node_graph_evaluation(&mut self, document: &mut DocumentMessageHandler, viewport_resolution: UVec2, time: TimingInformation) -> Result<(), String> { + pub(crate) fn submit_current_node_graph_evaluation(&mut self, document: &mut DocumentMessageHandler, viewport_resolution: UVec2, time: TimingInformation) -> Result { let render_config = RenderConfig { viewport: Footprint { transform: document.metadata().document_to_viewport, @@ -155,7 +155,7 @@ impl NodeGraphExecutor { self.futures.insert(execution_id, ExecutionContext { export_config: None }); - Ok(()) + Ok(DeferMessage::SetGraphSubmissionIndex(execution_id).into()) } /// Evaluates a node graph, computing the entire graph @@ -166,11 +166,9 @@ impl NodeGraphExecutor { time: TimingInformation, inspect_node: Option, ignore_hash: bool, - ) -> Result<(), String> { + ) -> Result { self.update_node_graph(document, inspect_node, ignore_hash)?; - self.submit_current_node_graph_evaluation(document, viewport_resolution, time)?; - - Ok(()) + self.submit_current_node_graph_evaluation(document, viewport_resolution, time) } /// Evaluates a node graph for export From 014eec3e2814e6159096516d9d7f52b922509f9a Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Thu, 31 Jul 2025 14:43:01 -0700 Subject: [PATCH 2/2] Remove debug line --- editor/src/messages/defer/defer_message_handler.rs | 4 ++-- editor/src/messages/prelude.rs | 2 ++ editor/src/messages/tool/tool_messages/path_tool.rs | 1 - 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/editor/src/messages/defer/defer_message_handler.rs b/editor/src/messages/defer/defer_message_handler.rs index 04f711e58a..693c2de99e 100644 --- a/editor/src/messages/defer/defer_message_handler.rs +++ b/editor/src/messages/defer/defer_message_handler.rs @@ -28,12 +28,12 @@ impl MessageHandler for DeferMessageHandler { let num_elements_to_remove = self.after_graph_run.binary_search_by_key(&(execution_id + 1), |x| x.0).unwrap_or_else(|pos| pos - 1); let elements = self.after_graph_run.drain(0..=num_elements_to_remove); for (_, message) in elements.rev() { - responses.push_front(message); + responses.add_front(message); } } DeferMessage::TriggerNavigationReady => { for message in self.after_viewport_resize.drain(..).rev() { - responses.push_front(message); + responses.add_front(message); } } } diff --git a/editor/src/messages/prelude.rs b/editor/src/messages/prelude.rs index 5a01deb7a6..1f12aad6b1 100644 --- a/editor/src/messages/prelude.rs +++ b/editor/src/messages/prelude.rs @@ -67,10 +67,12 @@ pub trait Responses { } impl Responses for VecDeque { + #[inline(always)] fn add(&mut self, message: impl Into) { self.push_back(message.into()); } + #[inline(always)] fn add_front(&mut self, message: impl Into) { self.push_front(message.into()); } diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 0af9c8adea..e5efc14afe 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -2199,7 +2199,6 @@ impl Fsm for PathToolFsmState { } // Deselect all points if the user clicks the filled region of the shape else if tool_data.drag_start_pos.distance(input.mouse.position) <= DRAG_THRESHOLD { - log::debug!("clicked filled region"); shape_editor.deselect_all_points(); shape_editor.deselect_all_segments(); }