Skip to content

Commit eeea4dd

Browse files
committed
refactored property bin signals.
1 parent b456253 commit eeea4dd

File tree

8 files changed

+79
-52
lines changed

8 files changed

+79
-52
lines changed

NodeGraphQt/__init__.py

Lines changed: 6 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', 'Port', 'PropertiesBinWidget', 'constants',
46+
'setup_context_menu'
4647
]
4748

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

6262
# functions
6363
from .base.actions import setup_context_menu
64+
65+
# widgets
66+
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: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,12 @@
1616
from NodeGraphQt.base.port import Port
1717
from NodeGraphQt.constants import DRAG_DROP_ID
1818
from NodeGraphQt.widgets.node_tree import NodeTreeWidget
19-
from NodeGraphQt.widgets.properties_bin import PropertiesBinWidget
2019
from NodeGraphQt.widgets.viewer import NodeViewer
2120

2221

2322
class NodeGraph(QtCore.QObject):
2423
"""
2524
base node graph controller.
26-
27-
Args:
28-
tab_search_key(str): hotkey for the tab search widget (default: "tab").
2925
"""
3026

3127
#: signal for when a node has been created in the node graph.
@@ -49,7 +45,6 @@ def __init__(self, parent=None):
4945
self._node_factory = NodeFactory()
5046
self._undo_stack = QtWidgets.QUndoStack(self)
5147

52-
self._properties_bin = None
5348
self._nodes_tree = None
5449

5550
tab = QtWidgets.QAction('Search Nodes', self)
@@ -80,9 +75,9 @@ def _toggle_tab_search(self):
8075
self._viewer.tab_search_set_nodes(self._node_factory.names)
8176
self._viewer.tab_search_toggle()
8277

83-
def _on_property_changed(self, node_id, prop_name, prop_value):
78+
def _on_property_bin_changed(self, node_id, prop_name, prop_value):
8479
"""
85-
called when a property widget has changed in the properties bin.
80+
called when a property widget has changed in a properties bin.
8681
(emits the node object, property name, property value)
8782
8883
Args:
@@ -91,8 +86,10 @@ def _on_property_changed(self, node_id, prop_name, prop_value):
9186
prop_value (object): python object.
9287
"""
9388
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)
89+
90+
# prevent signals from causing a infinite loop.
91+
if node.get_property(prop_name) != prop_value:
92+
node.set_property(prop_name, prop_value)
9693

9794
def _on_node_double_clicked(self, node_id):
9895
"""
@@ -103,9 +100,6 @@ def _on_node_double_clicked(self, node_id):
103100
node_id (str): node id emitted by the viewer.
104101
"""
105102
node = self.get_node_by_id(node_id)
106-
if self._properties_bin:
107-
self._properties_bin.add_node(node)
108-
109103
self.node_double_clicked.emit(node)
110104

111105
def _on_node_selected(self, node_id):
@@ -237,20 +231,14 @@ def scene(self):
237231
"""
238232
return self._viewer.scene()
239233

240-
def properties_bin(self):
234+
def add_properties_bin(self, prop_bin):
241235
"""
242-
Initializes the node properties bin widget when first called.
236+
Wire up a properties bin widget to the node graph.
243237
244-
Returns:
245-
PropBinWidget: the initialized widget.
246-
"""
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
238+
Args:
239+
prop_bin (NodeGraphQt.PropertiesBinWidget): properties widget.
240+
"""
241+
prop_bin.property_changed.connect(self._on_property_bin_changed)
254242

255243
def nodes_tree(self):
256244
"""

NodeGraphQt/base/node.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ def set_property(self, name, value):
264264
name (str): name of the property.
265265
value (object): property data.
266266
"""
267+
268+
# prevent signals from causing a infinite loop.
267269
if self.get_property(name) == value:
268270
return
269271

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

NodeGraphQt/widgets/properties_bin.py

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,29 @@ def __init__(self, parent=None):
5252
class PropertiesBinWidget(QtWidgets.QWidget):
5353
"""
5454
Node properties bin for displaying properties.
55+
56+
Args:
57+
parent (QtWidgets.QWidget): parent object.
58+
node_graph (NodeGraphQt.NodeGraph): node graph.
5559
"""
5660

5761
#: Signal emitted (node_id, prop_name, prop_value)
5862
property_changed = QtCore.Signal(str, str, object)
5963

