Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 25 additions & 7 deletions NodeGraphQt/base/graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@


class QWidgetDrops(QtWidgets.QWidget):

def __init__(self):
super(QWidgetDrops, self).__init__()
self.setAcceptDrops(True)
Expand Down Expand Up @@ -61,7 +62,8 @@ def dropEvent(self, event):

class NodeGraph(QtCore.QObject):
"""
The ``NodeGraph`` class is the main controller for managing all nodes.
The ``NodeGraph`` class is the main controller for managing all nodes
and the node graph.

Inherited from: :class:`PySide2.QtCore.QObject`

Expand Down Expand Up @@ -153,18 +155,24 @@ def __init__(self, parent=None):
self._current_node_space = None
self._editable = True

tab = QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Tab), self._viewer)
tab.activated.connect(self._toggle_tab_search)
self._viewer.need_show_tab_search.connect(self._toggle_tab_search)

self._wire_signals()
self._node_space_bar = node_space_bar(self)
self._auto_update = True

def __repr__(self):
return '<{} object at {}>'.format(self.__class__.__name__, hex(id(self)))
return '<{} object at {}>'.format(
self.__class__.__name__, hex(id(self)))

def _wire_signals(self):
"""
Connect up all the signals and slots here.
"""
# hard coded tab search.
tab = QtWidgets.QShortcut(
QtGui.QKeySequence(QtCore.Qt.Key_Tab), self._viewer)
tab.activated.connect(self._toggle_tab_search)
self._viewer.need_show_tab_search.connect(self._toggle_tab_search)

# internal signals.
self._viewer.search_triggered.connect(self._on_search_triggered)
self._viewer.connection_sliced.connect(self._on_connection_sliced)
Expand Down Expand Up @@ -231,7 +239,7 @@ def _on_property_bin_changed(self, node_id, prop_name, prop_value):
Args:
node_id (str): node id.
prop_name (str): node property name.
prop_value (object): python object.
prop_value (object): python built in types.
"""
if not self._editable:
return
Expand Down Expand Up @@ -391,6 +399,16 @@ def model(self):
"""
return self._model

@property
def node_factory(self):
"""
Return the node factory object used by the node graph.

Returns:
NodeFactory: node factory.
"""
return self._node_factory

@property
def widget(self):
"""
Expand Down
30 changes: 21 additions & 9 deletions NodeGraphQt/base/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
from collections import defaultdict

from ..constants import (NODE_PROP,
NODE_PROP_QLABEL,
NODE_PROP_QLINEEDIT,
NODE_PROP_QCHECKBOX,
NODE_PROP_COLORPICKER)
NODE_PROP_QLABEL,
NODE_PROP_QLINEEDIT,
NODE_PROP_QCHECKBOX,
NODE_PROP_COLORPICKER)
from ..errors import NodePropertyError


Expand All @@ -23,7 +23,7 @@ def __init__(self, node):
self.data_type = 'NoneType'

def __repr__(self):
return '<{}(\'{}\') @ {}>'.format(
return '<{}(\'{}\') object at {}>'.format(
self.__class__.__name__, self.name, hex(id(self)))

@property
Expand Down Expand Up @@ -94,6 +94,10 @@ def __init__(self):
'outputs': NODE_PROP,
}

def __repr__(self):
return '<{}(\'{}\') object at {}>'.format(
self.__class__.__name__, self.name, self.id)

