1212from NodeGraphQt .qgraphics .node_backdrop import BackdropNodeItem
1313from NodeGraphQt .qgraphics .pipe import Pipe
1414from NodeGraphQt .qgraphics .port import PortItem
15+ from NodeGraphQt .qgraphics .slicer import SlicerPipe
1516from NodeGraphQt .widgets .scene import NodeScene
1617from NodeGraphQt .widgets .stylesheet import STYLE_QMENU
1718from NodeGraphQt .widgets .tab_search import TabSearchWidget
@@ -30,6 +31,7 @@ class NodeViewer(QtWidgets.QGraphicsView):
3031
3132 moved_nodes = QtCore .Signal (dict )
3233 search_triggered = QtCore .Signal (str , tuple )
34+ connection_sliced = QtCore .Signal (list )
3335 connection_changed = QtCore .Signal (list , list )
3436
3537 # pass through signals
@@ -63,6 +65,10 @@ def __init__(self, parent=None):
6365 self ._rubber_band = QtWidgets .QRubberBand (
6466 QtWidgets .QRubberBand .Rectangle , self
6567 )
68+ self ._pipe_slicer = SlicerPipe ()
69+ self ._pipe_slicer .setVisible (False )
70+ self .scene ().addItem (self ._pipe_slicer )
71+
6672 self ._undo_stack = QtWidgets .QUndoStack (self )
6773 self ._context_menu = QtWidgets .QMenu ('main' , self )
6874 self ._context_menu .setStyleSheet (STYLE_QMENU )
@@ -126,6 +132,12 @@ def _on_search_submitted(self, node_type):
126132 pos = self .mapToScene (self ._previous_pos )
127133 self .search_triggered .emit (node_type , (pos .x (), pos .y ()))
128134
135+ def _on_pipes_sliced (self , path ):
136+ self .connection_sliced .emit ([
137+ [i .input_port , i .output_port ]
138+ for i in self .scene ().items (path ) if isinstance (i , Pipe )
139+ ])
140+
129141 # --- reimplemented events ---
130142
131143 def resizeEvent (self , event ):
@@ -138,6 +150,7 @@ def contextMenuEvent(self, event):
138150 def mousePressEvent (self , event ):
139151 alt_modifier = event .modifiers () == QtCore .Qt .AltModifier
140152 shift_modifier = event .modifiers () == QtCore .Qt .ShiftModifier
153+
141154 if event .button () == QtCore .Qt .LeftButton :
142155 self .LMB_state = True
143156 elif event .button () == QtCore .Qt .RightButton :
@@ -152,10 +165,19 @@ def mousePressEvent(self, event):
152165 if self ._search_widget .isVisible ():
153166 self .tab_search_toggle ()
154167
168+ # cursor pos.
169+ map_pos = self .mapToScene (event .pos ())
170+
171+ # pipe slicer enabled.
172+ if event .modifiers () == (QtCore .Qt .AltModifier | QtCore .Qt .ShiftModifier ):
173+ self ._pipe_slicer .draw_path (map_pos , map_pos )
174+ self ._pipe_slicer .setVisible (True )
175+ return
176+
155177 if alt_modifier :
156178 return
157179
158- items = self ._items_near (self . mapToScene ( event . pos ()) , None , 20 , 20 )
180+ items = self ._items_near (map_pos , None , 20 , 20 )
159181 nodes = [i for i in items if isinstance (i , AbstractNodeItem )]
160182
161183 # toggle extend node selection.
@@ -188,6 +210,13 @@ def mouseReleaseEvent(self, event):
188210 elif event .button () == QtCore .Qt .MiddleButton :
189211 self .MMB_state = False
190212
213+ # hide pipe slicer.
214+ if self ._pipe_slicer .isVisible ():
215+ self ._on_pipes_sliced (self ._pipe_slicer .path ())
216+ p = QtCore .QPointF (0.0 , 0.0 )
217+ self ._pipe_slicer .draw_path (p , p )
218+ self ._pipe_slicer .setVisible (False )
219+
191220 # hide selection marquee
192221 if self ._rubber_band .isVisible ():
193222 rect = self ._rubber_band .rect ()
@@ -211,6 +240,15 @@ def mouseReleaseEvent(self, event):
211240 def mouseMoveEvent (self , event ):
212241 alt_modifier = event .modifiers () == QtCore .Qt .AltModifier
213242 shift_modifier = event .modifiers () == QtCore .Qt .ShiftModifier
243+ if event .modifiers () == (QtCore .Qt .AltModifier | QtCore .Qt .ShiftModifier ):
244+ if self .LMB_state :
245+ p1 = self ._pipe_slicer .path ().pointAtPercent (0 )
246+ p2 = self .mapToScene (self ._previous_pos )
247+ self ._pipe_slicer .draw_path (p1 , p2 )
248+ self ._previous_pos = event .pos ()
249+ super (NodeViewer , self ).mouseMoveEvent (event )
250+ return
251+
214252 if self .MMB_state and alt_modifier :
215253 pos_x = (event .x () - self ._previous_pos .x ())
216254 zoom = 0.1 if pos_x > 0 else - 0.1
@@ -296,6 +334,10 @@ def sceneMousePressEvent(self, event):
296334 event (QtWidgets.QGraphicsScenePressEvent):
297335 The event handler from the QtWidgets.QGraphicsScene
298336 """
337+ # pipe slicer enabled.
338+ if event .modifiers () == (QtCore .Qt .AltModifier | QtCore .Qt .ShiftModifier ):
339+ return
340+ # viewer pan mode.
299341 if event .modifiers () == QtCore .Qt .AltModifier :
300342 return
301343
0 commit comments