Skip to content

Commit 172024f

Browse files
authored
Merge pull request #105 from jchanvfx/property_bin_signal_cleanup
Property bin signal cleanup
2 parents b456253 + e29b428 commit 172024f

File tree

13 files changed

+156
-81
lines changed

13 files changed

+156
-81
lines changed

NodeGraphQt/__init__.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@
4141
__url__ = 'https://github.com/jchanvfx/NodeGraphQt'
4242

4343
__all__ = [
44-
'NodeGraph', 'NodeObject', 'BaseNode', 'BackdropNode', 'Port',
45-
'Menu', 'MenuCommand', 'setup_context_menu'
44+
'BackdropNode', 'BaseNode', 'Menu', 'MenuCommand', 'NodeGraph',
45+
'NodeObject', 'NodeTreeWidget', 'Port', 'PropertiesBinWidget',
46+
'constants', 'setup_context_menu'
4647
]
4748

48-
4949
try:
5050
from Qt import QtWidgets, QtGui, QtCore, QtCompat
5151
except ImportError as ie:
@@ -61,3 +61,7 @@
6161

6262
# functions
6363
from .base.actions import setup_context_menu
64+
65+
# widgets
66+
from .widgets.node_tree import NodeTreeWidget
67+
from .widgets.properties_bin import PropertiesBinWidget

NodeGraphQt/base/commands.py

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,29 +50,21 @@ def set_node_prop(self, name, value):
5050
name = 'xy_pos'
5151
setattr(view, name, value)
5252

53-
def update_prop_bin(self, name, value):
54-
"""
55-
updates the property bin widget.
56-
"""
57-
graph = self.node.graph
58-
prop_bin = graph.properties_bin()
59-
properties_wgt = prop_bin.prop_widget(self.node)
60-
if properties_wgt:
61-
prop_wgt = properties_wgt.get_widget(name)
62-
# check if previous value is identical to current value,
63-
# prevent signals from causing a infinite loop.
64-
if prop_wgt and prop_wgt.get_value() != value:
65-
prop_wgt.set_value(value)
66-
6753
def undo(self):
6854
if self.old_val != self.new_val:
6955
self.set_node_prop(self.name, self.old_val)
70-
self.update_prop_bin(self.name, self.old_val)
56+
57+
# emit property changed signal.
58+
graph = self.node.graph
59+
graph.property_changed.emit(self.node, self.name, self.old_val)
7160

7261
def redo(self):
7362
if self.old_val != self.new_val:
7463
self.set_node_prop(self.name, self.new_val)
75-
self.update_prop_bin(self.name, self.new_val)
64+
65+
# emit property changed signal.
66+
graph = self.node.graph
67+
graph.property_changed.emit(self.node, self.name, self.new_val)
7668

7769

7870
class NodeMovedCmd(QtWidgets.QUndoCommand):

NodeGraphQt/base/graph.py

Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,12 @@
1515
from NodeGraphQt.base.node import NodeObject
1616
from NodeGraphQt.base.port import Port
1717
from NodeGraphQt.constants import DRAG_DROP_ID
18-
from NodeGraphQt.widgets.node_tree import NodeTreeWidget
19-
from NodeGraphQt.widgets.properties_bin import PropertiesBinWidget
2018
from NodeGraphQt.widgets.viewer import NodeViewer
2119

2220

2321
class NodeGraph(QtCore.QObject):
2422
"""
2523
base node graph controller.
26-
27-
Args:
28-
tab_search_key(str): hotkey for the tab search widget (default: "tab").
2924
"""
3025

3126
#: signal for when a node has been created in the node graph.
@@ -49,9 +44,6 @@ def __init__(self, parent=None):
4944
self._node_factory = NodeFactory()
5045
self._undo_stack = QtWidgets.QUndoStack(self)
5146

52-
self._properties_bin = None
53-
self._nodes_tree = None
54-
5547
tab = QtWidgets.QAction('Search Nodes', self)
5648
tab.setShortcut('tab')
5749
tab.triggered.connect(self._toggle_tab_search)
@@ -80,9 +72,9 @@ def _toggle_tab_search(self):
8072
self._viewer.tab_search_set_nodes(self._node_factory.names)
8173
self._viewer.tab_search_toggle()
8274