60-
def __init__(self, parent=None):
64+
def __init__(self, parent=None, node_graph=None):
6165
super(PropertiesBinWidget, self).__init__(parent)
6266
self.setWindowTitle('Properties Bin')
6367
self._prop_list = PropertiesList()
6468
self._limit = QtWidgets.QSpinBox()
65-
self._limit.setToolTip('Set node limit to display.')
69+
self._limit.setToolTip('Set display nodes limit.')
6670
self._limit.setMaximum(10)
6771
self._limit.setMinimum(0)
6872
self._limit.setValue(5)
6973
self._limit.valueChanged.connect(self.__on_limit_changed)
7074
self.resize(400, 400)
7175

76+
self._block_signal = False
77+
7278
btn_clr = QtWidgets.QPushButton('clear')
7379
btn_clr.setToolTip('Clear the properties bin.')
7480
btn_clr.clicked.connect(self.clear_bin)
@@ -82,6 +88,11 @@ def __init__(self, parent=None):
8288
layout.addLayout(top_layout)
8389
layout.addWidget(self._prop_list, 1)
8490

91+
# wire up node graph.
92+
node_graph.add_properties_bin(self)
93+
node_graph.node_double_clicked.connect(self.add_node)
94+
node_graph.property_changed.connect(self.__on_graph_property_changed)
95+
8596
def __repr__(self):
8697
return '<{} object at {}>'.format(self.__class__.__name__, hex(id(self)))
8798

@@ -94,6 +105,37 @@ def __on_limit_changed(self, value):
94105
if rows > value:
95106
self._prop_list.removeRow(rows - 1)
96107

108+
def __on_graph_property_changed(self, node, prop_name, prop_value):
109+
"""
110+
Slot function that updates the property bin from the node graph signal.
111+
112+
Args:
113+
node (NodeGraphQt.NodeObject):
114+
prop_name (str):
115+
prop_value (object):
116+
"""
117+
properties_widget = self.prop_widget(node)
118+
if not properties_widget:
119+
return
120+
121+
property_window = properties_widget.get_widget(prop_name)
122+
if prop_value != property_window.get_value():
123+
self._block_signal = True
124+
property_window.set_value(prop_value)
125+
self._block_signal = False
126+
127+
def __on_property_widget_changed(self, node_id, prop_name, prop_value):
128+
"""
129+
Slot function triggered when a property widget value has changed.
130+
131+
Args:
132+
node_id (str):
133+
prop_name (str):
134+
prop_value (object):
135+
"""
136+
if not self._block_signal:
137+
self.property_changed.emit(node_id, prop_name, prop_value)
138+
97139
def limit(self):
98140
"""
99141
Returns the limit for how many nodes can be loaded into the bin.
@@ -132,7 +174,7 @@ def add_node(self, node):
132174

133175
self._prop_list.insertRow(0)
134176
prop_widget = NodePropWidget(node=node)
135-
prop_widget.property_changed.connect(self.property_changed.emit)
177+
prop_widget.property_changed.connect(self.__on_property_widget_changed)
136178
prop_widget.property_closed.connect(self.__on_prop_close)
137179
self._prop_list.setCellWidget(0, 0, prop_widget)
138180

docs/widgets.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ PropertiesBinWidget
1111
.. code-block:: python
1212
:linenos:
1313
14-
from NodeGraphQt import NodeGraph
14+
from NodeGraphQt import NodeGraph, PropertiesBinWidget
1515
1616
graph = NodeGraph()
1717
1818
# create properties bin widget.
19-
properties_bin = graph.properties_bin()
19+
properties_bin = PropertiesBinWidget(node_graph=graph)
2020
properties_bin.show()
2121
2222
----
2323

24-
.. autoclass:: NodeGraphQt.widgets.properties_bin.PropertiesBinWidget
24+
.. autoclass:: NodeGraphQt.PropertiesBinWidget
2525
:members:
2626
:exclude-members: property_changed
2727

example.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
BaseNode,
88
BackdropNode,
99
setup_context_menu)
10-
from NodeGraphQt import QtWidgets, QtCore
10+
from NodeGraphQt import QtWidgets, QtCore, PropertiesBinWidget
1111

1212
# import example nodes from the "example_nodes" package
1313
from example_nodes import basic_nodes, widget_nodes
@@ -49,7 +49,7 @@ def __init__(self):
4949

5050

5151
# show the properties bin when a node is "double clicked" in the graph.
52-
properties_bin = graph.properties_bin()
52+
properties_bin = PropertiesBinWidget(node_graph=graph)
5353
properties_bin.setWindowFlags(QtCore.Qt.Tool)
5454
def show_prop_bin(node):
5555
if not properties_bin.isVisible():

0 commit comments

Comments
 (0)