Skip to content

Commit ec2a602

Browse files
authored
Merge pull request #157 from ArnoChenFx/master
Dynamiclly change the combobox widget menu
2 parents 1400b56 + 62a4af3 commit ec2a602

File tree

9 files changed

+82
-33
lines changed

9 files changed

+82
-33
lines changed

NodeGraphQt/base/graph.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,7 @@ def add_node(self, node, pos=None):
774774
node_attrs[node.type_][pname].update(pattrs)
775775
self.model.set_node_common_properties(node_attrs)
776776

777-
node._graph = self
777+
node.set_graph(self)
778778
node.NODE_NAME = self.get_unique_name(node.NODE_NAME)
779779
node.model._graph_model = self.model
780780
node.model.name = node.NODE_NAME
@@ -1006,6 +1006,7 @@ def _deserialize(self, data, relative_pos=False, pos=None):
10061006

10071007
nodes[n_id] = node
10081008
self.add_node(node, n_data.get('pos'))
1009+
node.set_graph(self)
10091010

10101011
# build the connections.
10111012
for connection in data.get('connections', []):

NodeGraphQt/base/model.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ def __init__(self):
9292
}
9393

9494
def add_property(self, name, value, items=None, range=None,
95-
widget_type=NODE_PROP, tab='Properties', ext=None):
95+
widget_type=NODE_PROP, tab='Properties',
96+
ext=None, funcs=None):
9697
"""
9798
add custom property.
9899
@@ -104,6 +105,7 @@ def add_property(self, name, value, items=None, range=None,
104105
widget_type (int): widget type flag.
105106
tab (str): widget tab name.
106107
ext (str) file ext for NODE_PROP_FILE
108+
funcs (list) functions for NODE_PROP_BUTTON
107109
"""
108110
tab = tab or 'Properties'
109111

