Skip to content

Commit f77d3da

Browse files
committed
garbage collect when clear undo stack
1 parent 5798d1d commit f77d3da

File tree

5 files changed

+49
-9
lines changed

5 files changed

+49
-9
lines changed

NodeGraphQt/base/commands.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/usr/bin/python
22
from .. import QtWidgets
3-
43
from ..constants import IN_PORT, OUT_PORT
4+
from .utils import minimize_node_ref_count
55

66

77
class PropertyChangedCmd(QtWidgets.QUndoCommand):
@@ -177,6 +177,9 @@ def redo(self):
177177
self.model.nodes.pop(self.node.id)
178178
self.node.delete()
179179

180+
def __del__(self):
181+
minimize_node_ref_count(self.node)
182+
180183

181184
class NodeInputConnectedCmd(QtWidgets.QUndoCommand):
182185
"""

NodeGraphQt/base/graph.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import os
55
import re
66
import copy
7-
7+
import gc
88
from .. import QtCore, QtWidgets, QtGui
99
from .commands import (NodeAddedCmd,
1010
NodeRemovedCmd,
@@ -541,6 +541,7 @@ def clear_undo_stack(self):
541541
:meth:`NodeGraph.undo_stack()`
542542
"""
543543
self._undo_stack.clear()
544+
gc.collect()
544545

545546
def begin_undo(self, name):
546547
"""
@@ -1095,7 +1096,7 @@ def clear_session(self):
10951096
continue
10961097
self._undo_stack.push(NodeRemovedCmd(self, n))
10971098
self.set_node_space(root_node)
1098-
self._undo_stack.clear()
1099+
self.clear_undo_stack()
10991100
self._model.session = None
11001101
self.session_changed.emit("")
11011102

@@ -1251,7 +1252,7 @@ def deserialize_session(self, layout_data):
12511252
"""
12521253
self.clear_session()
12531254
self._deserialize(layout_data)
1254-
self._undo_stack.clear()
1255+
self.clear_undo_stack()
12551256

12561257
def save_session(self, file_path):
12571258
"""
@@ -1326,7 +1327,7 @@ def import_session(self, file_path):
13261327
self.set_grid_mode(layout_data['graph'].get('grid_mode', VIEWER_GRID_LINES))
13271328

13281329
self.set_node_space(self.root_node())
1329-
self._undo_stack.clear()
1330+
self.clear_undo_stack()
13301331
self._model.session = file_path
13311332
self.session_changed.emit(file_path)
13321333
self._auto_update = _temp_auto_update

NodeGraphQt/base/node.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ def delete(self):
462462
self._view.delete()
463463
if self._parent is not None:
464464
self._parent.remove_child(self)
465-
# self.set_parent(None)
465+
self._parent = None
466466

467467
def hide(self):
468468
"""
@@ -884,7 +884,6 @@ def delete_input(self, port):
884884
self._inputs.remove(port)
885885
self._model.inputs.pop(port.name())
886886
self._view.delete_input(port.view)
887-
del port
888887
self.draw()
889888

890889
def delete_output(self, port):
@@ -901,7 +900,6 @@ def delete_output(self, port):
901900
self._outputs.remove(port)
902901
self._model.outputs.pop(port.name())
903902
self._view.delete_output(port.view)
904-
del port
905903
self.draw()
906904

907905
def set_ports(self, port_data):

NodeGraphQt/base/utils.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ def _clear_undo(graph):
214214
viewer = graph.viewer()
215215
msg = 'Clear all undo history, Are you sure?'
216216
if viewer.question_dialog('Clear Undo History', msg):
217-
graph.undo_stack().clear()
217+
graph.clear_undo_stack()
218218

219219

220220
def _copy_nodes(graph):
@@ -748,3 +748,36 @@ def auto_layout_down(start_nodes=[], all_nodes=[]):
748748
current_y += dy * 0.5 + 10
749749

750750
current_x += max_width * 0.5 + 100
751+
752+
753+
# garbage collect
754+
755+
def minimize_node_ref_count(node):
756+
"""
757+
Minimize node reference count for garbage collect.
758+
759+
Args:
760+
node (NodeGraphQt.NodeObject): node.
761+
"""
762+
if node.graph is None or node.id not in node.graph.model.nodes:
763+
if hasattr(node, 'deleted'):
764+
del node
765+
return
766+
from .node import BaseNode, SubGraph
767+
node._parent = None
768+
if isinstance(node, BaseNode):
769+
[wid.deleteLater() for wid in node.view._widgets.values()]
770+
node.view._widgets.clear()
771+
for port in node._inputs:
772+
port.model.node = None
773+
for port in node._outputs:
774+
port.model.node = None
775+
776+
if isinstance(node, SubGraph):
777+
node._children.clear()
778+
node.sub_graph_input_nodes.clear()
779+
node.sub_graph_output_nodes.clear()
780+
if isinstance(node, QtCore.QObject):
781+
node.deleteLater()
782+
node.deleted = True
783+
del node

example_auto_nodes/node_base/auto_node.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,4 +365,9 @@ def error(self, message=None):
365365
return self._error
366366
self._show_error(message)
367367

368+
# def __del__(self):
369+
# """
370+
# Check gc.
371+
# """
372+
# print("Delete: ", self.name())
368373

0 commit comments

Comments
 (0)