From ad6df18c5a7303a6b0aa4ae5d540bb262446af9a Mon Sep 17 00:00:00 2001 From: Kulratan Thapar Date: Wed, 21 Jan 2026 10:35:41 +0000 Subject: [PATCH 1/2] Added Ctrl modifier that filters selection to include only child nodes --- .../node_graph/node_graph_message_handler.rs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index b0439072b7..31ef6389f4 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -1958,6 +1958,7 @@ impl<'a> MessageHandler> for NodeG let shift = ipp.keyboard.get(Key::Shift as usize); let alt = ipp.keyboard.get(Key::Alt as usize); + let control = ipp.keyboard.get(Key::Control as usize); let Some(selected_nodes) = network_interface.selected_nodes_in_nested_network(selection_network_path) else { log::error!("Could not get selected nodes in UpdateBoxSelection"); return; @@ -1983,6 +1984,26 @@ impl<'a> MessageHandler> for NodeG } } } + + if control { + let layer_nodes: Vec<_> = nodes.iter().filter(|node_id| network_interface.is_layer(node_id, selection_network_path)).cloned().collect(); + let mut child_nodes = HashSet::new(); + for layer_id in &layer_nodes { + for child_id in network_interface.upstream_flow_back_from_nodes(vec![*layer_id], selection_network_path, FlowType::LayerChildrenUpstreamFlow) { + if nodes.contains(&child_id) && child_id != *layer_id { + child_nodes.insert(child_id); + } + } + } + nodes = if alt { + previous_selection.difference(&child_nodes).cloned().collect() + } else if shift { + previous_selection.union(&child_nodes).cloned().collect() + } else { + child_nodes + }; + } + if nodes != previous_selection { responses.add(NodeGraphMessage::SelectedNodesSet { nodes: nodes.into_iter().collect::>(), @@ -2770,6 +2791,7 @@ impl NodeGraphMessageHandler { HintInfo::mouse(MouseMotion::LmbDrag, "Select Area"), HintInfo::keys([Key::Shift], "Extend").prepend_plus(), HintInfo::keys([Key::Alt], "Subtract").prepend_plus(), + HintInfo::keys([Key::Control], "Children Only").prepend_plus(), ]), ]); if self.has_selection { From 82374e23d3c8b245cf954cf6d8dfe63ebd9e9379 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Mon, 2 Feb 2026 14:05:31 -0800 Subject: [PATCH 2/2] Code review --- .../node_graph/node_graph_message_handler.rs | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index 31ef6389f4..d410870318 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -1986,22 +1986,29 @@ impl<'a> MessageHandler> for NodeG } if control { - let layer_nodes: Vec<_> = nodes.iter().filter(|node_id| network_interface.is_layer(node_id, selection_network_path)).cloned().collect(); - let mut child_nodes = HashSet::new(); - for layer_id in &layer_nodes { - for child_id in network_interface.upstream_flow_back_from_nodes(vec![*layer_id], selection_network_path, FlowType::LayerChildrenUpstreamFlow) { - if nodes.contains(&child_id) && child_id != *layer_id { - child_nodes.insert(child_id); + let mut non_layer_nodes = HashSet::new(); + + let layer_nodes = nodes.iter().filter(|node_id| network_interface.is_layer(node_id, selection_network_path)); + for &layer_id in layer_nodes { + for child_id in network_interface.upstream_flow_back_from_nodes(vec![layer_id], selection_network_path, FlowType::LayerChildrenUpstreamFlow) { + if nodes.contains(&child_id) && child_id != layer_id { + non_layer_nodes.insert(child_id); } } } - nodes = if alt { - previous_selection.difference(&child_nodes).cloned().collect() - } else if shift { - previous_selection.union(&child_nodes).cloned().collect() - } else { - child_nodes - }; + + // Remove non-layer nodes from selection + if alt { + nodes = previous_selection.difference(&non_layer_nodes).cloned().collect(); + } + // Add non-layer nodes to selection + else if shift { + nodes = previous_selection.union(&non_layer_nodes).cloned().collect(); + } + // Replace selection with non-layer nodes + else { + nodes = non_layer_nodes; + } } if nodes != previous_selection { @@ -2791,7 +2798,7 @@ impl NodeGraphMessageHandler { HintInfo::mouse(MouseMotion::LmbDrag, "Select Area"), HintInfo::keys([Key::Shift], "Extend").prepend_plus(), HintInfo::keys([Key::Alt], "Subtract").prepend_plus(), - HintInfo::keys([Key::Control], "Children Only").prepend_plus(), + HintInfo::keys([Key::Control], "Exclude Layers").prepend_plus(), ]), ]); if self.has_selection {