From 7b70b706b56a7bdfe461c6d2bc34e027296cf5fc Mon Sep 17 00:00:00 2001 From: Setzer22 Date: Sat, 12 Nov 2022 16:22:42 +0100 Subject: [PATCH] Handle moving multiple nodes at the same time with box selection This also introduces a new NodeResponse to indicate node movement --- egui_node_graph/src/editor_ui.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/egui_node_graph/src/editor_ui.rs b/egui_node_graph/src/editor_ui.rs index 691f49a..8af69f2 100644 --- a/egui_node_graph/src/editor_ui.rs +++ b/egui_node_graph/src/editor_ui.rs @@ -40,6 +40,10 @@ pub enum NodeResponse }, /// Emitted when a node is interacted with, and should be raised RaiseNode(NodeId), + MoveNode { + node: NodeId, + drag_delta: Vec2, + }, User(UserResponse), } @@ -329,6 +333,17 @@ where self.node_order.remove(old_pos); self.node_order.push(*node_id); } + NodeResponse::MoveNode { node, drag_delta } => { + self.node_positions[*node] += *drag_delta; + // Handle multi-node selection movement + if self.selected_nodes.contains(node) && self.selected_nodes.len() > 1 { + for n in self.selected_nodes.iter().copied() { + if n != *node { + self.node_positions[n] += *drag_delta; + } + } + } + } NodeResponse::User(_) => { // These are handled by the user code. } @@ -767,8 +782,12 @@ where ); // Movement - *self.position += window_response.drag_delta(); - if window_response.drag_delta().length_sq() > 0.0 { + let drag_delta = window_response.drag_delta(); + if drag_delta.length_sq() > 0.0 { + responses.push(NodeResponse::MoveNode { + node: self.node_id, + drag_delta, + }); responses.push(NodeResponse::RaiseNode(self.node_id)); }