@@ -165,54 +165,73 @@ class NodeAddedCmd(QtWidgets.QUndoCommand):
165165 graph (NodeGraphQt.NodeGraph): node graph.
166166 node (NodeGraphQt.NodeObject): node.
167167 pos (tuple(float, float)): initial node position (optional).
168+ emit_signal (bool): emit node creation signals. (default: True)
168169 """
169170
170- def __init__ (self , graph , node , pos = None ):
171+ def __init__ (self , graph , node , pos = None , emit_signal = True ):
171172 QtWidgets .QUndoCommand .__init__ (self )
172173 self .setText ('added node' )
173- self .viewer = graph .viewer ()
174- self .model = graph .model
174+ self .graph = graph
175175 self .node = node
176176 self .pos = pos
177+ self .emit_signal = emit_signal
177178
178179 def undo (self ):
180+ node_id = self .node .id
179181 self .pos = self .pos or self .node .pos ()
180- self .model .nodes .pop (self .node .id )
182+ self .graph . model .nodes .pop (self .node .id )
181183 self .node .view .delete ()
182184
185+ if self .emit_signal :
186+ self .graph .nodes_deleted .emit ([node_id ])
187+
183188 def redo (self ):
184- self .model .nodes [self .node .id ] = self .node
185- self .viewer .add_node (self .node .view , self .pos )
189+ self .graph . model .nodes [self .node .id ] = self .node
190+ self .graph . viewer () .add_node (self .node .view , self .pos )
186191
187192 # node width & height is calculated when it's added to the scene,
188193 # so we have to update the node model here.
189194 self .node .model .width = self .node .view .width
190195 self .node .model .height = self .node .view .height
191196
197+ if self .emit_signal :
198+ self .graph .node_created .emit (self .node )
199+
192200
193- class NodeRemovedCmd (QtWidgets .QUndoCommand ):
201+ class NodesRemovedCmd (QtWidgets .QUndoCommand ):
194202 """
195203 Node deleted command.
196204
197205 Args:
198206 graph (NodeGraphQt.NodeGraph): node graph.
199- node (NodeGraphQt.BaseNode or NodeGraphQt.NodeObject): node.
207+ nodes (list[NodeGraphQt.BaseNode or NodeGraphQt.NodeObject]): nodes.
208+ emit_signal (bool): emit node deletion signals. (default: True)
200209 """
201210
202- def __init__ (self , graph , node ):
211+ def __init__ (self , graph , nodes , emit_signal = True ):
203212 QtWidgets .QUndoCommand .__init__ (self )
204- self .setText ('deleted node' )
205- self .scene = graph . scene ()
206- self .model = graph . model
207- self .node = node
213+ self .setText ('deleted node(s) ' )
214+ self .graph = graph
215+ self .nodes = nodes
216+ self .emit_signal = emit_signal
208217
209218 def undo (self ):
210- self .model .nodes [self .node .id ] = self .node
211- self .scene .addItem (self .node .view )
219+ for node in self .nodes :
220+ self .graph .model .nodes [node .id ] = node
221+ self .graph .scene ().addItem (node .view )
222+
223+ if self .emit_signal :
224+ self .graph .node_created .emit (node )
212225
213226 def redo (self ):
214- self .model .nodes .pop (self .node .id )
215- self .node .view .delete ()
227+ node_ids = []
228+ for node in self .nodes :
229+ node_ids .append (node .id )
230+ self .graph .model .nodes .pop (node .id )
231+ node .view .delete ()
232+
233+ if self .emit_signal :
234+ self .graph .nodes_deleted .emit (node_ids )
216235
217236
218237class NodeInputConnectedCmd (QtWidgets .QUndoCommand ):
@@ -276,12 +295,14 @@ class PortConnectedCmd(QtWidgets.QUndoCommand):
276295 Args:
277296 src_port (NodeGraphQt.Port): source port.
278297 trg_port (NodeGraphQt.Port): target port.
298+ emit_signal (bool): emit port connection signals.
279299 """
280300
281- def __init__ (self , src_port , trg_port ):
301+ def __init__ (self , src_port , trg_port , emit_signal ):
282302 QtWidgets .QUndoCommand .__init__ (self )
283303 self .source = src_port
284304 self .target = trg_port
305+ self .emit_signal = emit_signal
285306
286307 def undo (self ):
287308 src_model = self .source .model
@@ -303,6 +324,13 @@ def undo(self):
303324
304325 self .source .view .disconnect_from (self .target .view )
305326
327+ # emit "port_disconnected" signal from the parent graph.
328+ if self .emit_signal :
329+ ports = {p .type_ (): p for p in [self .source , self .target ]}
330+ graph = self .source .node ().graph
331+ graph .port_disconnected .emit (ports [PortTypeEnum .IN .value ],
332+ ports [PortTypeEnum .OUT .value ])
333+
306334 def redo (self ):
307335 src_model = self .source .model
308336 trg_model = self .target .model
@@ -314,6 +342,13 @@ def redo(self):
314342
315343 self .source .view .connect_to (self .target .view )
316344
345+ # emit "port_connected" signal from the parent graph.
346+ if self .emit_signal :
347+ ports = {p .type_ (): p for p in [self .source , self .target ]}
348+ graph = self .source .node ().graph
349+ graph .port_connected .emit (ports [PortTypeEnum .IN .value ],
350+ ports [PortTypeEnum .OUT .value ])
351+
317352
318353class PortDisconnectedCmd (QtWidgets .QUndoCommand ):
319354 """
@@ -322,12 +357,14 @@ class PortDisconnectedCmd(QtWidgets.QUndoCommand):
322357 Args:
323358 src_port (NodeGraphQt.Port): source port.
324359 trg_port (NodeGraphQt.Port): target port.
360+ emit_signal (bool): emit port connection signals.
325361 """
326362
327- def __init__ (self , src_port , trg_port ):
363+ def __init__ (self , src_port , trg_port , emit_signal ):
328364 QtWidgets .QUndoCommand .__init__ (self )
329365 self .source = src_port
330366 self .target = trg_port
367+ self .emit_signal = emit_signal
331368
332369 def undo (self ):
333370 src_model = self .source .model
@@ -340,6 +377,13 @@ def undo(self):
340377
341378 self .source .view .connect_to (self .target .view )
342379
380+ # emit "port_connected" signal from the parent graph.
381+ if self .emit_signal :
382+ ports = {p .type_ (): p for p in [self .source , self .target ]}
383+ graph = self .source .node ().graph
384+ graph .port_connected .emit (ports [PortTypeEnum .IN .value ],
385+ ports [PortTypeEnum .OUT .value ])
386+
343387 def redo (self ):
344388 src_model = self .source .model
345389 trg_model = self .target .model
@@ -360,6 +404,13 @@ def redo(self):
360404
361405 self .source .view .disconnect_from (self .target .view )
362406
407+ # emit "port_disconnected" signal from the parent graph.
408+ if self .emit_signal :
409+ ports = {p .type_ (): p for p in [self .source , self .target ]}
410+ graph = self .source .node ().graph
411+ graph .port_disconnected .emit (ports [PortTypeEnum .IN .value ],
412+ ports [PortTypeEnum .OUT .value ])
413+
363414
364415class PortLockedCmd (QtWidgets .QUndoCommand ):
365416 """
0 commit comments