55
66from NodeGraphQt import QtGui , QtCore , QtWidgets
77from NodeGraphQt .constants import (IN_PORT , OUT_PORT ,
8- PIPE_LAYOUT_CURVED ,
9- SCENE_AREA )
8+ PIPE_LAYOUT_CURVED )
109from NodeGraphQt .qgraphics .node_abstract import AbstractNodeItem
1110from NodeGraphQt .qgraphics .node_backdrop import BackdropNodeItem
1211from 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