From 058e5a6294ba87db7da5075185e6b1ec122d8f1d Mon Sep 17 00:00:00 2001 From: Kulratan Thapar Date: Wed, 21 Jan 2026 10:35:41 +0000 Subject: [PATCH] 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 c26b21af5c..35d226cb84 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 @@ -1957,6 +1957,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; @@ -1982,6 +1983,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::>(), @@ -2769,6 +2790,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 {