Skip to content

Commit 78e3a08

Browse files
committed
emit node deletion signals from undo #373
1 parent b1c2914 commit 78e3a08

File tree

2 files changed

+35
-22
lines changed

2 files changed

+35
-22
lines changed

NodeGraphQt/base/commands.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -198,29 +198,40 @@ def redo(self):
198198
self.graph.node_created.emit(self.node)
199199

200200

201-
class NodeRemovedCmd(QtWidgets.QUndoCommand):
201+
class NodesRemovedCmd(QtWidgets.QUndoCommand):
202202
"""
203203
Node deleted command.
204204
205205
Args:
206206
graph (NodeGraphQt.NodeGraph): node graph.
207-
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)
208209
"""
209210

210-
def __init__(self, graph, node):
211+
def __init__(self, graph, nodes, emit_signal=True):
211212
QtWidgets.QUndoCommand.__init__(self)
212-
self.setText('deleted node')
213-
self.scene = graph.scene()
214-
self.model = graph.model
215-
self.node = node
213+
self.setText('deleted node(s)')
214+
self.graph = graph
215+
self.nodes = nodes
216+
self.emit_signal = emit_signal
216217

217218
def undo(self):
218-
self.model.nodes[self.node.id] = self.node
219-
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)
220225

221226
def redo(self):
222-
self.model.nodes.pop(self.node.id)
223-
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)
224235

225236

226237
class NodeInputConnectedCmd(QtWidgets.QUndoCommand):

NodeGraphQt/base/graph.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from Qt import QtCore, QtWidgets
99

1010
from NodeGraphQt.base.commands import (NodeAddedCmd,
11-
NodeRemovedCmd,
11+
NodesRemovedCmd,
1212
NodeMovedCmd,
1313
PortConnectedCmd)
1414
from NodeGraphQt.base.factory import NodeFactory
@@ -1385,13 +1385,12 @@ def delete_node(self, node, push_undo=True):
13851385
if isinstance(node, GroupNode) and node.is_expanded:
13861386
node.collapse()
13871387

1388+
undo_cmd = NodesRemovedCmd(self, [node], emit_signal=True)
13881389
if push_undo:
1389-
self._undo_stack.push(NodeRemovedCmd(self, node))
1390+
self._undo_stack.push(undo_cmd)
13901391
self._undo_stack.endMacro()
13911392
else:
1392-
NodeRemovedCmd(self, node).redo()
1393-
1394-
self.nodes_deleted.emit([node_id])
1393+
undo_cmd.redo()
13951394

13961395
def remove_node(self, node, push_undo=True):
13971396
"""
@@ -1428,11 +1427,12 @@ def remove_node(self, node, push_undo=True):
14281427
push_undo=push_undo)
14291428
p.clear_connections(push_undo=push_undo)
14301429

1430+
undo_cmd = NodesRemovedCmd(self, [node], emit_signal=False)
14311431
if push_undo:
1432-
self._undo_stack.push(NodeRemovedCmd(self, node))
1432+
self._undo_stack.push(undo_cmd)
14331433
self._undo_stack.endMacro()
14341434
else:
1435-
NodeRemovedCmd(self, node).redo()
1435+
undo_cmd.redo()
14361436

14371437
def delete_nodes(self, nodes, push_undo=True):
14381438
"""
@@ -1471,12 +1471,14 @@ def delete_nodes(self, nodes, push_undo=True):
14711471
connected_ports=False,
14721472
push_undo=push_undo)
14731473
p.clear_connections(push_undo=push_undo)
1474-
if push_undo:
1475-
self._undo_stack.push(NodeRemovedCmd(self, node))
1476-
else:
1477-
NodeRemovedCmd(self, node).redo()
1474+
1475+
undo_cmd = NodesRemovedCmd(self, nodes, emit_signal=True)
14781476
if push_undo:
1477+
self._undo_stack.push(undo_cmd)
14791478
self._undo_stack.endMacro()
1479+
else:
1480+
undo_cmd.redo()
1481+
14801482
self.nodes_deleted.emit(node_ids)
14811483

14821484
def extract_nodes(self, nodes, push_undo=True, prompt_warning=True):

0 commit comments

Comments
 (0)