83-
def _on_property_changed(self, node_id, prop_name, prop_value):
75+
def _on_property_bin_changed(self, node_id, prop_name, prop_value):
8476
"""
85-
called when a property widget has changed in the properties bin.
77+
called when a property widget has changed in a properties bin.
8678
(emits the node object, property name, property value)
8779
8880
Args:
@@ -91,8 +83,10 @@ def _on_property_changed(self, node_id, prop_name, prop_value):
9183
prop_value (object): python object.
9284
"""
9385
node = self.get_node_by_id(node_id)
94-
node.set_property(prop_name, prop_value)
95-
self.property_changed.emit(node, prop_name, prop_value)
86+
87+
# prevent signals from causing a infinite loop.
88+
if node.get_property(prop_name) != prop_value:
89+
node.set_property(prop_name, prop_value)
9690

9791
def _on_node_double_clicked(self, node_id):
9892
"""
@@ -103,9 +97,6 @@ def _on_node_double_clicked(self, node_id):
10397
node_id (str): node id emitted by the viewer.
10498
"""
10599
node = self.get_node_by_id(node_id)
106-
if self._properties_bin:
107-
self._properties_bin.add_node(node)
108-
109100
self.node_double_clicked.emit(node)
110101

111102
def _on_node_selected(self, node_id):
@@ -237,32 +228,63 @@ def scene(self):
237228
"""
238229
return self._viewer.scene()
239230

240-
def properties_bin(self):
231+
def background_color(self):
241232
"""
242-
Initializes the node properties bin widget when first called.
233+
Return the node graph background color.
243234
244235
Returns:
245-
PropBinWidget: the initialized widget.
236+
tuple: r, g ,b
237+
"""
238+
return self.scene().background_color
239+
240+
def set_background_color(self, r, g, b):
246241
"""
247-
if self._properties_bin is None:
248-
self._properties_bin = PropertiesBinWidget()
249-
# wire up widget.
250-
self._properties_bin.property_changed.connect(
251-
self._on_property_changed
252-
)
253-
return self._properties_bin
242+
Set node graph background color.
254243
255-
def nodes_tree(self):
244+
Args:
245+
r (int): red value.
246+
g (int): green value.
247+
b (int): blue value.
248+
"""
249+
self.scene().background_color = (r, g, b)
250+
251+
def grid_color(self):
256252
"""
257-
Initializes the nodes list widget when first called.
253+
Return the node graph grid color.
258254
259255
Returns:
260-
NodeTreeWidget: the initialized widget.
256+
tuple: r, g ,b
257+
"""
258+
return self.scene().grid_color
259+
260+
def set_grid_color(self, r, g, b):
261+
"""
262+
Set node graph grid color.
263+
264+
Args:
265+
r (int): red value.
266+
g (int): green value.
267+
b (int): blue value.
268+
"""
269+
self.scene().grid_color = (r, g, b)
270+
271+
def display_grid(self, display=True):
272+
"""
273+
Display node graph background grid.
274+
275+
Args:
276+
display: False to not draw the background grid.
277+
"""
278+
self.scene().grid = display
279+
280+
def add_properties_bin(self, prop_bin):
281+
"""
282+
Wire up a properties bin widget to the node graph.
283+
284+
Args:
285+
prop_bin (NodeGraphQt.PropertiesBinWidget): properties widget.
261286
"""
262-
if self._nodes_tree is None:
263-
self._nodes_tree = NodeTreeWidget()
264-
self._nodes_tree.set_node_factory(self._node_factory)
265-
return self._nodes_tree
287+
prop_bin.property_changed.connect(self._on_property_bin_changed)
266288

267289
def undo_stack(self):
268290
"""
@@ -315,12 +337,12 @@ def acyclic(self):
315337
"""
316338
return self._model.acyclic
317339

318-
def set_acyclic(self, mode=True):
340+
def set_acyclic(self, mode=False):
319341
"""
320-
Set the node graph to be acyclic or not. (default=True)
342+
Enable the node graph to be a acyclic graph. (default=False)
321343
322344
Args:
323-
mode (bool): false to disable acyclic.
345+
mode (bool): true to enable acyclic.
324346
"""
325347
self._model.acyclic = mode
326348
self._viewer.acyclic = mode

NodeGraphQt/base/node.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,16 @@ def view(self):
9191
Returns the :class:`QtWidgets.QGraphicsItem` used in the scene.
9292
9393
Returns:
94-
AbstractNodeItem: node item.
94+
NodeGraphQt.qgraphics.node_abstract.AbstractNodeItem: node item.
9595
"""
9696
return self._view
9797

