From 6e070038a3a6e6aa45c91e8a0cb2542e5cdf72b4 Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 10 Aug 2026 20:39:16 +0500 Subject: [PATCH] fix: fixed jittery drag --- src/graph.rs | 14 +++++++++----- src/node.rs | 10 ++++++---- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/graph.rs b/src/graph.rs index b53e9aa..0c73c49 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -10,7 +10,7 @@ pub struct Graph { pub sockets: Vec, pub connections: Vec, pub current_drag_socket: Option, - pub current_drag_node: Option, + pub current_drag_node: Option<(usize,Option)>, } impl Graph { @@ -27,9 +27,13 @@ impl Graph { self.current_drag_socket = None; } }, - GraphMessage::NodeStartDrag(index) => self.current_drag_node = Some(index), - GraphMessage::NodeDrag(point, idx) if let Some(node_index) = self.current_drag_node && idx == node_index => self.nodes[node_index].position = point, - GraphMessage::NodeStopDrag => self.current_drag_node = None, + GraphMessage::NodeStartDrag(index) => self.current_drag_node = Some((index,None)), + GraphMessage::NodeDrag(point, idx) if let Some((node_index,cached_position)) = self.current_drag_node && idx == node_index => { + let previous_position = cached_position.unwrap_or(point); + self.nodes[idx].position += point - previous_position; + self.current_drag_node = Some((idx,Some(previous_position))); + }, + GraphMessage::NodeStopDrag(idx) if let Some((node_index,_)) = self.current_drag_node && idx == node_index => self.current_drag_node = None, GraphMessage::SpawnNode(node) => self.nodes.push(node), _ => {}, } @@ -55,7 +59,7 @@ impl Graph { pub enum GraphMessage { NodeStartDrag(usize), NodeDrag(Point, usize), - NodeStopDrag, + NodeStopDrag(usize), SocketDragStart(usize), SocketDragEnd(usize), diff --git a/src/node.rs b/src/node.rs index 6bb20f8..4bcf6f5 100644 --- a/src/node.rs +++ b/src/node.rs @@ -1,6 +1,6 @@ use iced::widget::container::{bordered_box, rounded_box}; use iced::{Element, Length, Point}; -use iced::widget::{Column, column, container, mouse_area, row, space, text}; +use iced::widget::{Column, column, container, mouse_area, pin, row, space, text}; use crate::socket::Socket; use crate::graph::GraphMessage; @@ -32,7 +32,8 @@ impl Node { .style(rounded_box)) .on_press(Message::GraphMessage(GraphMessage::NodeStartDrag(index))) .on_move(move |point| Message::GraphMessage(GraphMessage::NodeDrag(point, index))) - .on_release(Message::GraphMessage(GraphMessage::NodeStopDrag)); + .on_release(Message::GraphMessage(GraphMessage::NodeStopDrag(index))) + .on_exit(Message::GraphMessage(GraphMessage::NodeStopDrag(index))); let inputs = Column::with_children( self.inputs.iter().map(|socket_id| @@ -48,12 +49,13 @@ impl Node { let body = row![inputs, space().width(Length::Fixed(40.)), outputs]; let content = column![header,body].spacing(8).padding(8); - container(content) + pin(container(content) .style(bordered_box) .width(Length::Fixed(100.)) + ).position(self.position) .into() } - pub fn position(mut self, point: Point) -> Self { + pub fn reposition(mut self, point: Point) -> Self { self.position = point; self }