Skip to content

Commit 90eca1e

Browse files
authored
Merge pull request #155 from ArnoChenFx/master
Some fix
2 parents c1ae2ac + de111f6 commit 90eca1e

File tree

8 files changed

+115
-45
lines changed

8 files changed

+115
-45
lines changed

NodeGraphQt/base/graph.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import re
66
import copy
77

8-
from NodeGraphQt import QtCore, QtWidgets
8+
from NodeGraphQt import QtCore, QtWidgets, QtGui
99
from NodeGraphQt.base.commands import (NodeAddedCmd,
1010
NodeRemovedCmd,
1111
NodeMovedCmd,
@@ -105,10 +105,9 @@ def __init__(self, parent=None):
105105
self._node_factory = NodeFactory()
106106
self._undo_stack = QtWidgets.QUndoStack(self)
107107

108-
tab = QtWidgets.QAction('Search Nodes', self)
109-
tab.setShortcut('tab')
110-
tab.triggered.connect(self._toggle_tab_search)
111-
self._viewer.addAction(tab)
108+
tab = QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Tab), self._viewer)
109+
tab.activated.connect(self._toggle_tab_search)
110+
self._viewer.need_show_tab_search.connect(self._toggle_tab_search)
112111

113112
self._wire_signals()
114113

@@ -164,8 +163,9 @@ def _toggle_tab_search(self):
164163
"""
165164
toggle the tab search widget.
166165
"""
167-
self._viewer.tab_search_set_nodes(self._node_factory.names)
168-
self._viewer.tab_search_toggle()
166+
if self._viewer.underMouse():
167+
self._viewer.tab_search_set_nodes(self._node_factory.names)
168+
self._viewer.tab_search_toggle()
169169

170170
def _on_property_bin_changed(self, node_id, prop_name, prop_value):
171171
"""
@@ -687,8 +687,7 @@ def create_node(self, node_type, name=None, selected=True, color=None,
687687
NodeCls = self._node_factory.create_node_instance(node_type)
688688
if NodeCls:
689689
node = NodeCls()
690-
691-
node._graph = self
690+
node.set_graph(self)
692691
node.model._graph_model = self.model
693692

694693
wid_types = node.model.__dict__.pop('_TEMP_property_widget_types')

NodeGraphQt/base/model.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def __init__(self):
9292
}
9393

9494
def add_property(self, name, value, items=None, range=None,
95-
widget_type=NODE_PROP, tab='Properties'):
95+
widget_type=NODE_PROP, tab='Properties', ext=None):
9696
"""
9797
add custom property.
9898
@@ -103,6 +103,7 @@ def add_property(self, name, value, items=None, range=None,
103103
range (tuple)): min, max values used by NODE_PROP_SLIDER.
104104
widget_type (int): widget type flag.
105105
tab (str): widget tab name.
106+
ext (str) file ext for NODE_PROP_FILE
106107
"""
107108
tab = tab or 'Properties'
108109

@@ -122,6 +123,8 @@ def add_property(self, name, value, items=None, range=None,
122123
self._TEMP_property_attrs[name]['items'] = items
123124
if range:
124125
self._TEMP_property_attrs[name]['range'] = range
126+
if ext:
127+
self._TEMP_property_attrs[name]['ext'] = ext
125128
else:
126129
attrs = {self.type_: {name: {
127130
'widget_type': widget_type,
@@ -131,6 +134,8 @@ def add_property(self, name, value, items=None, range=None,
131134
attrs[self.type_][name]['items'] = items
132135
if range:
133136
attrs[self.type_][name]['range'] = range
137+
if ext:
138+
attrs[self.type_][name]['ext'] = ext
134139
self._graph_model.set_node_common_properties(attrs)
135140

136141
def set_property(self, name, value):

NodeGraphQt/base/node.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ def model(self):
125125
"""
126126
return self._model
127127