def add_property(self, name, value, items=None, range=None,
widget_type=NODE_PROP, tab='Properties',
ext=None, funcs=None):
Expand Down Expand Up @@ -240,15 +244,23 @@ def to_dict(self):
output_ports = []
for name, model in node_dict.pop('inputs').items():
if self.dynamic_port:
input_ports.append({'name': name, 'multi_connection': model.multi_connection,
'display_name': model.display_name, 'data_type': model.data_type})
input_ports.append({
'name': name,
'multi_connection': model.multi_connection,
'display_name': model.display_name,
'data_type': model.data_type
})
connected_ports = model.to_dict['connected_ports']
if connected_ports:
inputs[name] = connected_ports
for name, model in node_dict.pop('outputs').items():
if self.dynamic_port:
output_ports.append({'name': name, 'multi_connection': model.multi_connection,
'display_name': model.display_name, 'data_type': model.data_type})
output_ports.append({
'name': name,
'multi_connection': model.multi_connection,
'display_name': model.display_name,
'data_type': model.data_type
})
connected_ports = model.to_dict['connected_ports']
if connected_ports:
outputs[name] = connected_ports
Expand Down
8 changes: 5 additions & 3 deletions NodeGraphQt/base/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,9 +281,11 @@ def create_property(self, name, value, items=None, range=None,
widget_type (int): widget flag to display in the ``PropertiesBinWidget``
tab (str): name of the widget tab to display in the properties bin.
ext (str): file ext of ``NODE_PROP_FILE``
funcs (list) list of functions for NODE_PROP_BUTTON
funcs (list[function]) list of functions for NODE_PROP_BUTTON
"""
self.model.add_property(name, value, items, range, widget_type, tab, ext, funcs)
self.model.add_property(
name, value, items, range, widget_type, tab, ext, funcs
)

def properties(self):
"""
Expand Down Expand Up @@ -317,7 +319,7 @@ def set_property(self, name, value):

Args:
name (str): name of the property.
value (object): property data.
value (object): property data (python built in types).
"""

# prevent signals from causing a infinite loop.
Expand Down
3 changes: 2 additions & 1 deletion NodeGraphQt/base/port.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ def __init__(self, node, port):

def __repr__(self):
port = str(self.__class__.__name__)
return '<{}("{}") object at {}>'.format(port, self.name(), hex(id(self)))
return '<{}("{}") object at {}>'.format(
port, self.name(), hex(id(self)))

@property
def view(self):
Expand Down
2 changes: 1 addition & 1 deletion NodeGraphQt/pkg_info.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
__version__ = '0.1.1'
__version__ = '0.1.2'
__status__ = 'Work in Progress'
__license__ = 'MIT'

Expand Down
6 changes: 6 additions & 0 deletions NodeGraphQt/qgraphics/node_abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ def boundingRect(self):
return QtCore.QRectF(0.0, 0.0, self._width, self._height)

def mousePressEvent(self, event):
"""
Re-implemented to update "self._properties['selected']" attribute.

Args:
event (QtWidgets.QGraphicsSceneMouseEvent): mouse event.
"""
self._properties['selected'] = True
super(AbstractNodeItem, self).mousePressEvent(event)

Expand Down
21 changes: 16 additions & 5 deletions NodeGraphQt/qgraphics/node_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,12 +197,23 @@ def paint(self, painter, option, widget):
painter.restore()

def mousePressEvent(self, event):
"""
Re-implemented to ignore event if LMB is over port collision area.

Args:
event (QtWidgets.QGraphicsSceneMouseEvent): mouse event.
"""
if event.button() == QtCore.Qt.LeftButton:
start = PortItem().boundingRect().width() - PORT_FALLOFF
end = self.boundingRect().width() - start
x_pos = event.pos().x()
if not start <= x_pos <= end:
event.ignore()
for p in self._input_items.keys():
if p.hovered:
event.ignore()
super(NodeItem, self).mousePressEvent(event)
return
for p in self._output_items.keys():
if p.hovered:
event.ignore()
super(NodeItem, self).mousePressEvent(event)
return
super(NodeItem, self).mousePressEvent(event)

def mouseReleaseEvent(self, event):
Expand Down
6 changes: 3 additions & 3 deletions NodeGraphQt/qgraphics/port.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,13 @@ def paint(self, painter, option, widget):
"""
painter.save()

### display the falloff colision ###
# display falloff collision for debugging
# ----------------------------------------------------------------------
# pen = QtGui.QPen(QtGui.QColor(255, 255, 255, 80), 0.8)
# pen.setStyle(QtCore.Qt.DotLine)
# painter.setPen(pen)
# painter.drawRect(self.boundingRect())
# ----------------------------------------------------------------------

rect_w = self._width / 1.8
rect_h = self._height / 1.8
Expand Down Expand Up @@ -123,8 +125,6 @@ def itemChange(self, change, value):
return super(PortItem, self).itemChange(change, value)

def mousePressEvent(self, event):
# if event.modifiers() != QtCore.Qt.AltModifier:
# self.viewer_start_connection()
super(PortItem, self).mousePressEvent(event)

def mouseReleaseEvent(self, event):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ def set_dir(file):
current_dir = os.path.split(file)[0]


class file_dialog(object):
class FileDialog(object):

@staticmethod
def getSaveFileName(parent=None, title="Save File", file_dir=None, ext_filter="*"):
def getSaveFileName(parent=None, title="Save File", file_dir=None,
ext_filter="*"):
if not file_dir:
file_dir = current_dir
file_dlg = QtWidgets.QFileDialog.getSaveFileName(
Expand All @@ -28,7 +29,8 @@ def getSaveFileName(parent=None, title="Save File", file_dir=None, ext_filter="*
return file_dlg

@staticmethod
def getOpenFileName(parent=None, title="Open File", file_dir=None, ext_filter="*"):
def getOpenFileName(parent=None, title="Open File", file_dir=None,
ext_filter="*"):
if not file_dir:
file_dir = current_dir

Expand All @@ -42,10 +44,25 @@ def getOpenFileName(parent=None, title="Open File", file_dir=None, ext_filter="*
return file_dlg


def messageBox(text, title , buttons):
msg = QtWidgets.QMessageBox()
msg.setStyleSheet(STYLE_MESSAGEBOX)
msg.setWindowTitle(title)
msg.setInformativeText(text)
msg.setStandardButtons(buttons)
return msg.exec_()
class BaseDialog(object):

@staticmethod
def message_dialog(text, title):
dlg = QtWidgets.QMessageBox()
dlg.setStyleSheet(STYLE_MESSAGEBOX)
dlg.setWindowTitle(title)
dlg.setInformativeText(text)
dlg.setStandardButtons(QtWidgets.QMessageBox.Ok)
return dlg.exec_()

@staticmethod
def question_dialog(text, title):
dlg = QtWidgets.QMessageBox()
dlg.setStyleSheet(STYLE_MESSAGEBOX)
dlg.setWindowTitle(title)
dlg.setInformativeText(text)
dlg.setStandardButtons(
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No
)
dlg.exec_()
return bool(dlg == QtWidgets.QMessageBox.Yes)
3 changes: 2 additions & 1 deletion NodeGraphQt/widgets/node_space_bar.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@


class node_space_bar(QtWidgets.QWidget):

def __init__(self, graph):
super(node_space_bar, self).__init__()
self.setMaximumHeight(20)
Expand Down Expand Up @@ -55,4 +56,4 @@ def set_node(self, node):
self.add_node(node)

self._layout.addStretch()
self.update()
self.update()
3 changes: 2 additions & 1 deletion NodeGraphQt/widgets/node_tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@ class NodeTreeWidget(QtWidgets.QTreeWidget):
def __init__(self, parent=None, node_graph=None):
super(NodeTreeWidget, self).__init__(parent)
self.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
self.setWindowTitle('Node Tree')
self.setHeaderHidden(True)
self._factory = None
self._custom_labels = {}
self._set_node_factory(node_graph._node_factory)
self._set_node_factory(node_graph.node_factory)

def __repr__(self):
return '<{} object at {}>'.format(self.__class__.__name__, hex(id(self)))
Expand Down
4 changes: 2 additions & 2 deletions NodeGraphQt/widgets/node_widgets.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/python
from .file_dialog import file_dialog
from .dialogs import FileDialog
from .properties import _ValueEdit
from .stylesheet import *

Expand Down Expand Up @@ -421,7 +421,7 @@ def __init__(self, parent=None, name='', label='', text='', ext="*"):
self._ext = ext

def _on_select_file(self):
file_path = file_dialog.getOpenFileName(ext_filter=self._ext)
file_path = FileDialog.getOpenFileName(ext_filter=self._ext)
file = file_path[0] or None
if file:
self.value = file
14 changes: 7 additions & 7 deletions NodeGraphQt/widgets/properties.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
from collections import defaultdict

from .dialogs import FileDialog
from .. import QtWidgets, QtCore, QtGui
from ..constants import (NODE_PROP_QLABEL,
NODE_PROP_QLINEEDIT,
Expand All @@ -18,7 +19,6 @@
NODE_PROP_FLOAT,
NODE_PROP_INT,
NODE_PROP_BUTTON)
from .file_dialog import file_dialog


class BaseProperty(QtWidgets.QWidget):
Expand Down Expand Up @@ -312,9 +312,9 @@ def set_file_dir(self, dir):
self._file_dir = dir

def _on_select_file(self):
file_path = file_dialog.getOpenFileName(self,
file_dir=self._file_dir,
ext_filter=self._ext)
file_path = FileDialog.getOpenFileName(self,
file_dir=self._file_dir,
ext_filter=self._ext)
file = file_path[0] or None
if file:
self.set_value(file)
Expand All @@ -337,9 +337,9 @@ def set_value(self, value):
class PropFileSavePath(PropFilePath):

def _on_select_file(self):
file_path = file_dialog.getSaveFileName(self,
file_dir=self._file_dir,
ext_filter=self._ext)
file_path = FileDialog.getSaveFileName(self,
file_dir=self._file_dir,
ext_filter=self._ext)
file = file_path[0] or None
if file:
self.set_value(file)
Expand Down
Loading