9898
def set_view(self, item):
9999
"""
100-
Sets the graphic item to use for the scene.
100+
Sets the qgraphics item to use for the scene.
101101
102102
Args:
103-
item (AbstractNodeItem): node view item.
103+
item (NodeGraphQt.qgraphics.node_abstract.AbstractNodeItem): node item.
104104
"""
105105
self._view = item
106106
self._view.id = self.model.id
@@ -109,14 +109,20 @@ def set_view(self, item):
109109
@property
110110
def model(self):
111111
"""
112-
Returns the node model.
112+
Return the node model.
113113
114114
Returns:
115-
NodeModel: node model object.
115+
NodeGraphQt.base.model.NodeModel: node model object.
116116
"""
117117
return self._model
118118

119119
def set_model(self, model):
120+
"""
121+
Set the node model.
122+
123+
Args:
124+
model (NodeGraphQt.base.model.NodeModel): node model object.
125+
"""
120126
self._model = model
121127
self._model.type_ = self.type_
122128
self._model.id = self.view.id
@@ -264,6 +270,8 @@ def set_property(self, name, value):
264270
name (str): name of the property.
265271
value (object): property data.
266272
"""
273+
274+
# prevent signals from causing a infinite loop.
267275
if self.get_property(name) == value:
268276
return
269277

NodeGraphQt/base/port.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def view(self):
2828
returns the :class:`QtWidgets.QGraphicsItem` used in the scene.
2929
3030
Returns:
31-
PortItem: port item.
31+
NodeGraphQt.qgraphics.port.PortItem: port item.
3232
"""
3333
return self.__view
3434

@@ -38,7 +38,7 @@ def model(self):
3838
returns the port model.
3939
4040
Returns:
41-
PortModel: port model.
41+
NodeGraphQt.base.model.PortModel: port model.
4242
"""
4343
return self.__model
4444

NodeGraphQt/constants.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060

6161
# === NODE VIEWER ===
6262

63-
#: Node graph background color.
6463
VIEWER_BG_COLOR = (35, 35, 35)
6564
VIEWER_GRID_COLOR = (45, 45, 45)
6665
VIEWER_GRID_OVERLAY = True

NodeGraphQt/widgets/node_tree.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,21 @@ def __eq__(self, other):
1515

1616

1717
class NodeTreeWidget(QtWidgets.QTreeWidget):
18+
"""
19+
Node tree for displaying node types.
1820
19-
def __init__(self, parent=None):
21+
Args:
22+
parent (QtWidgets.QWidget): parent of the new widget.
23+
node_graph (NodeGraphQt.NodeGraph): node graph.
24+
"""
25+
26+
def __init__(self, parent=None, node_graph=None):
2027
super(NodeTreeWidget, self).__init__(parent)
2128
self.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
2229
self.setHeaderHidden(True)
2330
self._factory = None
2431
self._custom_labels = {}
32+
self._set_node_factory(node_graph._node_factory)
2533

2634
def __repr__(self):
2735
return '<{} object at {}>'.format(self.__class__.__name__, hex(id(self)))
@@ -66,7 +74,7 @@ def _build_tree(self):
6674

6775
category_item.addChild(item)
6876

69-
def set_node_factory(self, factory):
77+
def _set_node_factory(self, factory):
7078
"""
7179
Set current node factory.
7280
@@ -87,6 +95,6 @@ def set_category_label(self, category, label):
8795

8896
def update(self):
8997
"""
90-
Update and refresh the node list widget.
98+
Update and refresh the node tree widget.
9199
"""
92100
self._build_tree()

NodeGraphQt/widgets/properties.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ class NodePropWidget(QtWidgets.QWidget):
330330
Node properties widget for display a Node object.
331331
332332
Args:
333-
parent:
333+
parent (QtWidgets.QWidget): parent object.
334334
node (NodeGraphQt.BaseNode): node.
335335
"""
336336

0 commit comments

Comments
 (0)