From 33ccbd22a2edbebbf5700e954ee336c289806aff Mon Sep 17 00:00:00 2001 From: Half-and-Xat <58362052+Half-and-Xat@users.noreply.github.com> Date: Sun, 1 Mar 2026 01:52:49 +0000 Subject: [PATCH 1/6] improve spline math --- ui/edge_item.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/edge_item.py b/ui/edge_item.py index 1d47817..6487f09 100644 --- a/ui/edge_item.py +++ b/ui/edge_item.py @@ -62,10 +62,10 @@ def update_path(self): dx = self.target_pos.x() - self.source_pos.x() dy = self.target_pos.y() - self.source_pos.y() - - ctrl1_x = self.source_pos.x() + abs(dx) * 0.5 + + ctrl1_x = self.source_pos.x() + min(max(abs(dy) * 2.5, abs(dx)), max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 ctrl1_y = self.source_pos.y() - ctrl2_x = self.target_pos.x() - abs(dx) * 0.5 + ctrl2_x = self.target_pos.x() - min(max(abs(dy) * 2.5, abs(dx)), max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 ctrl2_y = self.target_pos.y() path.cubicTo( @@ -73,5 +73,5 @@ def update_path(self): QPointF(ctrl2_x, ctrl2_y), self.target_pos ) - + self.setPath(path) From b08bba1efdeb33b51054e42d31367e8b9a9a8627 Mon Sep 17 00:00:00 2001 From: Half-and-Xat <58362052+Half-and-Xat@users.noreply.github.com> Date: Sun, 1 Mar 2026 02:28:54 +0000 Subject: [PATCH 2/6] mirror spline on dragging from input port --- ui/edge_item.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ui/edge_item.py b/ui/edge_item.py index 6487f09..0abfc65 100644 --- a/ui/edge_item.py +++ b/ui/edge_item.py @@ -51,8 +51,11 @@ def set_positions(self, source: QPointF, target: QPointF): self.target_pos = target self.update_path() - def set_target_pos(self, pos: QPointF): - self.target_pos = pos + def set_target_pos(self, pos: QPointF, is_port_input): + if is_port_input: + self.source_pos = pos + else: + self.target_pos = pos self.update_path() From a8eb104a1557155a36254e9e213f915e4c5eb6ff Mon Sep 17 00:00:00 2001 From: Half-and-Xat <58362052+Half-and-Xat@users.noreply.github.com> Date: Sun, 1 Mar 2026 02:29:55 +0000 Subject: [PATCH 3/6] mirror spline on dragging from input port --- ui/graph_scene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/graph_scene.py b/ui/graph_scene.py index 9e16334..ae04967 100644 --- a/ui/graph_scene.py +++ b/ui/graph_scene.py @@ -169,5 +169,5 @@ def update_edges_for_node(self, node_item): def mouseMoveEvent(self, event): if self.drag_edge: - self.drag_edge.set_target_pos(event.scenePos()) + self.drag_edge.set_target_pos(event.scenePos(), self.drag_edge.source_port.is_input) super().mouseMoveEvent(event) From 62e942140543bcbd3196505d5107dc51e590125f Mon Sep 17 00:00:00 2001 From: Half-and-Xat <58362052+Half-and-Xat@users.noreply.github.com> Date: Sun, 1 Mar 2026 06:23:04 +0000 Subject: [PATCH 4/6] prevent zoom-label width change --- ui/graph_view.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/graph_view.py b/ui/graph_view.py index 3e3c539..78b0802 100644 --- a/ui/graph_view.py +++ b/ui/graph_view.py @@ -554,6 +554,8 @@ def _init_zoom_widget(self): self.zoom_in_btn.setFixedSize(28, 28) self.zoom_label = ZoomLabel("100%") + self.zoom_label.setFixedWidth(32) + self.zoom_label.setAlignment(Qt.AlignHCenter) self.zoom_slider = QSlider(Qt.Horizontal) self.zoom_slider.setRange(20, 300) From f5bc5a28571d9cf49f857c1d18e6e2c892c2dcee Mon Sep 17 00:00:00 2001 From: Half-and-Xat <58362052+Half-and-Xat@users.noreply.github.com> Date: Mon, 2 Mar 2026 08:11:26 +0000 Subject: [PATCH 5/6] reducing strength of short splines --- ui/edge_item.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/edge_item.py b/ui/edge_item.py index 0abfc65..f986fc3 100644 --- a/ui/edge_item.py +++ b/ui/edge_item.py @@ -66,9 +66,9 @@ def update_path(self): dx = self.target_pos.x() - self.source_pos.x() dy = self.target_pos.y() - self.source_pos.y() - ctrl1_x = self.source_pos.x() + min(max(abs(dy) * 2.5, abs(dx)), max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 + ctrl1_x = self.source_pos.x() + min(max(abs(dy) * 1.5, abs(dx)), max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 ctrl1_y = self.source_pos.y() - ctrl2_x = self.target_pos.x() - min(max(abs(dy) * 2.5, abs(dx)), max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 + ctrl2_x = self.target_pos.x() - min(max(abs(dy) * 1.5, abs(dx)), max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 ctrl2_y = self.target_pos.y() path.cubicTo( From 576991c798c3eba50a965f831ede84ce82c4403f Mon Sep 17 00:00:00 2001 From: Half-and-Xat <58362052+Half-and-Xat@users.noreply.github.com> Date: Mon, 2 Mar 2026 14:35:17 +0000 Subject: [PATCH 6/6] polishing math for short spline distances --- ui/edge_item.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/edge_item.py b/ui/edge_item.py index f986fc3..b9f6bee 100644 --- a/ui/edge_item.py +++ b/ui/edge_item.py @@ -3,6 +3,7 @@ from PySide6.QtGui import QPainterPath, QPen, QColor from core.graph import Edge from core.port_types import PORT_STYLES, PortType +import math class EdgeItem(QGraphicsPathItem): def __init__(self, edge=None, source_port=None, target_port=None): @@ -65,10 +66,11 @@ def update_path(self): dx = self.target_pos.x() - self.source_pos.x() dy = self.target_pos.y() - self.source_pos.y() + d_str = math.sqrt(dx ** 2 + dy ** 2) * 1.35 - ctrl1_x = self.source_pos.x() + min(max(abs(dy) * 1.5, abs(dx)), max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 + ctrl1_x = self.source_pos.x() + min(d_str, max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 ctrl1_y = self.source_pos.y() - ctrl2_x = self.target_pos.x() - min(max(abs(dy) * 1.5, abs(dx)), max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 + ctrl2_x = self.target_pos.x() - min(d_str, max(dx, pow(abs(dx), 0.8) + 250)) * 0.5 ctrl2_y = self.target_pos.y() path.cubicTo(