128+
def set_graph(self, graph):
129+
self._graph = graph
130+
128131
def set_model(self, model):
129132
"""
130133
Set the node model.
@@ -234,7 +237,7 @@ def set_selected(self, selected=True):
234237
self.set_property('selected', selected)
235238

236239
def create_property(self, name, value, items=None, range=None,
237-
widget_type=NODE_PROP, tab=None):
240+
widget_type=NODE_PROP, tab=None, ext=None):
238241
"""
239242
Creates a custom property to the node.
240243
@@ -247,7 +250,13 @@ def create_property(self, name, value, items=None, range=None,
247250
- :attr:`NodeGraphQt.constants.NODE_PROP_QCHECKBOX`
248251
- :attr:`NodeGraphQt.constants.NODE_PROP_QSPINBOX`
249252
- :attr:`NodeGraphQt.constants.NODE_PROP_COLORPICKER`
250-
- :attr:`NodeGraphQt.constants.NODE_PROP_SLIDER`
253+
- :attr:`NodeGraphQt.constants.NODE_PROP_FILE`
254+
- :attr:`NodeGraphQt.constants.NODE_PROP_VECTOR2`
255+
- :attr:`NodeGraphQt.constants.NODE_PROP_VECTOR3`
256+
- :attr:`NodeGraphQt.constants.NODE_PROP_VECTOR4`
257+
- :attr:`NodeGraphQt.constants.NODE_PROP_FLOAT`
258+
- :attr:`NodeGraphQt.constants.NODE_PROP_INT`
259+
- :attr:`NodeGraphQt.constants.NODE_PROP_BUTTON`
251260
252261
See Also:
253262
:class:`NodeGraphQt.PropertiesBinWidget`
@@ -259,8 +268,9 @@ def create_property(self, name, value, items=None, range=None,
259268
range (tuple)): ``(min, max)`` values used by ``NODE_PROP_SLIDER``
260269
widget_type (int): widget flag to display in the ``PropertiesBinWidget``
261270
tab (str): name of the widget tab to display in the properties bin.
271+
ext (str): file ext of ``NODE_PROP_FILE``
262272
"""
263-
self.model.add_property(name, value, items, range, widget_type, tab)
273+
self.model.add_property(name, value, items, range, widget_type, tab, ext)
264274

265275
def properties(self):
266276
"""
@@ -557,9 +567,12 @@ def add_file_input(self, name, label='', text='', tab=None, ext="*"):
557567
tab (str): name of the widget tab to display in.
558568
ext (str): file ext
559569
"""
560-
self.create_property(
561-
name, text, widget_type=NODE_PROP_FILE, tab=tab)
562-
widget = NodeFilePath(self.view, name, label, text,ext)
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+
575+
widget = NodeFilePath(self.view, name, label, text, ext)
563576
widget.value_changed.connect(lambda k, v: self.set_property(k, v))
564577
self.view.add_widget(widget)
565578

NodeGraphQt/widgets/file_dialog.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from NodeGraphQt import QtWidgets
2+
from NodeGraphQt.widgets.stylesheet import STYLE_MESSAGEBOX
23
import os
34

45
current_dir = os.path.expanduser('~')
@@ -40,3 +41,10 @@ def getOpenFileName(parent=None, title="Open File", file_dir=None, ext_filter="*
4041
return file_dlg
4142

4243

44+
def messageBox(text, title , buttons):
45+
msg = QtWidgets.QMessageBox()
46+
msg.setStyleSheet(STYLE_MESSAGEBOX)
47+
msg.setWindowTitle(title)
48+
msg.setInformativeText(text)
49+
msg.setStandardButtons(buttons)
50+
return msg.exec_()

NodeGraphQt/widgets/properties.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -310,9 +310,13 @@ def __init__(self, parent=None):
310310

311311
self._ledit.setStyleSheet("QLineEdit{border:1px solid}")
312312
_button.setStyleSheet("QPushButton{border:1px solid}")
313+
self._ext = "*"
314+
315+
def set_ext(self, ext):
316+
self._ext = ext
313317

314318
def _on_select_file(self):
315-
file_path = file_dialog.getOpenFileName(self)
319+
file_path = file_dialog.getOpenFileName(self, ext_filter=self._ext)
316320
file = file_path[0] or None
317321
if file:
318322
self.set_value(file)
@@ -398,7 +402,7 @@ def __init__(self, parent=None):
398402
self._step = 1
399403
self._speed = 0.1
400404

401-
self.textChanged.connect(self._on_text_changed)
405+
self.editingFinished.connect(self._on_text_changed)
402406

403407
self.menu = _valueMenu()
404408
self.menu.mouseMove.connect(self.mouseMoveEvent)
@@ -409,7 +413,7 @@ def __init__(self, parent=None):
409413

410414
self.set_data_type(float)
411415

412-
def _on_text_changed(self, value):
416+
def _on_text_changed(self):
413417
self.valueChanged.emit(self.value())
414418

415419
def _reset(self):
@@ -425,6 +429,7 @@ def mouseMoveEvent(self, event):
425429
delta = event.x() - self.pre_x
426430
value = self.pre_val + int(delta*self._speed) * self._step
427431
self.setValue(value)
432+
self._on_text_changed()
428433

429434
super(_valueEdit,self).mouseMoveEvent(event)
430435

@@ -513,18 +518,19 @@ def __init__(self, parent=None):
513518
self.set_data_type(float)
514519
self._lock = False
515520

516-
def _on_edit_changed(self,value):
521+
def _on_edit_changed(self, value):
517522
self._set_slider_value(value)
518523
self.valueChanged.emit(self._edit.value())
519524

520-
def _on_slider_changed(self,value):
525+
def _on_slider_changed(self, value):
521526
if self._lock:
522527
self._lock = False
523528
return
524529
value = value / float(self._mul)
525530
self._edit.setValue(value)
531+
self._on_edit_changed(value)
526532

527-
def _set_slider_value(self,value):
533+
def _set_slider_value(self, value):
528534
value = int(value * self._mul)
529535

530536
if value == self._slider.value():
@@ -539,7 +545,6 @@ def _set_slider_value(self,value):
539545
elif value > _max and self._slider.value() != _max:
540546
self._slider.setValue(_max)
541547

542-
543548
def set_min(self, value=0):
544549
self._slider.setMinimum(int(value*self._mul))
545550

@@ -563,6 +568,7 @@ def value(self):
563568

564569
def setValue(self,value):
565570
self._edit.setValue(value)
571+
self._on_edit_changed(value)
566572

567573

568574
class _doubleSpinBox(QtWidgets.QDoubleSpinBox):
@@ -868,6 +874,8 @@ def _read_node(self, node):
868874
prop_range = common_props[prop_name]['range']
869875
widget.set_min(prop_range[0])
870876
widget.set_max(prop_range[1])
877+
if 'ext' in common_props[prop_name].keys():
878+
widget.set_ext(common_props[prop_name]['ext'])
871879

872880
prop_window.add_widget(prop_name, widget, value,
873881
prop_name.replace('_', ' '))

NodeGraphQt/widgets/stylesheet.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,3 +193,31 @@
193193
background-color: transparent;
194194
}
195195
'''
196+
197+
STYLE_MESSAGEBOX = '''
198+
QLabel{
199+
min-width:500 px;
200+
font-size: 18px;
201+
background-color: transparent;
202+
color: rgb(200 ,200, 200);
203+
}
204+
QPushButton{
205+
width:100px;
206+
font-size: 18px;
207+
background-color: transparent;
208+
color: rgb(200 ,200, 200);
209+
border-width: 1px;
210+
border-color: rgb(40,40,40);
211+
}
212+
QPushButton::pressed {
213+
border-style: inset;
214+
}
215+
QPushButton::hover {
216+
background-color: rgb(65, 65, 65);
217+
border-color: rgb(10,80,230);
218+
}
219+
QMessageBox{
220+
background-color: rgb(55, 55, 55);
221+
color: rgb(200 ,200, 200);
222+
}
223+
'''

NodeGraphQt/widgets/viewer.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from NodeGraphQt.widgets.actions import BaseMenu
1515
from NodeGraphQt.widgets.scene import NodeScene
1616
from NodeGraphQt.widgets.tab_search import TabSearchWidget, TabSearchMenuWidget
17-
from NodeGraphQt.widgets.file_dialog import file_dialog
17+
from NodeGraphQt.widgets.file_dialog import file_dialog, messageBox
1818

1919
ZOOM_MIN = -0.95
2020
ZOOM_MAX = 2.0
@@ -33,6 +33,7 @@ class NodeViewer(QtWidgets.QGraphicsView):
3333
connection_sliced = QtCore.Signal(list)
3434
connection_changed = QtCore.Signal(list, list)
3535
insert_node = QtCore.Signal(object, str, dict)
36+
need_show_tab_search = QtCore.Signal()
3637

3738
# pass through signals
3839
node_selected = QtCore.Signal(str)
@@ -207,10 +208,13 @@ def contextMenuEvent(self, event):
207208
action.node_id = node.id
208209

209210
ctx_menu = ctx_menu or self._ctx_menu
210-
if ctx_menu.isEnabled():
211-
ctx_menu.exec_(event.globalPos())
211+
if len(ctx_menu.actions()) > 0:
212+
if ctx_menu.isEnabled():
213+
ctx_menu.exec_(event.globalPos())
214+
else:
215+
return super(NodeViewer, self).contextMenuEvent(event)
212216
else:
213-
return super(NodeViewer, self).contextMenuEvent(event)
217+
self.need_show_tab_search.emit()
214218

215219
def mousePressEvent(self, event):
216220
if event.button() == QtCore.Qt.LeftButton:
@@ -286,7 +290,6 @@ def mouseReleaseEvent(self, event):
286290
elif event.button() == QtCore.Qt.MiddleButton:
287291
self.MMB_state = False
288292

289-
290293
# hide pipe slicer.
291294
if self._SLICER_PIPE.isVisible():
292295
self._on_pipes_sliced(self._SLICER_PIPE.path())
@@ -714,14 +717,11 @@ def context_menus(self):
714717
'nodes': self._ctx_node_menu}
715718

716719
def question_dialog(self, text, title='Node Graph'):
717-
dlg = QtWidgets.QMessageBox.question(
718-
self, title, text,
719-
QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
720+
dlg = messageBox(text, title, QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No)
720721
return dlg == QtWidgets.QMessageBox.Yes
721722

722723
def message_dialog(self, text, title='Node Graph'):
723-
QtWidgets.QMessageBox.information(
724-
self, title, text, QtWidgets.QMessageBox.Ok)
724+
messageBox(text, title, QtWidgets.QMessageBox.Ok)
725725

726726
def load_dialog(self, current_dir=None, ext=None):
727727
ext = '*{} '.format(ext) if ext else ''

example_auto_nodes/node_base/auto_node.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,27 @@
22
from NodeGraphQt.base.port import Port
33
from NodeGraphQt.constants import NODE_PROP
44
from NodeGraphQt import QtCore
5-
import random
5+
import hashlib
66
import copy
77
import time
88

9-
def rand_color(seed_type):
10-
seed = id(seed_type)
11-
random.seed(seed + 10)
12-
r = random.randint(50, 200)
13-
random.seed(seed + 5)
14-
g = random.randint(50, 200)
15-
random.seed(seed + 3421)
16-
b = random.randint(50, 200)
17-
return (r, g, b, 255)
9+
10+
# Generate random color based on strings
11+
class CryptoColors(object):
12+
def __init__(self):
13+
self.colors = {}
14+
15+
def get(self, text, Min=50, Max=200):
16+
if text in self.colors:
17+
return self.colors[text]
18+
h = hashlib.sha256(text.encode('utf-8')).hexdigest()
19+
d = int('0xFFFFFFFFFFFFFFFF', 0)
20+
r = int(Min + (int("0x" + h[:16], 0) / d) * (Max - Min))
21+
g = int(Min + (int("0x" + h[16:32], 0) / d) * (Max - Min))
22+
b = int(Min + (int("0x" + h[32:48], 0) / d) * (Max - Min))
23+
a = int(Min + (int("0x" + h[48:], 0) / d) * (Max - Min))
24+
self.colors[text] = (r, g, b, 255)
25+
return self.colors[text]
1826

1927

2028
class AutoNode(BaseNode,QtCore.QObject):
@@ -29,6 +37,7 @@ def __init__(self, defaultInputType=None, defaultOutputType=None):
2937
self.matchTypes = [[float, int]]
3038
self.errorColor = (200, 50, 50)
3139
self.stopCookColor = (200, 200, 200)
40+
self._cryptoColors = CryptoColors()
3241

3342
self.defaultColor = self.get_property("color")
3443
self.defaultValue = None
@@ -186,8 +195,8 @@ def set_port_type(self, port, value_type):
186195
else:
187196
current_port.DataType = value_type
188197

189-
current_port.border_color = rand_color(value_type)
190-
current_port.color = rand_color(value_type)
198+
current_port.border_color = self._cryptoColors.get(str(value_type))
199+
current_port.color = self._cryptoColors.get(str(value_type))
191200
conn_type = 'multi' if current_port.multi_connection() else 'single'
192201
data_type_name = value_type.__name__ if value_type else "all"
193202
current_port.view.setToolTip('{}: {} ({}) '.format(current_port.name(), data_type_name, conn_type))

0 commit comments

Comments
 (0)