From 3197ec17f5b3c5408a9eba4f7c8cf5554e96ae3f Mon Sep 17 00:00:00 2001 From: Adesh Gupta Date: Wed, 13 Aug 2025 06:30:37 +0000 Subject: [PATCH 1/2] Add defer message for shallow select --- editor/src/messages/tool/tool_messages/select_tool.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index 31bd2c3a4b..8fc8a8af4a 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -92,6 +92,7 @@ pub enum SelectToolMessage { remove_from_selection: Key, }, EditLayer, + EditLayerExec, Enter, PointerMove(SelectToolPointerKeys), PointerOutsideViewport(SelectToolPointerKeys), @@ -985,12 +986,17 @@ impl Fsm for SelectToolFsmState { self } (_, SelectToolMessage::EditLayer) => { - // Edit the clicked layer + // Edit the clicked layer - defer the message to ensure document graph has run and click targets are available if let Some(intersect) = document.click(input) { match tool_data.nested_selection_behavior { NestedSelectionBehavior::Shallowest => edit_layer_shallowest_manipulation(document, intersect, responses), NestedSelectionBehavior::Deepest => edit_layer_deepest_manipulation(intersect, &document.network_interface, responses), } + } else { + // If click detection fails, defer the message until after graph runs + responses.add(DeferMessage::AfterGraphRun { + messages: vec![SelectToolMessage::EditLayer.into()], + }); } self From 57fcaea87b415ba017f68e908e8f26a03bf1ff52 Mon Sep 17 00:00:00 2001 From: Adesh Gupta Date: Fri, 15 Aug 2025 09:10:51 +0000 Subject: [PATCH 2/2] Fixed infinite loop --- .../messages/tool/tool_messages/select_tool.rs | 15 ++++++++------- editor/src/node_graph_executor.rs | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index 8fc8a8af4a..fbf63aafbd 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -324,6 +324,7 @@ impl<'a> MessageHandler> for Sele PointerMove, Abort, EditLayer, + EditLayerExec, Enter, ); @@ -986,19 +987,19 @@ impl Fsm for SelectToolFsmState { self } (_, SelectToolMessage::EditLayer) => { - // Edit the clicked layer - defer the message to ensure document graph has run and click targets are available + responses.add(DeferMessage::AfterGraphRun { + messages: vec![SelectToolMessage::EditLayerExec.into()], + }); + + self + } + (_, SelectToolMessage::EditLayerExec) => { if let Some(intersect) = document.click(input) { match tool_data.nested_selection_behavior { NestedSelectionBehavior::Shallowest => edit_layer_shallowest_manipulation(document, intersect, responses), NestedSelectionBehavior::Deepest => edit_layer_deepest_manipulation(intersect, &document.network_interface, responses), } - } else { - // If click detection fails, defer the message until after graph runs - responses.add(DeferMessage::AfterGraphRun { - messages: vec![SelectToolMessage::EditLayer.into()], - }); } - self } ( diff --git a/editor/src/node_graph_executor.rs b/editor/src/node_graph_executor.rs index 560ff47188..705ff9da4b 100644 --- a/editor/src/node_graph_executor.rs +++ b/editor/src/node_graph_executor.rs @@ -291,7 +291,7 @@ impl NodeGraphExecutor { } else { self.process_node_graph_output(node_graph_output, footprint, responses)?; } - responses.add_front(DeferMessage::TriggerGraphRun(execution_id, execution_context.document_id)); + responses.add(DeferMessage::TriggerGraphRun(execution_id, execution_context.document_id)); // Update the Data panel on the frontend using the value of the inspect result. if let Some(inspect_result) = (self.previous_node_to_inspect.is_some()).then_some(inspect_result).flatten() { @@ -411,6 +411,7 @@ impl NodeGraphExecutor { responses.add(DocumentMessage::RenderScrollbars); responses.add(DocumentMessage::RenderRulers); responses.add(OverlaysMessage::Draw); + // responses.add(DeferMessage::TriggerAfterClickTargetsUpdate); Ok(()) } }