Skip to content

Commit a0c7432

Browse files
committed
add: auto update the GraphicsScene size, nodes no longer limit to fixed area
1 parent 7690a6b commit a0c7432

File tree

2 files changed

+44
-17
lines changed

2 files changed

+44
-17
lines changed

NodeGraphQt/constants.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,6 @@
7676
VIEWER_GRID_OVERLAY = True
7777
VIEWER_GRID_SIZE = 20
7878

79-
SCENE_AREA = 8000.0
80-
8179
DRAG_DROP_ID = 'n0deGraphQT'
8280

8381
# === PATHS ===

NodeGraphQt/widgets/viewer.py

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55

66
from NodeGraphQt import QtGui, QtCore, QtWidgets
77
from NodeGraphQt.constants import (IN_PORT, OUT_PORT,
8-
PIPE_LAYOUT_CURVED,
9-
SCENE_AREA)
8+
PIPE_LAYOUT_CURVED)
109
from NodeGraphQt.qgraphics.node_abstract import AbstractNodeItem
1110
from NodeGraphQt.qgraphics.node_backdrop import BackdropNodeItem
1211
from NodeGraphQt.qgraphics.pipe import Pipe, LivePipe
@@ -42,16 +41,19 @@ class NodeViewer(QtWidgets.QGraphicsView):
4241
def __init__(self, parent=None):
4342
super(NodeViewer, self).__init__(parent)
4443

45-
scene_pos = (SCENE_AREA / 2) * -1
4644
self.setScene(NodeScene(self))
47-
self.setSceneRect(scene_pos, scene_pos, SCENE_AREA, SCENE_AREA)
4845
self.setRenderHint(QtGui.QPainter.Antialiasing, True)
4946
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
5047
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
5148
self.setViewportUpdateMode(QtWidgets.QGraphicsView.FullViewportUpdate)
49+
5250
self.setAcceptDrops(True)
5351
self.resize(850, 800)
5452

53+
self._scene_range = QtCore.QRectF(0, 0, self.size().width(), self.size().height())
54+
self._update_scene()
55+
self._last_size = self.size()
56+
5557
self._pipe_layout = PIPE_LAYOUT_CURVED
5658
self._detached_port = None
5759
self._start_port = None
@@ -81,7 +83,6 @@ def __init__(self, parent=None):
8183
menu_bar = QtWidgets.QMenuBar(self)
8284
menu_bar.setNativeMenuBar(False)
8385
# shortcuts don't work with "setVisibility(False)".
84-
# menu_bar.resize(0, 0)
8586
menu_bar.setMaximumWidth(0)
8687

8788
self._ctx_menu = BaseMenu('NodeGraph', self)
@@ -105,7 +106,12 @@ def __repr__(self):
105106

106107
# --- private ---
107108

108-
def _set_viewer_zoom(self, value, sensitivity=0.0):
109+
def _set_viewer_zoom(self, value, sensitivity=None):
110+
if sensitivity is None:
111+
scale = 1.001 ** value
112+
self.scale(scale,scale)
113+
return
114+
109115
if value == 0.0:
110116
return
111117
scale = (0.9 + sensitivity) if value < 0.0 else (1.1 - sensitivity)
@@ -119,10 +125,28 @@ def _set_viewer_zoom(self, value, sensitivity=0.0):
119125
self.scale(scale, scale)
120126

121127
def _set_viewer_pan(self, pos_x, pos_y):
122-
scroll_x = self.horizontalScrollBar()
123-
scroll_y = self.verticalScrollBar()
124-
scroll_x.setValue(scroll_x.value() - pos_x)
125-
scroll_y.setValue(scroll_y.value() - pos_y)
128+
speed = self._scene_range.width() * 0.001
129+
x = -pos_x * speed
130+
y = -pos_y * speed
131+
self._scene_range.adjust(x, y, x, y)
132+
self._update_scene()
133+
134+
def scale(self, sx, sy):
135+
scale = [sx, sy]
136+
scale[0] = scale[1]
137+
138+
center = self._scene_range.center()
139+
140+
w = self._scene_range.width() / scale[0]
141+
h = self._scene_range.height() / scale[1]
142+
self._scene_range = QtCore.QRectF(center.x() - (center.x() - self._scene_range.left()) / scale[0],
143+
center.y() - (center.y() - self._scene_range.top()) / scale[1], w, h)
144+
145+
self._update_scene()
146+
147+
def _update_scene(self):
148+
self.setSceneRect(self._scene_range)
149+
self.fitInView(self._scene_range, QtCore.Qt.KeepAspectRatio)
126150

127151
def _combined_rect(self, nodes):
128152
group = self.scene().createItemGroup(nodes)
@@ -156,6 +180,10 @@ def _on_pipes_sliced(self, path):
156180
# --- reimplemented events ---
157181

158182
def resizeEvent(self, event):
183+
delta = max(self.size().width()/self._last_size.width(),
184+
self.size().height()/self._last_size.height())
185+
self._set_viewer_zoom(delta)
186+
self._last_size = self.size()
159187
super(NodeViewer, self).resizeEvent(event)
160188

161189
def contextMenuEvent(self, event):
@@ -353,9 +381,10 @@ def wheelEvent(self, event):
353381
except AttributeError:
354382
# For PyQt5
355383
delta = event.angleDelta().y()
384+
if delta == 0:
385+
delta = event.angleDelta().x()
356386

357-
adjust = (delta / 120) * 0.1
358-
self._set_viewer_zoom(adjust)
387+
self._set_viewer_zoom(delta)
359388

360389
def dropEvent(self, event):
361390
pos = self.mapToScene(event.pos())
@@ -811,8 +840,8 @@ def set_pipe_layout(self, layout):
811840
pipe.draw_path(pipe.input_port, pipe.output_port)
812841

813842
def reset_zoom(self):
814-
self.scale(1.0, 1.0)
815-
self.resetTransform()
843+
self._scene_range = QtCore.QRectF(0, 0, self.size().width(), self.size().height())
844+
self._update_scene()
816845

817846
def get_zoom(self):
818847
transform = self.transform()
@@ -831,7 +860,7 @@ def set_zoom(self, value=0.0):
831860
if not (ZOOM_MIN <= value <= ZOOM_MAX):
832861
return
833862
value = value - zoom
834-
self._set_viewer_zoom(value)
863+
self._set_viewer_zoom(value,0.0)
835864

836865
def zoom_to_nodes(self, nodes):
837866
rect = self._combined_rect(nodes)

0 commit comments

Comments
 (0)