@@ -125,6 +127,8 @@ def add_property(self, name, value, items=None, range=None,
125127
self._TEMP_property_attrs[name]['range'] = range
126128
if ext:
127129
self._TEMP_property_attrs[name]['ext'] = ext
130+
if funcs:
131+
self._TEMP_property_attrs[name]['funcs'] = funcs
128132
else:
129133
attrs = {self.type_: {name: {
130134
'widget_type': widget_type,
@@ -136,6 +140,8 @@ def add_property(self, name, value, items=None, range=None,
136140
attrs[self.type_][name]['range'] = range
137141
if ext:
138142
attrs[self.type_][name]['ext'] = ext
143+
if funcs:
144+
attrs[self.type_][name]['funcs'] = funcs
139145
self._graph_model.set_node_common_properties(attrs)
140146

141147
def set_property(self, name, value):
@@ -144,7 +150,8 @@ def set_property(self, name, value):
144150
elif name in self._custom_prop.keys():
145151
self._custom_prop[name] = value
146152
else:
147-
raise NodePropertyError('No property "{}"'.format(name))
153+
self._custom_prop[name] = value
154+
# raise NodePropertyError('No property "{}"'.format(name))
148155

149156
def get_property(self, name):
150157
if name in self.properties.keys():
@@ -248,6 +255,7 @@ def to_dict(self):
248255
json.dumps(v)
249256
except:
250257
to_remove.append(k)
258+
251259
[custom_props.pop(k) for k in to_remove]
252260

253261
node_dict['custom'] = custom_props

NodeGraphQt/base/node.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ def set_selected(self, selected=True):
237237
self.set_property('selected', selected)
238238

239239
def create_property(self, name, value, items=None, range=None,
240-
widget_type=NODE_PROP, tab=None, ext=None):
240+
widget_type=NODE_PROP, tab=None, ext=None,
241+
funcs=None):
241242
"""
242243
Creates a custom property to the node.
243244
@@ -269,8 +270,9 @@ def create_property(self, name, value, items=None, range=None,
269270
widget_type (int): widget flag to display in the ``PropertiesBinWidget``
270271
tab (str): name of the widget tab to display in the properties bin.
271272
ext (str): file ext of ``NODE_PROP_FILE``
273+
funcs (list) list of functions for NODE_PROP_BUTTON
272274
"""
273-
self.model.add_property(name, value, items, range, widget_type, tab, ext)
275+
self.model.add_property(name, value, items, range, widget_type, tab, ext, funcs)
274276

275277
def properties(self):
276278
"""
@@ -567,11 +569,8 @@ def add_file_input(self, name, label='', text='', tab=None, ext="*"):
567569
tab (str): name of the widget tab to display in.
568570
ext (str): file ext
569571
"""
570-
self.model.add_property(name, text, None, None, NODE_PROP_FILE, tab, ext)
571-
# use create_property will cause strange error
572-
# self.create_property(
573-
# name, text, widget_type=NODE_PROP_FILE, tab=tab, ext=None)
574-
572+
self.create_property(
573+
name, text, widget_type=NODE_PROP_FILE, tab=tab, ext=ext)
575574
widget = NodeFilePath(self.view, name, label, text, ext)
576575
widget.value_changed.connect(lambda k, v: self.set_property(k, v))
577576
self.view.add_widget(widget)
@@ -705,6 +704,21 @@ def add_output(self, name='output', multi_output=True, display_name=True,
705704
self.model.outputs[port.name()] = port.model
706705
return port
707706

707+
def update_combo_menu(self, name, items):
708+
if not self.has_property(name):
709+
return
710+
old_value = self.get_property(name)
711+
self.set_property(name, items)
712+
_name = '_'+name+"_"
713+
if not self.has_property(_name):
714+
self.create_property(_name, items)
715+
else:
716+
self.set_property(_name, items)
717+
if old_value in items:
718+
self.set_property(name, old_value)
719+
else:
720+
self.set_property(name, items[0])
721+
708722
def inputs(self):
709723
"""
710724
Returns all the input ports from the node.

NodeGraphQt/qgraphics/node_base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,9 @@ def get_widget(self, name):
691691
return widget
692692
raise NodeWidgetError('node has no widget "{}"'.format(name))
693693

694+
def has_widget(self, name):
695+
return name in self._widgets.keys()
696+
694697
def delete(self):
695698
for port, text in self._input_items.items():
696699
port.delete()

NodeGraphQt/widgets/actions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ def get_menu(self, name, node_id=None):
2727
return menu
2828
if node_id and menu.node_class:
2929
node = menu.graph.get_node_by_id(node_id)
30-
if isinstance(node,menu.node_class):
30+
if isinstance(node, menu.node_class):
3131
return menu
3232

3333
def get_menus(self, node_class):
3434
menus = []
3535
for action in self.actions():
3636
menu = action.menu()
3737
if menu.node_class:
38-
if issubclass(menu.node_class,node_class):
38+
if issubclass(menu.node_class, node_class):
3939
menus.append(menu)
4040
return menus
4141

NodeGraphQt/widgets/node_widgets.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ def value(self):
192192

193193
@value.setter
194194
def value(self, text=''):
195+
if type(text) is list:
196+
self._combo.clear()
197+
self._combo.addItems(text)
198+
return
195199
if text != self.value:
196200
index = self._combo.findText(text, QtCore.Qt.MatchExactly)
197201
self._combo.setCurrentIndex(index)

NodeGraphQt/widgets/properties.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,9 @@ def get_value(self):
245245
return self.currentText()
246246

247247
def set_value(self, value):
248+
if type(value) is list:
249+
self.set_items(value)
250+
return
248251
if value != self.get_value():
249252
idx = self.findText(value, QtCore.Qt.MatchExactly)
250253
self.setCurrentIndex(idx)
@@ -676,10 +679,12 @@ class PropButton(QtWidgets.QPushButton):
676679
def __init__(self, parent=None):
677680
super(PropButton, self).__init__(parent)
678681

679-
def set_value(self, value):
682+
def set_value(self, value, node=None):
680683
# value: list of functions
684+
if type(value) is not list:
685+
return
681686
for func in value:
682-
self.clicked.connect(func)
687+
self.clicked.connect(lambda: func(node))
683688

684689
def get_value(self):
685690
return None
@@ -869,13 +874,19 @@ def _read_node(self, node):
869874
widget.setMinimumHeight(min_widget_height)
870875
if prop_name in common_props.keys():
871876
if 'items' in common_props[prop_name].keys():
872-
widget.set_items(common_props[prop_name]['items'])
877+
_prop_name = '_' + prop_name + "_"
878+
if node.has_property(_prop_name):
879+
widget.set_items(node.get_property(_prop_name))
880+
else:
881+
widget.set_items(common_props[prop_name]['items'])
873882
if 'range' in common_props[prop_name].keys():
874883
prop_range = common_props[prop_name]['range']
875884
widget.set_min(prop_range[0])
876885
widget.set_max(prop_range[1])
877886
if 'ext' in common_props[prop_name].keys():
878887
widget.set_ext(common_props[prop_name]['ext'])
888+
if 'funcs' in common_props[prop_name].keys():
889+
widget.set_value(common_props[prop_name]['funcs'], node)
879890

880891
prop_window.add_widget(prop_name, widget, value,
881892
prop_name.replace('_', ' '))

NodeGraphQt/widgets/viewer.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def _set_viewer_zoom(self, value, sensitivity=None, pos=None):
131131
self.scale(scale, scale, pos)
132132

133133
def _set_viewer_pan(self, pos_x, pos_y):
134-
speed = self._scene_range.width() * 0.002
134+
speed = self._scene_range.width() * 0.0015
135135
x = -pos_x * speed
136136
y = -pos_y * speed
137137
self._scene_range.adjust(x, y, x, y)
@@ -201,7 +201,7 @@ def contextMenuEvent(self, event):
201201
nodes = [i for i in items if isinstance(i, AbstractNodeItem)]
202202
if nodes:
203203
node = nodes[0]
204-
ctx_menu = self._ctx_node_menu.get_menu(node.type_,node.id)
204+
ctx_menu = self._ctx_node_menu.get_menu(node.type_, node.id)
205205
if ctx_menu:
206206
for action in ctx_menu.actions():
207207
if not action.menu():
@@ -277,10 +277,11 @@ def mousePressEvent(self, event):
277277
self._rubber_band.show()
278278

279279
# allow new live pipe with the shift modifier.
280-
if self.LMB_state:
281-
if (not self.SHIFT_state and not self.CTRL_state) or\
282-
(self.SHIFT_state and pipes):
283-
super(NodeViewer, self).mousePressEvent(event)
280+
# if self.LMB_state:
281+
# if (not self.SHIFT_state and not self.CTRL_state) or\
282+
# (self.SHIFT_state and pipes):
283+
if not self._LIVE_PIPE.isVisible():
284+
super(NodeViewer, self).mousePressEvent(event)
284285

285286
def mouseReleaseEvent(self, event):
286287
if event.button() == QtCore.Qt.LeftButton:
@@ -397,7 +398,7 @@ def wheelEvent(self, event):
397398
if delta == 0:
398399
delta = event.angleDelta().x()
399400

400-
self._set_viewer_zoom(delta, pos = event.pos())
401+
self._set_viewer_zoom(delta, pos=event.pos())
401402

402403
def dropEvent(self, event):
403404
pos = self.mapToScene(event.pos())

example_auto_nodes/node_base/auto_node.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def get(self, text, Min=50, Max=200):
2525
return self.colors[text]
2626

2727

28-
class AutoNode(BaseNode,QtCore.QObject):
28+
class AutoNode(BaseNode, QtCore.QObject):
2929
cooked = QtCore.Signal()
3030

3131
def __init__(self, defaultInputType=None, defaultOutputType=None):
@@ -75,17 +75,20 @@ def cookTime(self, time):
7575
def cookNextNode(self):
7676
for nodeList in self.connected_output_nodes().values():
7777
for n in nodeList:
78-
n.cook()
78+
if n is not self:
79+
n.cook()
7980

8081
def getData(self, port):
8182
# for custom output data
8283
return self.get_property(port.name())
8384

8485
def getInputData(self, port):
85-
# get input data by input Port,the type of "port" can be :
86-
# int : Port index
87-
# str : Port name
88-
# Port : Port object
86+
"""
87+
get input data by input Port,the type of "port" can be :
88+
int : Port index
89+
str : Port name
90+
Port : Port object
91+
"""
8992

9093
if type(port) is int:
9194
to_port = self.input(port)
@@ -128,7 +131,7 @@ def cook(self, forceCook=False):
128131
try:
129132
self.run()
130133
except Exception as error:
131-
self.error(error)
134+
self.error(error)
132135

133136
self._autoCook = _tmp
134137

@@ -202,8 +205,8 @@ def set_port_type(self, port, value_type):
202205
current_port.view.setToolTip('{}: {} ({}) '.format(current_port.name(), data_type_name, conn_type))
203206

204207
def create_property(self, name, value, items=None, range=None,
205-
widget_type=NODE_PROP, tab=None):
206-
super(AutoNode, self).create_property(name, value, items, range, widget_type, tab)
208+
widget_type=NODE_PROP, tab=None, ext=None, funcs=None):
209+
super(AutoNode, self).create_property(name, value, items, range, widget_type, tab, ext, funcs)
207210

208211
if value is not None:
209212
self.set_port_type(name, type(value))
@@ -235,7 +238,6 @@ def set_disabled(self, mode=False):
235238
else:
236239
self.cook()
237240

238-
239241
def _close_error(self):
240242
self._error = False
241243
self.set_property('color', self.defaultColor)
@@ -250,7 +252,7 @@ def _show_error(self, message):
250252
tooltip = '<font color="red"><br>({})</br></font>'.format(message)
251253
self._update_tool_tip(tooltip)
252254

253-
def _update_tool_tip(self, message = None):
255+
def _update_tool_tip(self, message=None):
254256
if message is None:
255257
tooltip = self._toolTip.format(self._cookTime)
256258
else:
@@ -269,3 +271,8 @@ def error(self, message=None):
269271
return self._error
270272

271273
self._show_error(message)
274+
275+
def update_model(self):
276+
if self.error():
277+
self.set_property('color', self.defaultColor)
278+
super(AutoNode, self).update_model()

0 commit comments

Comments
 (0)