From 0f4258a42db3cec35dc297b3b5063a6f04f1aae8 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 4 Mar 2023 14:16:37 -0500 Subject: [PATCH 01/88] black formatting --- main.py | 4 +--- node_editor/gui/connection.py | 4 +--- node_editor/gui/node.py | 7 ++----- node_editor/gui/node_editor.py | 7 +------ node_editor/gui/node_widget.py | 5 +---- node_editor/gui/port.py | 4 +--- node_editor/gui/view.py | 24 +++++++----------------- 7 files changed, 14 insertions(+), 41 deletions(-) diff --git a/main.py b/main.py index e87fa46..2bfefda 100644 --- a/main.py +++ b/main.py @@ -44,9 +44,7 @@ def __init__(self, parent=None): self.splitter.restoreState(s) except AttributeError as e: - logging.warning( - "Unable to load settings. First time opening the tool?\n" + str(e) - ) + logging.warning("Unable to load settings. First time opening the tool?\n" + str(e)) def closeEvent(self, event): self.settings = QtCore.QSettings("node-editor", "NodeEditor") diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection.py index 2faa4c4..f5af558 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection.py @@ -71,8 +71,7 @@ def update_start_and_end_pos(self): self.update_path() def update_path(self): - """Draw a smooth cubic curve from the start to end ports - """ + """Draw a smooth cubic curve from the start to end ports""" path = QtGui.QPainterPath() path.moveTo(self.start_pos) @@ -95,4 +94,3 @@ def paint(self, painter, option=None, widget=None): painter.setPen(QtGui.QPen(QtGui.QColor(0, 128, 255), 2)) painter.drawPath(self.path()) - diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index 1614075..28d6d06 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -69,8 +69,7 @@ def add_port(self, name, is_output=False, flags=0, ptr=None): self._ports.append(port) def build(self): - """ Build the node - """ + """Build the node""" self.title_path = QtGui.QPainterPath() # reset self.type_path = QtGui.QPainterPath() # The path for the type @@ -122,9 +121,7 @@ def build(self): total_height += self.vertical_margin # Draw the background rectangle - path.addRoundedRect( - -total_width / 2, -total_height / 2, total_width, total_height, 5, 5 - ) + path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height, 5, 5) # Draw the title self.title_path.addText( diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index f87cd71..155aad0 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -18,9 +18,7 @@ def install(self, scene): self.scene.installEventFilter(self) def item_at(self, position): - items = self.scene.items( - QtCore.QRectF(position - QtCore.QPointF(1, 1), QtCore.QSizeF(3, 3)) - ) + items = self.scene.items(QtCore.QRectF(position - QtCore.QPointF(1, 1), QtCore.QSizeF(3, 3))) if items: return items[0] @@ -31,7 +29,6 @@ def eventFilter(self, watched, event): return False if event.type() == QtCore.QEvent.GraphicsSceneMousePress: - if event.button() == QtCore.Qt.LeftButton: item = self.item_at(event.scenePos()) @@ -81,9 +78,7 @@ def eventFilter(self, watched, event): elif event.type() == QtCore.QEvent.KeyPress: if event.key() == QtCore.Qt.Key_Delete: - for item in self.scene.selectedItems(): - if isinstance(item, (Connection, Node)): item.delete() diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index 3c3c100..2ae20ef 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -68,10 +68,7 @@ def dropEvent(self, e): item = self.itemAt(e.scenePos()) if item.setAcceptDrops == True: # pass on event to item at the coordinates - try: - item.dropEvent(e) - except RuntimeError: - pass # This will supress a Runtime Error generated when dropping into a widget with no ProxyWidget + item.dropEvent(e) def dragMoveEvent(self, e): e.acceptProposedAction() diff --git a/node_editor/gui/port.py b/node_editor/gui/port.py index d71775f..48c38f9 100644 --- a/node_editor/gui/port.py +++ b/node_editor/gui/port.py @@ -9,9 +9,7 @@ def __init__(self, parent, scene): self.margin = 2 path = QtGui.QPainterPath() - path.addEllipse( - -self.radius_, -self.radius_, 2 * self.radius_, 2 * self.radius_ - ) + path.addEllipse(-self.radius_, -self.radius_, 2 * self.radius_, 2 * self.radius_) self.setPath(path) self.setFlag(QtWidgets.QGraphicsPathItem.ItemSendsScenePositionChanges) diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index 31d6dfe..b82700a 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -43,7 +43,6 @@ def __init__(self, parent): self.setFrameShape(QtWidgets.QFrame.NoFrame) def wheelEvent(self, event): - # sometimes you can triger the wheen when panning so we disable when panning if self._pan: return @@ -77,7 +76,6 @@ def anim_finished(self): self._numScheduledScalings += 1 def drawBackground(self, painter, rect): - painter.fillRect(rect, self._background_color) left = int(rect.left()) - (int(rect.left()) % self._grid_size_fine) @@ -133,21 +131,19 @@ def contextMenuEvent(self, event): if item: if isinstance(item, Node): - print("Found Node", item) menu = QtWidgets.QMenu(self) - hello_action = QtWidgets.QAction("Hello", self) + # hello_action = QtWidgets.QAction("Hello", self) - menu.addAction(hello_action) - action = menu.exec_(self.mapToGlobal(pos)) + # menu.addAction(hello_action) + # action = menu.exec_(self.mapToGlobal(pos)) - if action == hello_action: - print("Hello") + # if action == hello_action: + # print("Hello") def dragEnterEvent(self, e): - if e.mimeData().hasFormat("text/plain"): e.accept() else: @@ -175,17 +171,11 @@ def mouseReleaseEvent(self, event): def mouseMoveEvent(self, event): if self._pan: + self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - (event.x() - self._pan_start_x)) - self.horizontalScrollBar().setValue( - self.horizontalScrollBar().value() - (event.x() - self._pan_start_x) - ) - - self.verticalScrollBar().setValue( - self.verticalScrollBar().value() - (event.y() - self._pan_start_y) - ) + self.verticalScrollBar().setValue(self.verticalScrollBar().value() - (event.y() - self._pan_start_y)) self._pan_start_x = event.x() self._pan_start_y = event.y() return super(View, self).mouseMoveEvent(event) - From ca5e62684b17ebb177211f6d1963b2ec5e1edb21 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 4 Mar 2023 15:11:27 -0500 Subject: [PATCH 02/88] vscode settings --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4c44546..6a962e5 100644 --- a/.gitignore +++ b/.gitignore @@ -103,4 +103,7 @@ venv.bak/ # mypy .mypy_cache/ -temp \ No newline at end of file +temp + +#vscode settings +settings.json \ No newline at end of file From 1936a86974e49755b71aec215bca3d96fcdc53b4 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 4 Mar 2023 15:11:48 -0500 Subject: [PATCH 03/88] fixing bugs when moving to PySide6 --- main.py | 6 ++---- node_editor/gui/node.py | 16 +++++++++------- node_editor/gui/node_list.py | 33 ++++++++++++++++++--------------- node_editor/gui/node_widget.py | 14 +++++++++++++- 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/main.py b/main.py index 2bfefda..eebb623 100644 --- a/main.py +++ b/main.py @@ -38,14 +38,12 @@ def __init__(self, parent=None): self.splitter.addWidget(self.node_list) self.splitter.addWidget(self.node_widget) - try: + if settings.contains("geometry"): self.restoreGeometry(settings.value("geometry")) + s = settings.value("splitterSize") self.splitter.restoreState(s) - except AttributeError as e: - logging.warning("Unable to load settings. First time opening the tool?\n" + str(e)) - def closeEvent(self, event): self.settings = QtCore.QSettings("node-editor", "NodeEditor") self.settings.setValue("geometry", self.saveGeometry()) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index 28d6d06..a7be300 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -104,6 +104,7 @@ def build(self): for dim in [title_dim["h"], title_type_dim["h"]]: total_height += dim + port_dim = None # Add the heigth for each of the ports for port in self._ports: port_dim = { @@ -139,14 +140,15 @@ def build(self): "(" + self._type_text + ")", ) - y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + port_dim["h"] + if port_dim: + y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + port_dim["h"] - for port in self._ports: - if port.is_output(): - port.setPos(total_width / 2 - 10, y) - else: - port.setPos(-total_width / 2 + 10, y) - y += port_dim["h"] + for port in self._ports: + if port.is_output(): + port.setPos(total_width / 2 - 10, y) + else: + port.setPos(-total_width / 2 + 10, y) + y += port_dim["h"] self.setPath(path) diff --git a/node_editor/gui/node_list.py b/node_editor/gui/node_list.py index 6ab29d8..59ed49e 100644 --- a/node_editor/gui/node_list.py +++ b/node_editor/gui/node_list.py @@ -5,11 +5,9 @@ class NodeList(QtWidgets.QListWidget): def __init__(self, parent=None): super(NodeList, self).__init__(parent) - self.addItem("Input") - self.addItem("Output") - self.addItem("And") - self.addItem("Not") - self.addItem("Nor") + for node in ["Input", "Output", "And", "Not", "Nor", "Empty"]: + item = QtWidgets.QListWidgetItem(node) + self.addItem(item) self.setDragEnabled(True) # enable dragging @@ -18,8 +16,8 @@ def contextMenuEvent(self, event): pos = event.pos() # actions - delete_node = QtWidgets.QAction("Delete Node") - edit_node = QtWidgets.QAction("Edit Node") + delete_node = QtGui.QAction("Delete Node") + edit_node = QtGui.QAction("Edit Node") menu.addAction(delete_node) action = menu.exec_(self.mapToGlobal(pos)) @@ -27,7 +25,7 @@ def contextMenuEvent(self, event): if action == delete_node: item_name = self.selectedItems()[0].text() - if item_name not in ["And", "Not", "Input", "Output"]: + if item_name not in ["And", "Not", "Input", "Output Signal/Slot"]: print(f"delete node: {item_name}") else: print("Cannot delete default nodes") @@ -39,13 +37,18 @@ def contextMenuEvent(self, event): def mousePressEvent(self, event): item = self.itemAt(event.pos()) - name = item.text() + if item and item.text(): + name = item.text() - drag = QtGui.QDrag(self) - mime_data = QtCore.QMimeData() + drag = QtGui.QDrag(self) + mime_data = QtCore.QMimeData() + mime_data.setText(name) + drag.setMimeData(mime_data) - mime_data.setText(name) - drag.setMimeData(mime_data) - drag.exec_() + # Drag needs a pixmap or else it'll error due to a null pixmap + pixmap = QtGui.QPixmap(16, 16) + pixmap.fill(QtGui.QColor("darkgray")) + drag.setPixmap(pixmap) + drag.exec_() - super(NodeList, self).mousePressEvent(event) + super(NodeList, self).mousePressEvent(event) diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index 2ae20ef..9e2f7bb 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -59,6 +59,14 @@ def create_nor(): return node +def create_empty(): + node = Node() + node.title = "NOR" + node.type_text = "empty node" + node.build() + return node + + class NodeScene(QtWidgets.QGraphicsScene): def dragEnterEvent(self, e): e.acceptProposedAction() @@ -97,7 +105,6 @@ def create_node(self, name): if name == "Input": node = create_input() - elif name == "Output": node = create_output() elif name == "And": @@ -106,6 +113,11 @@ def create_node(self, name): node = create_not() elif name == "Nor": node = create_nor() + elif name == "Empty": + node = create_empty() + else: + print(f"Can't find a premade node for {name}") + return self.scene.addItem(node) From 274d2d4f80f4b7872726529f8d8f62011dc9972a Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 4 Mar 2023 16:15:06 -0500 Subject: [PATCH 04/88] using qdarktheme if available instead --- node_editor/gui/palette.py | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 node_editor/gui/palette.py diff --git a/node_editor/gui/palette.py b/node_editor/gui/palette.py deleted file mode 100644 index 89e107c..0000000 --- a/node_editor/gui/palette.py +++ /dev/null @@ -1,23 +0,0 @@ -from PySide6 import QtGui -from PySide6.QtGui import QPalette, QColor -from PySide6.QtCore import Qt - -palette = QtGui.QPalette() - -palette.setColor(QPalette.Window, QColor(27, 35, 38)) -palette.setColor(QPalette.WindowText, QColor(234, 234, 234)) -palette.setColor(QPalette.Base, QColor(27, 35, 38)) -palette.setColor(QPalette.Disabled, QPalette.Base, QColor(27 + 5, 35 + 5, 38 + 5)) -palette.setColor(QPalette.AlternateBase, QColor(12, 15, 16)) -palette.setColor(QPalette.ToolTipBase, QColor(27, 35, 38)) -palette.setColor(QPalette.ToolTipText, Qt.white) -palette.setColor(QPalette.Text, QColor(200, 200, 200)) -palette.setColor(QPalette.Disabled, QPalette.Text, QColor(100, 100, 100)) -palette.setColor(QPalette.Button, QColor(27, 35, 38)) -palette.setColor(QPalette.ButtonText, Qt.white) -palette.setColor(QPalette.BrightText, QColor(100, 215, 222)) -palette.setColor(QPalette.Link, QColor(126, 71, 130)) -palette.setColor(QPalette.Highlight, QColor(126, 71, 130)) -palette.setColor(QPalette.HighlightedText, Qt.white) -palette.setColor(QPalette.Disabled, QPalette.Light, Qt.black) -palette.setColor(QPalette.Disabled, QPalette.Shadow, QColor(12, 15, 16)) From 91ad07d61a31615a819c225b4e5e47f1a86ca8fa Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 4 Mar 2023 16:15:46 -0500 Subject: [PATCH 05/88] restructuring left side, added a button for making new node types --- main.py | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/main.py b/main.py index eebb623..5b875a5 100644 --- a/main.py +++ b/main.py @@ -6,11 +6,17 @@ import os from node_editor.gui.node_widget import NodeWidget -from node_editor.gui.palette import palette from node_editor.gui.node_list import NodeList +from node_editor.gui.node_type_editor import NodeTypeEditor logging.basicConfig(level=logging.DEBUG) +import importlib + +# Import qdarktheme if you have it. If not install it with pip. Dark Themese are great! +if importlib.util.find_spec("qdarktheme") is not None: + import qdarktheme + class NodeEditor(QtWidgets.QMainWindow): def __init__(self, parent=None): @@ -20,30 +26,51 @@ def __init__(self, parent=None): icon = QtGui.QIcon("resources\\app.ico") self.setWindowIcon(icon) - self.setWindowTitle("Logic Node Editor") + self.setWindowTitle("Simple Node Editor") settings = QtCore.QSettings("node-editor", "NodeEditor") # Layouts main_widget = QtWidgets.QWidget() + self.setCentralWidget(main_widget) main_layout = QtWidgets.QHBoxLayout() + main_widget.setLayout(main_layout) + left_layout = QtWidgets.QVBoxLayout() + left_layout.setContentsMargins(0, 0, 0, 0) + # Widgets self.node_list = NodeList() + left_widget = QtWidgets.QWidget() self.splitter = QtWidgets.QSplitter() - - self.setCentralWidget(main_widget) - main_widget.setLayout(main_layout) - self.node_widget = NodeWidget(self) - main_layout.addWidget(self.splitter) - self.splitter.addWidget(self.node_list) + new_node_type_btn = QtWidgets.QPushButton("New Node Type") + new_node_type_btn.setFixedHeight(50) + + # Add Widgets to layouts + self.splitter.addWidget(left_widget) self.splitter.addWidget(self.node_widget) + left_widget.setLayout(left_layout) + left_layout.addWidget(self.node_list) + left_layout.addWidget(new_node_type_btn) + main_layout.addWidget(self.splitter) + + # Logic + new_node_type_btn.clicked.connect(self.new_node_cmd) + # Restore GUI from last state if settings.contains("geometry"): self.restoreGeometry(settings.value("geometry")) s = settings.value("splitterSize") self.splitter.restoreState(s) + def new_node_cmd(self): + node_editor = NodeTypeEditor() + + if node_editor.exec() == QtWidgets.QDialog.Accepted: + print("Dialog accepted") + else: + print("Dialog canceled") + def closeEvent(self, event): self.settings = QtCore.QSettings("node-editor", "NodeEditor") self.settings.setValue("geometry", self.saveGeometry()) @@ -54,7 +81,8 @@ def closeEvent(self, event): if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) app.setWindowIcon(QtGui.QIcon("resources\\app.ico")) - app.setPalette(palette) + qdarktheme.setup_theme() + launcher = NodeEditor() launcher.show() app.exec() From 5a5fdb50dc1212858e7d104f377cff8dffeeb487 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 4 Mar 2023 16:15:57 -0500 Subject: [PATCH 06/88] cleanup --- node_editor/gui/node_editor.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index 155aad0..45a0987 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -35,7 +35,6 @@ def eventFilter(self, watched, event): if isinstance(item, Port): self.connection = Connection(None) self.scene.addItem(self.connection) - # self.connection.start_port = item self.port = item self.connection.start_pos = item.scenePos() self.connection.end_pos = event.scenePos() @@ -46,7 +45,6 @@ def eventFilter(self, watched, event): self.connection = Connection(None) self.connection.start_pos = item.start_pos self.scene.addItem(self.connection) - # self.connection.start_port = item.start_port self.port = item.start_port self.connection.end_pos = event.scenePos() self.connection.update_start_and_end_pos() # to fix the offset From 5f811c40f901584d3071a6d51860499f88c5c786 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 4 Mar 2023 16:16:16 -0500 Subject: [PATCH 07/88] removing the context menu because it doesn't do anything --- node_editor/gui/node_list.py | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/node_editor/gui/node_list.py b/node_editor/gui/node_list.py index 59ed49e..1085d2f 100644 --- a/node_editor/gui/node_list.py +++ b/node_editor/gui/node_list.py @@ -11,30 +11,6 @@ def __init__(self, parent=None): self.setDragEnabled(True) # enable dragging - def contextMenuEvent(self, event): - menu = QtWidgets.QMenu(self) - pos = event.pos() - - # actions - delete_node = QtGui.QAction("Delete Node") - edit_node = QtGui.QAction("Edit Node") - menu.addAction(delete_node) - - action = menu.exec_(self.mapToGlobal(pos)) - - if action == delete_node: - item_name = self.selectedItems()[0].text() - - if item_name not in ["And", "Not", "Input", "Output Signal/Slot"]: - print(f"delete node: {item_name}") - else: - print("Cannot delete default nodes") - - elif action == edit_node: - print("editing node") - - # confirm to open in the editor replacing what is existing - def mousePressEvent(self, event): item = self.itemAt(event.pos()) if item and item.text(): From 121ce22abb55cf43bd745b400dd57ba0419bcedd Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 4 Mar 2023 16:16:30 -0500 Subject: [PATCH 08/88] this would be a node editor for new node types --- node_editor/gui/node_type_editor.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 node_editor/gui/node_type_editor.py diff --git a/node_editor/gui/node_type_editor.py b/node_editor/gui/node_type_editor.py new file mode 100644 index 0000000..30cf573 --- /dev/null +++ b/node_editor/gui/node_type_editor.py @@ -0,0 +1,26 @@ +from PySide6 import QtWidgets, QtGui + + +class NodeTypeEditor(QtWidgets.QDialog): + def __init__(self, parent=None): + super().__init__(parent) + + self.setWindowTitle("Node Type Editor") + + # create the UI elements + label = QtWidgets.QLabel("Node Type:") + self.edit = QtWidgets.QLineEdit() + button_ok = QtWidgets.QPushButton("OK") + button_cancel = QtWidgets.QPushButton("Cancel") + + # set the layout + layout = QtWidgets.QHBoxLayout() + layout.addWidget(label) + layout.addWidget(self.edit) + layout.addWidget(button_ok) + layout.addWidget(button_cancel) + self.setLayout(layout) + + # connect the signals and slots + button_ok.clicked.connect(self.accept) + button_cancel.clicked.connect(self.reject) From ea4eec00023a5c66521d8fad57cd49c66f28b7bf Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 4 Mar 2023 16:16:41 -0500 Subject: [PATCH 09/88] cleanup --- node_editor/gui/node.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index a7be300..17c5671 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -160,9 +160,6 @@ def select_connections(self, value): if port.connection: port.connection._do_highlight = value port.connection.update_path() - # for connection in port.connections(): - # connection._do_highlight = value - # connection.update_path() def contextMenuEvent(self, event): menu = QtWidgets.QMenu(self) From ff8cb96950f29773809733765cfe9825745b19d6 Mon Sep 17 00:00:00 2001 From: Bryan Date: Tue, 14 Mar 2023 17:14:22 -0400 Subject: [PATCH 10/88] update --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 29bb159..550148b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,16 @@ # Logic Node Editor -A very basic minimal code for implementing a node graph or editor using PySide2. In this case we are building with logic nodes. All nodes are built using QGraphics items. +A very basic minimal code for implementing a node graph or editor using PySide6. All nodes are built using QGraphics items. + +## Note +I’ve thought about extending some functionality to this that would be useful for most people wanting to use this to bootstrap projects. + +Save and load. Not sure what file format. Was thinking it’d be cool to save as a compatible graphviz gv file. Other options would be a very basic node at the top, connections on the bottom file format. Keep the logic of node types as python classes. +Implement some compute logic on a node. Maybe as a python class/object with standard input/output with type checking. +Run python code for each node into its own thread when calculating a DAG graph. This would speed processing up on multithreaded systems. And would be nice as a core feature. + + +Let me know what your thoughts are and open an issue to discuss it. I’d like to keep features as open, generalized, and simple as possible. Example video: https://www.youtube.com/watch?v=DOsFJ8lm9dU From 8cad0577c541be9081089ec2087b0719b6ea9477 Mon Sep 17 00:00:00 2001 From: Bryan Date: Tue, 14 Mar 2023 17:15:04 -0400 Subject: [PATCH 11/88] markdown formatting lost and fixed --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 550148b..4bb8650 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ A very basic minimal code for implementing a node graph or editor using PySide6. ## Note I’ve thought about extending some functionality to this that would be useful for most people wanting to use this to bootstrap projects. -Save and load. Not sure what file format. Was thinking it’d be cool to save as a compatible graphviz gv file. Other options would be a very basic node at the top, connections on the bottom file format. Keep the logic of node types as python classes. -Implement some compute logic on a node. Maybe as a python class/object with standard input/output with type checking. -Run python code for each node into its own thread when calculating a DAG graph. This would speed processing up on multithreaded systems. And would be nice as a core feature. +- Save and load. Not sure what file format. Was thinking it’d be cool to save as a compatible graphviz gv file. Other options would be a very basic node at the top, connections on the bottom file format. Keep the logic of node types as python classes. +- Implement some compute logic on a node. Maybe as a python class/object with standard input/output with type checking. +- Run python code for each node into its own thread when calculating a DAG graph. This would speed processing up on multithreaded systems. And would be nice as a core feature. Let me know what your thoughts are and open an issue to discuss it. I’d like to keep features as open, generalized, and simple as possible. From 87eabe177beef7b889a0441533d35d51de48a532 Mon Sep 17 00:00:00 2001 From: Bryan Date: Tue, 14 Mar 2023 19:14:24 -0400 Subject: [PATCH 12/88] Added doc strings --- main.py | 27 ++++++++ node_editor/gui/connection.py | 47 +++++++++++++- node_editor/gui/node.py | 98 +++++++++++++++++++++++++++-- node_editor/gui/node_editor.py | 46 ++++++++++++++ node_editor/gui/node_type_editor.py | 13 ++++ node_editor/gui/node_widget.py | 26 ++++++-- node_editor/gui/port.py | 29 +++++++++ node_editor/gui/view.py | 47 ++++++++++++++ 8 files changed, 320 insertions(+), 13 deletions(-) diff --git a/main.py b/main.py index 5b875a5..2c6ac27 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,15 @@ +""" +A simple Node Editor application that allows the user to create, modify and connect nodes of various types. + +The application consists of a main window that contains a splitter with a Node List and a Node Widget. The Node List +shows a list of available node types, while the Node Widget is where the user can create, edit and connect nodes. + +This application uses PySide6 as a GUI toolkit. + +Author: Bryan Howard +Repo: https://github.com/bhowiebkr/simple-node-editor +""" + import sys from PySide6 import QtWidgets, QtCore, QtGui @@ -64,6 +76,12 @@ def __init__(self, parent=None): self.splitter.restoreState(s) def new_node_cmd(self): + """ + Handles the New Node Type button click event by showing the NodeTypeEditor dialog. + + Returns: + None. + """ node_editor = NodeTypeEditor() if node_editor.exec() == QtWidgets.QDialog.Accepted: @@ -72,6 +90,15 @@ def new_node_cmd(self): print("Dialog canceled") def closeEvent(self, event): + """ + Handles the close event by saving the GUI state and closing the application. + + Args: + event: Close event. + + Returns: + None. + """ self.settings = QtCore.QSettings("node-editor", "NodeEditor") self.settings.setValue("geometry", self.saveGeometry()) self.settings.setValue("splitterSize", self.splitter.saveState()) diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection.py index f5af558..f3555d0 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection.py @@ -2,6 +2,30 @@ class Connection(QtWidgets.QGraphicsPathItem): + """ + A Connection represents a graphical connection between two NodePorts in a PySide6 application. + + Attributes: + start_port (NodePort): The NodePort where the connection starts. + end_port (NodePort): The NodePort where the connection ends. + start_pos (QPointF): The starting position of the connection. + end_pos (QPointF): The ending position of the connection. + + Methods: + delete(): Deletes the connection. + nodes(): Returns a tuple of the two connected nodes. + update_start_and_end_pos(): Updates the starting and ending positions of the connection. + update_path(): Draws a smooth cubic curve from the starting to ending position of the connection. + paint(painter, option=None, widget=None): Override the default paint method depending on if the object is selected. + + Example: + conn = Connection(parent) + conn.start_port = start_port + conn.end_port = end_port + conn.update_start_and_end_pos() + conn.update_path() + """ + def __init__(self, parent): super(Connection, self).__init__(parent) @@ -20,6 +44,9 @@ def __init__(self, parent): self._do_highlight = False def delete(self): + """ + Deletes the connection and removes it from the scene and any connected ports. + """ for port in (self._start_port, self._end_port): if port: # port.remove_connection(self) @@ -47,10 +74,17 @@ def end_port(self, port): self._end_port.connection = self def nodes(self): + """ + Returns a tuple of the two connected nodes. + + Returns: + tuple: A tuple of the two Node objects connected by this Connection. + """ return (self._start_port().node(), self._end_port().node()) def update_start_and_end_pos(self): - """Update the ends of the connection + """ + Update the start and end positions of the Connection. Get the start and end ports and use them to set the start and end positions. """ @@ -71,7 +105,9 @@ def update_start_and_end_pos(self): self.update_path() def update_path(self): - """Draw a smooth cubic curve from the start to end ports""" + """ + Draws a smooth cubic curve from the start to end ports. + """ path = QtGui.QPainterPath() path.moveTo(self.start_pos) @@ -86,7 +122,12 @@ def update_path(self): def paint(self, painter, option=None, widget=None): """ - Override the default paint method depending on if the object is selected + Override the default paint method depending on if the object is selected. + + Args: + painter (QPainter): The QPainter object used to paint the Connection. + option (QStyleOptionGraphicsItem): The style options for the Connection. + widget (QWidget): The widget used to paint the Connection. """ if self.isSelected() or self._do_highlight: painter.setPen(QtGui.QPen(QtGui.QColor(255, 102, 0), 3)) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index 17c5671..d396af0 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -4,6 +4,36 @@ class Node(QtWidgets.QGraphicsPathItem): + """ + A QGraphicsPathItem representing a node in the node editor. + + Attributes + ---------- + node_color : QtGui.QColor + The color of the node. + _title_text : str + The text of the node's title. + _type_text : str + The text of the node's type. + _width : int + The width of the node. + _height : int + The height of the node. + _ports : list + A list of ports connected to this node. + title_path : QtGui.QPainterPath + The path for the title of the node. + type_path : QtGui.QPainterPath + The path for the type of the node. + misc_path : QtGui.QPainterPath + The path for miscellaneous items. + horizontal_margin : int + The horizontal margin of the node. + vertical_margin : int + The vertical margin of the node. + + """ + def __init__(self): super(Node, self).__init__() @@ -43,6 +73,15 @@ def type_text(self, type_text): self._type_text = type_text def paint(self, painter, option=None, widget=None): + """ + Paints the node on the given painter. + + Args: + painter (QtGui.QPainter): The painter to use for drawing the node. + option (QStyleOptionGraphicsItem): The style options to use for drawing the node (optional). + widget (QWidget): The widget to use for drawing the node (optional). + """ + if self.isSelected(): painter.setPen(QtGui.QPen(QtGui.QColor(241, 175, 0), 2)) painter.setBrush(self.node_color) @@ -59,6 +98,19 @@ def paint(self, painter, option=None, widget=None): painter.drawPath(self.misc_path) def add_port(self, name, is_output=False, flags=0, ptr=None): + """ + Adds a new port to the node. + + Args: + name (str): The name of the new port. + is_output (bool, optional): True if the new port is an output port, False if it's an input port. Default is False. + flags (int, optional): A set of flags to apply to the new port. Default is 0. + ptr (Any, optional): A pointer to associate with the new port. Default is None. + + Returns: + None: This method doesn't return anything. + + """ port = Port(self, self.scene()) port.set_is_output(is_output) port.set_name(name) @@ -69,7 +121,16 @@ def add_port(self, name, is_output=False, flags=0, ptr=None): self._ports.append(port) def build(self): - """Build the node""" + """ + Builds the node by constructing its graphical representation. + + This method calculates the dimensions of the node, sets the fonts for various elements, and adds the necessary + graphical components to the node, such as the title, type, and ports. Once the graphical representation of the node + is constructed, the `setPath` method is called to set the path for the node. + + Returns: + None. + """ self.title_path = QtGui.QPainterPath() # reset self.type_path = QtGui.QPainterPath() # The path for the type @@ -156,12 +217,34 @@ def build(self): self._height = total_height def select_connections(self, value): + """ + Sets the highlighting of all connected ports to the specified value. + + This method takes a boolean value `value` as input and sets the `_do_highlight` attribute of all connected ports to + this value. If a port is not connected, this method does nothing for that port. After setting the `_do_highlight` + attribute for all connected ports, the `update_path` method is called for each connection. + + Args: + value: A boolean value indicating whether to highlight the connected ports or not. + + Returns: + None. + """ + for port in self._ports: if port.connection: port.connection._do_highlight = value port.connection.update_path() def contextMenuEvent(self, event): + """Open a context menu when the node is right-clicked. + + Args: + event (QtGui.QContextMenuEvent): The context menu event. + + Returns: + None + """ menu = QtWidgets.QMenu(self) pos = event.pos() @@ -186,10 +269,15 @@ def contextMenuEvent(self, event): # confirm to open in the editor replacing what is existing def delete(self): - """Delete the connection. - Remove any found connections ports by calling :any:`Port.remove_connection`. After connections - have been removed set the stored :any:`Port` to None. Lastly call :any:`QGraphicsScene.removeItem` - on the scene to remove this widget. + """Deletes the connection. + + This function removes any connected ports by calling :any:`Port.remove_connection` for each port + connected to this connection. After all connections have been removed, the stored :any:`Port` + references are set to None. Finally, :any:`QGraphicsScene.removeItem` is called on the scene to + remove this widget. + + Returns: + None """ to_delete = [] diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index 45a0987..357453c 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -6,7 +6,27 @@ class NodeEditor(QtCore.QObject): + """ + The main class of the node editor. This class handles the logic for creating, connecting, and deleting + nodes and connections. + :ivar connection: A Connection object representing the current connection being created. + :vartype connection: Connection + :ivar port: A Port object representing the current port being clicked for a new connection. + :vartype port: Port + :ivar scene: The QGraphicsScene on which the nodes and connections are drawn. + :vartype scene: QGraphicsScene + :ivar _last_selected: The last Node object that was selected. + :vartype _last_selected: Node + """ + def __init__(self, parent): + """ + Constructor for NodeEditor. + + :param parent: The parent widget. + :type parent: QWidget + """ + super(NodeEditor, self).__init__(parent) self.connection = None self.port = None @@ -14,10 +34,26 @@ def __init__(self, parent): self._last_selected = None def install(self, scene): + """ + Installs the NodeEditor into a QGraphicsScene. + + :param scene: The QGraphicsScene to install the NodeEditor into. + :type scene: QGraphicsScene + """ + self.scene = scene self.scene.installEventFilter(self) def item_at(self, position): + """ + Returns the QGraphicsItem at the given position. + + :param position: The position to check for a QGraphicsItem. + :type position: QPoint + :return: The QGraphicsItem at the position, or None if no item is found. + :rtype: QGraphicsItem + """ + items = self.scene.items(QtCore.QRectF(position - QtCore.QPointF(1, 1), QtCore.QSizeF(3, 3))) if items: @@ -25,6 +61,16 @@ def item_at(self, position): return None def eventFilter(self, watched, event): + """ + Filters events from the QGraphicsScene. + + :param watched: The object that is watched. + :type watched: QObject + :param event: The event that is being filtered. + :type event: QEvent + :return: True if the event was filtered, False otherwise. + :rtype: bool + """ if type(event) == QtWidgets.QWidgetItem: return False diff --git a/node_editor/gui/node_type_editor.py b/node_editor/gui/node_type_editor.py index 30cf573..74177cb 100644 --- a/node_editor/gui/node_type_editor.py +++ b/node_editor/gui/node_type_editor.py @@ -2,7 +2,20 @@ class NodeTypeEditor(QtWidgets.QDialog): + """ + A dialog window for editing node types. + + Attributes: + edit (QtWidgets.QLineEdit): A line edit widget for editing the node type. + """ + def __init__(self, parent=None): + """ + Constructs a NodeTypeEditor object. + + Args: + parent (QWidget): The parent widget of this dialog. + """ super().__init__(parent) self.setWindowTitle("Node Type Editor") diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index 9e2f7bb..7c0da2b 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -1,14 +1,9 @@ -# from PySide6.QtWidgets import QWidget, QVBoxLayout, QGraphicsScene - from PySide6 import QtWidgets, QtGui from node_editor.gui.view import View from node_editor.gui.node import Node from node_editor.gui.node_editor import NodeEditor -# import lorem -# import random - def create_input(): node = Node() @@ -83,7 +78,22 @@ def dragMoveEvent(self, e): class NodeWidget(QtWidgets.QWidget): + """ + Widget for creating and displaying a node editor. + + Attributes: + node_editor (NodeEditor): The node editor object. + scene (NodeScene): The scene object for the node editor. + view (View): The view object for the node editor. + """ + def __init__(self, parent): + """ + Initializes the NodeWidget object. + + Args: + parent (QWidget): The parent widget. + """ super(NodeWidget, self).__init__(parent) main_layout = QtWidgets.QVBoxLayout() main_layout.setContentsMargins(0, 0, 0, 0) @@ -101,6 +111,12 @@ def __init__(self, parent): self.view.request_node.connect(self.create_node) def create_node(self, name): + """ + Creates a new node and adds it to the node editor. + + Args: + name (str): The name of the node to be created. + """ print("creating node:", name) if name == "Input": diff --git a/node_editor/gui/port.py b/node_editor/gui/port.py index 48c38f9..f0bae7b 100644 --- a/node_editor/gui/port.py +++ b/node_editor/gui/port.py @@ -2,6 +2,35 @@ class Port(QtWidgets.QGraphicsPathItem): + """A graphics item representing an input or output port for a node in a node-based graphical user interface. + + Attributes: + radius_ (int): The radius of the port circle. + margin (int): The margin between the port circle and the port name text. + port_text_height (int): The height of the port name text. + port_text_width (int): The width of the port name text. + _is_output (bool): True if the port is an output port, False if it is an input port. + _name (str): The name of the port. + m_node (Node): The node to which the port belongs. + connection (Connection): The connection attached to the port, if any. + text_path (QPainterPath): The path used to draw the port name text. + + Methods: + set_is_output(is_output: bool) -> None: Set the output status of the port. + set_name(name: str) -> None: Set the name of the port. + set_node(node: Node) -> None: Set the node to which the port belongs. + set_port_flags(flags: int) -> None: Set the port flags. + set_ptr(ptr: Any) -> None: Set the pointer to the port. + name() -> str: Get the name of the port. + is_output() -> bool: Check if the port is an output port. + node() -> Node: Get the node to which the port belongs. + paint(painter: QtGui.QPainter, option: QtWidgets.QStyleOptionGraphicsItem, widget: Optional[QtWidgets.QWidget]) -> None: Paint the port. + clear_connection() -> None: Clear the connection attached to the port. + can_connect_to(port: Port) -> bool: Check if the port can be connected to another port. + is_connected() -> bool: Check if the port is connected to another port. + itemChange(change: QtWidgets.QGraphicsItem.GraphicsItemChange, value: Any) -> Any: Handle item change events. + """ + def __init__(self, parent, scene): super(Port, self).__init__(parent) diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index b82700a..c6ae2e3 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -5,6 +5,10 @@ class View(QtWidgets.QGraphicsView): + """ + View class for node editor. + """ + _background_color = QtGui.QColor(38, 38, 38) _grid_pen_s = QtGui.QPen(QtGui.QColor(52, 52, 52, 255), 0.5) @@ -43,6 +47,11 @@ def __init__(self, parent): self.setFrameShape(QtWidgets.QFrame.NoFrame) def wheelEvent(self, event): + """ + Handles the wheel events, e.g. zoom in/out. + + :param event: Wheel event. + """ # sometimes you can triger the wheen when panning so we disable when panning if self._pan: return @@ -63,6 +72,11 @@ def wheelEvent(self, event): self.anim.start() def scaling_time(self, x): + """ + Updates the current scale based on the wheel events. + + :param x: The value of the current time. + """ factor = 1.0 + self._numScheduledScalings / 300.0 self.currentScale *= factor @@ -70,12 +84,21 @@ def scaling_time(self, x): self.scale(factor, factor) def anim_finished(self): + """ + Called when the zoom animation is finished. + """ if self._numScheduledScalings > 0: self._numScheduledScalings -= 1 else: self._numScheduledScalings += 1 def drawBackground(self, painter, rect): + """ + Draws the background for the node editor view. + + :param painter: The painter to draw with. + :param rect: The rectangle to be drawn. + """ painter.fillRect(rect, self._background_color) left = int(rect.left()) - (int(rect.left()) % self._grid_size_fine) @@ -124,6 +147,10 @@ def drawBackground(self, painter, rect): return super(View, self).drawBackground(painter, rect) def contextMenuEvent(self, event): + """ + This method is called when a context menu event is triggered in the view. It finds the item at the event position and + shows a context menu if the item is a Node. + """ cursor = QtGui.QCursor() # origin = self.mapFromGlobal(cursor.pos()) pos = self.mapFromGlobal(cursor.pos()) @@ -144,16 +171,28 @@ def contextMenuEvent(self, event): # print("Hello") def dragEnterEvent(self, e): + """ + This method is called when a drag and drop event enters the view. It checks if the mime data format is "text/plain" + and accepts or ignores the event accordingly. + """ if e.mimeData().hasFormat("text/plain"): e.accept() else: e.ignore() def dropEvent(self, e): + """ + This method is called when a drag and drop event is dropped onto the view. It retrieves the name of the dropped node + from the mime data and emits a signal to request the creation of the corresponding node. + """ drop_node_name = e.mimeData().text() self.request_node.emit(drop_node_name) def mousePressEvent(self, event): + """ + This method is called when a mouse press event occurs in the view. It sets the cursor to a closed hand cursor and + enables panning if the middle mouse button is pressed. + """ if event.button() == QtCore.Qt.MiddleButton: self._pan = True self._pan_start_x = event.x() @@ -163,6 +202,10 @@ def mousePressEvent(self, event): return super(View, self).mousePressEvent(event) def mouseReleaseEvent(self, event): + """ + This method is called when a mouse release event occurs in the view. It sets the cursor back to the arrow cursor and + disables panning if the middle mouse button is released. + """ if event.button() == QtCore.Qt.MiddleButton: self._pan = False self.setCursor(QtCore.Qt.ArrowCursor) @@ -170,6 +213,10 @@ def mouseReleaseEvent(self, event): return super(View, self).mouseReleaseEvent(event) def mouseMoveEvent(self, event): + """ + This method is called when a mouse move event occurs in the view. It pans the view if the middle mouse button is + pressed and moves the mouse. + """ if self._pan: self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - (event.x() - self._pan_start_x)) From 93b0a1d2bc2a4e78d95a016897fb9f3bd1a01c13 Mon Sep 17 00:00:00 2001 From: Bryan Date: Tue, 14 Mar 2023 19:26:35 -0400 Subject: [PATCH 13/88] video embed markdown --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4bb8650..0c80e76 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,7 @@ I’ve thought about extending some functionality to this that would be useful f - Run python code for each node into its own thread when calculating a DAG graph. This would speed processing up on multithreaded systems. And would be nice as a core feature. -Let me know what your thoughts are and open an issue to discuss it. I’d like to keep features as open, generalized, and simple as possible. - -Example video: https://www.youtube.com/watch?v=DOsFJ8lm9dU +Let me know what your thoughts are and open a thread in the Discussions tab in github on this repo. I’d like to keep features as open, generalized, and simple as possible. +[![Video](http://img.youtube.com/vi/DOsFJ8lm9dU/0.jpg)](http://www.youtube.com/watch?v=DOsFJ8lm9dU) ![nodes](https://github.com/bhowiebkr/simple-node-editor/blob/master/images/node_editor.jpg) From 86069cc0a1f2ab7af5ac5a9a6252ea6d3e4308f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Schoentgen?= Date: Sat, 18 Mar 2023 15:57:13 +0100 Subject: [PATCH 14/88] Several code smells, improvements, and clean-up --- main.py | 21 ++++++--------- node_editor/gui/connection.py | 4 +-- node_editor/gui/node.py | 22 +++++----------- node_editor/gui/node_editor.py | 40 ++++++++++------------------- node_editor/gui/node_list.py | 6 ++--- node_editor/gui/node_type_editor.py | 2 +- node_editor/gui/node_widget.py | 8 +++--- node_editor/gui/port.py | 27 +++++++------------ node_editor/gui/view.py | 13 +++++----- requirements.txt | 3 ++- 10 files changed, 56 insertions(+), 90 deletions(-) diff --git a/main.py b/main.py index 2c6ac27..97e9856 100644 --- a/main.py +++ b/main.py @@ -10,29 +10,20 @@ Repo: https://github.com/bhowiebkr/simple-node-editor """ -import sys - -from PySide6 import QtWidgets, QtCore, QtGui - import logging -import os -from node_editor.gui.node_widget import NodeWidget +from PySide6 import QtCore, QtGui, QtWidgets + from node_editor.gui.node_list import NodeList from node_editor.gui.node_type_editor import NodeTypeEditor +from node_editor.gui.node_widget import NodeWidget logging.basicConfig(level=logging.DEBUG) -import importlib - -# Import qdarktheme if you have it. If not install it with pip. Dark Themese are great! -if importlib.util.find_spec("qdarktheme") is not None: - import qdarktheme - class NodeEditor(QtWidgets.QMainWindow): def __init__(self, parent=None): - super(NodeEditor, self).__init__(parent) + super().__init__(parent) self.settings = None icon = QtGui.QIcon("resources\\app.ico") @@ -106,6 +97,10 @@ def closeEvent(self, event): if __name__ == "__main__": + import sys + + import qdarktheme + app = QtWidgets.QApplication(sys.argv) app.setWindowIcon(QtGui.QIcon("resources\\app.ico")) qdarktheme.setup_theme() diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection.py index f3555d0..ba0f7f4 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection.py @@ -1,4 +1,4 @@ -from PySide6 import QtWidgets, QtGui, QtCore +from PySide6 import QtCore, QtGui, QtWidgets class Connection(QtWidgets.QGraphicsPathItem): @@ -27,7 +27,7 @@ class Connection(QtWidgets.QGraphicsPathItem): """ def __init__(self, parent): - super(Connection, self).__init__(parent) + super().__init__(parent) self.setFlag(QtWidgets.QGraphicsPathItem.ItemIsSelectable) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index d396af0..b46fe1f 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -1,4 +1,4 @@ -from PySide6 import QtWidgets, QtGui, QtCore +from PySide6 import QtCore, QtGui, QtWidgets from node_editor.gui.port import Port @@ -35,7 +35,7 @@ class Node(QtWidgets.QGraphicsPathItem): """ def __init__(self): - super(Node, self).__init__() + super().__init__() self.setFlag(QtWidgets.QGraphicsPathItem.ItemIsMovable) self.setFlag(QtWidgets.QGraphicsPathItem.ItemIsSelectable) @@ -84,10 +84,9 @@ def paint(self, painter, option=None, widget=None): if self.isSelected(): painter.setPen(QtGui.QPen(QtGui.QColor(241, 175, 0), 2)) - painter.setBrush(self.node_color) else: painter.setPen(self.node_color.lighter()) - painter.setBrush(self.node_color) + painter.setBrush(self.node_color) painter.drawPath(self.path()) painter.setPen(QtCore.Qt.NoPen) @@ -137,7 +136,6 @@ def build(self): self.misc_path = QtGui.QPainterPath() # a bunch of other stuff total_width = 0 - total_height = 0 path = QtGui.QPainterPath() # The main path # The fonts what will be used @@ -152,7 +150,7 @@ def build(self): } title_type_dim = { - "w": QtGui.QFontMetrics(title_type_font).horizontalAdvance("(" + self._type_text + ")"), + "w": QtGui.QFontMetrics(title_type_font).horizontalAdvance(f"({self._type_text})"), "h": QtGui.QFontMetrics(title_type_font).height(), } @@ -162,8 +160,7 @@ def build(self): total_width = dim # Add both the title and type height together for the total height - for dim in [title_dim["h"], title_type_dim["h"]]: - total_height += dim + total_height = sum([title_dim["h"], title_type_dim["h"]]) port_dim = None # Add the heigth for each of the ports @@ -198,7 +195,7 @@ def build(self): -title_type_dim["w"] / 2, (-total_height / 2) + title_dim["h"] + title_type_dim["h"], title_type_font, - "(" + self._type_text + ")", + f"({self._type_text})", ) if port_dim: @@ -280,12 +277,7 @@ def delete(self): None """ - to_delete = [] - - for port in self._ports: - if port.connection: - to_delete.append(port.connection) - + to_delete = [port.connection for port in self._ports if port.connection] for connection in to_delete: connection.delete() diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index 357453c..75af872 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -1,4 +1,6 @@ -from PySide6 import QtWidgets, QtCore +from contextlib import suppress + +from PySide6 import QtCore, QtWidgets from node_editor.gui.connection import Connection from node_editor.gui.node import Node @@ -27,7 +29,7 @@ def __init__(self, parent): :type parent: QWidget """ - super(NodeEditor, self).__init__(parent) + super().__init__(parent) self.connection = None self.port = None self.scene = None @@ -55,10 +57,7 @@ def item_at(self, position): """ items = self.scene.items(QtCore.QRectF(position - QtCore.QPointF(1, 1), QtCore.QSizeF(3, 3))) - - if items: - return items[0] - return None + return items[0] if items else None def eventFilter(self, watched, event): """ @@ -87,7 +86,7 @@ def eventFilter(self, watched, event): self.connection.update_path() return True - elif isinstance(item, Connection): + if isinstance(item, Connection): self.connection = Connection(None) self.connection.start_pos = item.start_pos self.scene.addItem(self.connection) @@ -96,24 +95,15 @@ def eventFilter(self, watched, event): self.connection.update_start_and_end_pos() # to fix the offset return True - elif isinstance(item, Node): - if self._last_selected: - # If we clear the scene, we loose the last selection - try: - self._last_selected.select_connections(False) - except RuntimeError: - pass + if self._last_selected: + # If we clear the scene, we loose the last selection + with suppress(RuntimeError): + self._last_selected.select_connections(False) + if isinstance(item, Node): item.select_connections(True) self._last_selected = item - else: - try: - if self._last_selected: - self._last_selected.select_connections(False) - except RuntimeError: - pass - self._last_selected = None elif event.button() == QtCore.Qt.RightButton: @@ -152,15 +142,13 @@ def eventFilter(self, watched, event): item.clear_connection() self.connection.start_port = self.port - self.connection.end_port = item - self.connection.update_start_and_end_pos() - self.connection = None else: print("Deleting connection") self.connection.delete() - self.connection = None + + self.connection = None if self.connection: self.connection.delete() @@ -168,4 +156,4 @@ def eventFilter(self, watched, event): self.port = None return True - return super(NodeEditor, self).eventFilter(watched, event) + return super().eventFilter(watched, event) diff --git a/node_editor/gui/node_list.py b/node_editor/gui/node_list.py index 1085d2f..85d8541 100644 --- a/node_editor/gui/node_list.py +++ b/node_editor/gui/node_list.py @@ -1,9 +1,9 @@ -from PySide6 import QtWidgets, QtCore, QtGui +from PySide6 import QtCore, QtGui, QtWidgets class NodeList(QtWidgets.QListWidget): def __init__(self, parent=None): - super(NodeList, self).__init__(parent) + super().__init__(parent) for node in ["Input", "Output", "And", "Not", "Nor", "Empty"]: item = QtWidgets.QListWidgetItem(node) @@ -27,4 +27,4 @@ def mousePressEvent(self, event): drag.setPixmap(pixmap) drag.exec_() - super(NodeList, self).mousePressEvent(event) + super().mousePressEvent(event) diff --git a/node_editor/gui/node_type_editor.py b/node_editor/gui/node_type_editor.py index 74177cb..78ea850 100644 --- a/node_editor/gui/node_type_editor.py +++ b/node_editor/gui/node_type_editor.py @@ -1,4 +1,4 @@ -from PySide6 import QtWidgets, QtGui +from PySide6 import QtWidgets class NodeTypeEditor(QtWidgets.QDialog): diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index 7c0da2b..9005a76 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -1,8 +1,8 @@ -from PySide6 import QtWidgets, QtGui +from PySide6 import QtGui, QtWidgets -from node_editor.gui.view import View from node_editor.gui.node import Node from node_editor.gui.node_editor import NodeEditor +from node_editor.gui.view import View def create_input(): @@ -69,7 +69,7 @@ def dragEnterEvent(self, e): def dropEvent(self, e): # find item at these coordinates item = self.itemAt(e.scenePos()) - if item.setAcceptDrops == True: + if item.setAcceptDrops: # pass on event to item at the coordinates item.dropEvent(e) @@ -94,7 +94,7 @@ def __init__(self, parent): Args: parent (QWidget): The parent widget. """ - super(NodeWidget, self).__init__(parent) + super().__init__(parent) main_layout = QtWidgets.QVBoxLayout() main_layout.setContentsMargins(0, 0, 0, 0) self.setLayout(main_layout) diff --git a/node_editor/gui/port.py b/node_editor/gui/port.py index f0bae7b..2db842d 100644 --- a/node_editor/gui/port.py +++ b/node_editor/gui/port.py @@ -1,4 +1,4 @@ -from PySide6 import QtWidgets, QtGui, QtCore +from PySide6 import QtCore, QtGui, QtWidgets class Port(QtWidgets.QGraphicsPathItem): @@ -32,7 +32,7 @@ class Port(QtWidgets.QGraphicsPathItem): """ def __init__(self, parent, scene): - super(Port, self).__init__(parent) + super().__init__(parent) self.radius_ = 5 self.margin = 2 @@ -66,15 +66,12 @@ def set_name(self, name): if self._is_output: x = -self.radius_ - self.margin - self.port_text_width - y = self.port_text_height / 4 - - self.text_path.addText(x, y, self.font, nice_name) - else: x = self.radius_ + self.margin - y = self.port_text_height / 4 - self.text_path.addText(x, y, self.font, nice_name) + y = self.port_text_height / 4 + + self.text_path.addText(x, y, self.font, nice_name) def set_node(self, node): self.m_node = node @@ -114,19 +111,13 @@ def can_connect_to(self, port): if port.node() == self.node(): return False - if self._is_output == port._is_output: - return False - - return True + return self._is_output != port._is_output def is_connected(self): - if self.connection: - return True - return False + return bool(self.connection) def itemChange(self, change, value): - if change == QtWidgets.QGraphicsItem.ItemScenePositionHasChanged: - if self.connection: - self.connection.update_start_and_end_pos() + if change == QtWidgets.QGraphicsItem.ItemScenePositionHasChanged and self.connection: + self.connection.update_start_and_end_pos() return value diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index c6ae2e3..f2ac036 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -1,6 +1,5 @@ -from PySide6 import QtCore, QtGui, QtWidgets, QtOpenGLWidgets +from PySide6 import QtCore, QtGui, QtOpenGLWidgets, QtWidgets -from node_editor.gui.connection import Connection from node_editor.gui.node import Node @@ -22,7 +21,7 @@ class View(QtWidgets.QGraphicsView): request_node = QtCore.Signal(str) def __init__(self, parent): - super(View, self).__init__(parent) + super().__init__(parent) self.setRenderHint(QtGui.QPainter.Antialiasing) self._manipulationMode = 0 @@ -144,7 +143,7 @@ def drawBackground(self, painter, rect): y += self._grid_size_course painter.drawLines(gridLines) - return super(View, self).drawBackground(painter, rect) + return super().drawBackground(painter, rect) def contextMenuEvent(self, event): """ @@ -199,7 +198,7 @@ def mousePressEvent(self, event): self._pan_start_y = event.y() self.setCursor(QtCore.Qt.ClosedHandCursor) - return super(View, self).mousePressEvent(event) + return super().mousePressEvent(event) def mouseReleaseEvent(self, event): """ @@ -210,7 +209,7 @@ def mouseReleaseEvent(self, event): self._pan = False self.setCursor(QtCore.Qt.ArrowCursor) - return super(View, self).mouseReleaseEvent(event) + return super().mouseReleaseEvent(event) def mouseMoveEvent(self, event): """ @@ -225,4 +224,4 @@ def mouseMoveEvent(self, event): self._pan_start_x = event.x() self._pan_start_y = event.y() - return super(View, self).mouseMoveEvent(event) + return super().mouseMoveEvent(event) diff --git a/requirements.txt b/requirements.txt index e3f31e2..8a16d08 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -PySide6 \ No newline at end of file +pyqtdarktheme +PySide6 From 845c1f790005496c412769864809ab790f06bfea Mon Sep 17 00:00:00 2001 From: Bryan Date: Sun, 19 Mar 2023 04:46:11 -0400 Subject: [PATCH 15/88] fixed- mouse wheel must have gotten broken from when moving from pyside2 ->pyside6 --- node_editor/gui/view.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index f2ac036..141d8d9 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -55,8 +55,8 @@ def wheelEvent(self, event): if self._pan: return - num_degrees = event.delta() / 8.0 - num_steps = num_degrees / 5.0 + num_degrees = event.angleDelta() / 8.0 + num_steps = num_degrees.y() / 5.0 self._numScheduledScalings += num_steps # If the user moved the wheel another direction, we reset previously scheduled scalings From d4ddbeb7273648274222281c35f2ac0d427bf288 Mon Sep 17 00:00:00 2001 From: Bryan Date: Tue, 4 Apr 2023 18:14:21 -0400 Subject: [PATCH 16/88] example project --- Example_Project/Add_node.py | 13 ++++++++++ Example_Project/test.json | 48 +++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 Example_Project/Add_node.py create mode 100644 Example_Project/test.json diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py new file mode 100644 index 0000000..d1cd508 --- /dev/null +++ b/Example_Project/Add_node.py @@ -0,0 +1,13 @@ +from node_editor.gui.node import Node + + +class Add_Node(Node): + def __init__(self): + super().__init__() + + self.title = "Add" + self.type_text = "Logic Nodes" + self.add_port(name="input A", is_output=False) + self.add_port(name="input B", is_output=False) + self.add_port(name="output", is_output=True) + self.build() diff --git a/Example_Project/test.json b/Example_Project/test.json new file mode 100644 index 0000000..0ab9e3a --- /dev/null +++ b/Example_Project/test.json @@ -0,0 +1,48 @@ +{ + "nodes": [ + { + "type": "Add_Node", + "x": 5012, + "y": 4886, + "uuid": "be2827cf-6e4a-4902-b3f7-3c0d9c19ef2f" + }, + { + "type": "Add_Node", + "x": 4807, + "y": 5164, + "uuid": "69ef5cfe-9f44-411b-83d6-f6aa8790d92e" + }, + { + "type": "Add_Node", + "x": 4494, + "y": 4991, + "uuid": "cc0a484c-c044-4dce-89a0-cab99bb0becb" + }, + { + "type": "Add_Node", + "x": 4639, + "y": 4847, + "uuid": "85902a44-f54d-4c46-ac76-b58e365daa06" + } + ], + "connections": [ + { + "start_id": "69ef5cfe-9f44-411b-83d6-f6aa8790d92e", + "end_id": "be2827cf-6e4a-4902-b3f7-3c0d9c19ef2f", + "start_port": "output", + "end_port": "input B" + }, + { + "start_id": "85902a44-f54d-4c46-ac76-b58e365daa06", + "end_id": "be2827cf-6e4a-4902-b3f7-3c0d9c19ef2f", + "start_port": "output", + "end_port": "input A" + }, + { + "start_id": "cc0a484c-c044-4dce-89a0-cab99bb0becb", + "end_id": "85902a44-f54d-4c46-ac76-b58e365daa06", + "start_port": "output", + "end_port": "input B" + } + ] +} \ No newline at end of file From c827e3ea3e30103a76a32d4359ee472569cf5439 Mon Sep 17 00:00:00 2001 From: Bryan Date: Tue, 4 Apr 2023 18:14:55 -0400 Subject: [PATCH 17/88] Loading project, and saving scene description --- main.py | 51 +++++++++++- node_editor/gui/connection.py | 2 +- node_editor/gui/node.py | 1 + node_editor/gui/node_list.py | 23 +++++- node_editor/gui/node_widget.py | 138 +++++++++++++-------------------- node_editor/gui/view.py | 6 +- 6 files changed, 129 insertions(+), 92 deletions(-) diff --git a/main.py b/main.py index 97e9856..3adf711 100644 --- a/main.py +++ b/main.py @@ -11,6 +11,7 @@ """ import logging +from pathlib import Path from PySide6 import QtCore, QtGui, QtWidgets @@ -22,9 +23,12 @@ class NodeEditor(QtWidgets.QMainWindow): + OnProjectPathUpdate = QtCore.Signal(Path) + def __init__(self, parent=None): super().__init__(parent) self.settings = None + self.project_path = None icon = QtGui.QIcon("resources\\app.ico") self.setWindowIcon(icon) @@ -32,6 +36,18 @@ def __init__(self, parent=None): self.setWindowTitle("Simple Node Editor") settings = QtCore.QSettings("node-editor", "NodeEditor") + # create a "File" menu and add an "Export CSV" action to it + file_menu = QtWidgets.QMenu("File", self) + self.menuBar().addMenu(file_menu) + + load_action = QtGui.QAction("Load Project", self) + load_action.triggered.connect(self.load_project) + file_menu.addAction(load_action) + + save_action = QtGui.QAction("Save Project", self) + save_action.triggered.connect(self.save_project) + file_menu.addAction(save_action) + # Layouts main_widget = QtWidgets.QWidget() self.setCentralWidget(main_widget) @@ -41,7 +57,7 @@ def __init__(self, parent=None): left_layout.setContentsMargins(0, 0, 0, 0) # Widgets - self.node_list = NodeList() + self.node_list = NodeList(self) left_widget = QtWidgets.QWidget() self.splitter = QtWidgets.QSplitter() self.node_widget = NodeWidget(self) @@ -56,8 +72,11 @@ def __init__(self, parent=None): left_layout.addWidget(new_node_type_btn) main_layout.addWidget(self.splitter) - # Logic + # Signals new_node_type_btn.clicked.connect(self.new_node_cmd) + self.OnProjectPathUpdate.connect(self.node_list.update_project_path) + + self.load_project("C:/Users/Howard/simple-node-editor/Example_project") # Restore GUI from last state if settings.contains("geometry"): @@ -66,6 +85,30 @@ def __init__(self, parent=None): s = settings.value("splitterSize") self.splitter.restoreState(s) + def save_project(self): + file_dialog = QtWidgets.QFileDialog() + file_dialog.setAcceptMode(QtWidgets.QFileDialog.AcceptSave) + file_dialog.setDefaultSuffix("json") + file_dialog.setNameFilter("JSON files (*.json)") + file_path, _ = file_dialog.getSaveFileName() + self.node_widget.save_project(file_path) + + def load_project(self, project_path=None): + if not project_path: + return + + project_path = Path(project_path) + if project_path.exists() and project_path.is_dir(): + self.project_path = project_path + self.OnProjectPathUpdate.emit(project_path) + + def get_project_path(self): + project_path = QtWidgets.QFileDialog.getExistingDirectory(None, "Select Project Folder", "") + if not project_path: + return + + self.load_project(project_path) + def new_node_cmd(self): """ Handles the New Node Type button click event by showing the NodeTypeEditor dialog. @@ -90,6 +133,10 @@ def closeEvent(self, event): Returns: None. """ + + # debugging lets save the scene: + self.node_widget.save_project("C:/Users/Howard/simple-node-editor/Example_Project/test.json") + self.settings = QtCore.QSettings("node-editor", "NodeEditor") self.settings.setValue("geometry", self.saveGeometry()) self.settings.setValue("splitterSize", self.splitter.saveState()) diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection.py index ba0f7f4..2c36d31 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection.py @@ -80,7 +80,7 @@ def nodes(self): Returns: tuple: A tuple of the two Node objects connected by this Connection. """ - return (self._start_port().node(), self._end_port().node()) + return (self._start_port.node(), self._end_port.node()) def update_start_and_end_pos(self): """ diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index b46fe1f..eeac8fa 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -46,6 +46,7 @@ def __init__(self): self._width = 30 # The Width of the node self._height = 30 # the height of the node self._ports = [] # A list of ports + self.uuid = None # An identifier to used when saving and loading the scene self.node_color = QtGui.QColor(20, 20, 20, 200) diff --git a/node_editor/gui/node_list.py b/node_editor/gui/node_list.py index 85d8541..39cfae0 100644 --- a/node_editor/gui/node_list.py +++ b/node_editor/gui/node_list.py @@ -1,16 +1,30 @@ from PySide6 import QtCore, QtGui, QtWidgets +import sys +import importlib +import inspect class NodeList(QtWidgets.QListWidget): def __init__(self, parent=None): super().__init__(parent) + self.setDragEnabled(True) # enable dragging - for node in ["Input", "Output", "And", "Not", "Nor", "Empty"]: - item = QtWidgets.QListWidgetItem(node) + def update_project_path(self, project_path): + print("project path updated") + for file in project_path.glob("*.py"): + print(f"File: {file.stem}") + spec = importlib.util.spec_from_file_location(file.stem, file) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + item = QtWidgets.QListWidgetItem(file.stem) + item.module = module + for name, obj in inspect.getmembers(module): + if inspect.isclass(obj): + item.class_name = obj + break self.addItem(item) - self.setDragEnabled(True) # enable dragging - def mousePressEvent(self, event): item = self.itemAt(event.pos()) if item and item.text(): @@ -19,6 +33,7 @@ def mousePressEvent(self, event): drag = QtGui.QDrag(self) mime_data = QtCore.QMimeData() mime_data.setText(name) + mime_data.item = item drag.setMimeData(mime_data) # Drag needs a pixmap or else it'll error due to a null pixmap diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index 9005a76..ba781b4 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -1,65 +1,14 @@ +import json +import uuid from PySide6 import QtGui, QtWidgets from node_editor.gui.node import Node from node_editor.gui.node_editor import NodeEditor from node_editor.gui.view import View - -def create_input(): - node = Node() - node.title = "A" - node.type_text = "input" - node.add_port(name="output", is_output=True) - node.build() - return node - - -def create_output(): - node = Node() - node.title = "A" - node.type_text = "output" - node.add_port(name="input", is_output=False) - node.build() - return node - - -def create_and(): - node = Node() - node.title = "AND" - node.type_text = "built-in" - node.add_port(name="input A", is_output=False) - node.add_port(name="input B", is_output=False) - node.add_port(name="output", is_output=True) - node.build() - return node - - -def create_not(): - node = Node() - node.title = "NOT" - node.type_text = "built-in" - node.add_port(name="input", is_output=False) - node.add_port(name="output", is_output=True) - node.build() - return node - - -def create_nor(): - node = Node() - node.title = "NOR" - node.type_text = "built-in" - node.add_port(name="input", is_output=False) - node.add_port(name="output", is_output=True) - node.build() - return node - - -def create_empty(): - node = Node() - node.title = "NOR" - node.type_text = "empty node" - node.build() - return node +from node_editor.gui.connection import Connection +from node_editor.gui.node import Node +from node_editor.gui.port import Port class NodeScene(QtWidgets.QGraphicsScene): @@ -110,32 +59,57 @@ def __init__(self, parent): self.view.request_node.connect(self.create_node) - def create_node(self, name): - """ - Creates a new node and adds it to the node editor. - - Args: - name (str): The name of the node to be created. - """ - print("creating node:", name) - - if name == "Input": - node = create_input() - elif name == "Output": - node = create_output() - elif name == "And": - node = create_and() - elif name == "Not": - node = create_not() - elif name == "Nor": - node = create_nor() - elif name == "Empty": - node = create_empty() - else: - print(f"Can't find a premade node for {name}") - return - + def create_node(self, node): + node.uuid = uuid.uuid4() self.scene.addItem(node) - pos = self.view.mapFromGlobal(QtGui.QCursor.pos()) node.setPos(self.view.mapToScene(pos)) + + def save_project(self, json_path): + # print(f"json path: {json_path}") + scene = {"nodes": [], "connections": []} + + # Need the nodes, and connections of ports to nodes + for item in self.scene.items(): + # Connections + if isinstance(item, Connection): + # print(f"Name: {item}") + nodes = item.nodes() + start_id = str(nodes[0].uuid) + end_id = str(nodes[1].uuid) + start_port = item.start_port.name() + end_port = item.end_port.name() + # print(f"Node ids {start_id, end_id}") + # print(f"connected ports {item.start_port.name(), item.end_port.name()}") + + connection = { + "start_id": start_id, + "end_id": end_id, + "start_port": start_port, + "end_port": end_port, + } + scene["connections"].append(connection) + continue + + # Ports + if isinstance(item, Port): + continue + + # Nodes + if isinstance(item, Node): + print("found node") + pos = item.pos().toPoint() + x, y = pos.x(), pos.y() + print(f"pos: {x, y}") + + obj_type = type(item).__name__ + print(f"node type: {obj_type}") + + node_id = str(item.uuid) + + node = {"type": obj_type, "x": x, "y": y, "uuid": node_id} + scene["nodes"].append(node) + + # Write the items_info dictionary to a JSON file + with open(json_path, "w") as f: + json.dump(scene, f, indent=4) diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index 141d8d9..03de4ec 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -18,7 +18,7 @@ class View(QtWidgets.QGraphicsView): _mouse_wheel_zoom_rate = 0.0015 - request_node = QtCore.Signal(str) + request_node = QtCore.Signal(object) def __init__(self, parent): super().__init__(parent) @@ -184,8 +184,8 @@ def dropEvent(self, e): This method is called when a drag and drop event is dropped onto the view. It retrieves the name of the dropped node from the mime data and emits a signal to request the creation of the corresponding node. """ - drop_node_name = e.mimeData().text() - self.request_node.emit(drop_node_name) + node = e.mimeData().item.class_name + self.request_node.emit(node()) def mousePressEvent(self, event): """ From 64b81840ab892129a3560a0ac0e9391ac3ba7cae Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 17:54:05 -0400 Subject: [PATCH 18/88] scene updated --- Example_Project/test.json | 72 +++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/Example_Project/test.json b/Example_Project/test.json index 0ab9e3a..f519605 100644 --- a/Example_Project/test.json +++ b/Example_Project/test.json @@ -2,47 +2,83 @@ "nodes": [ { "type": "Add_Node", - "x": 5012, - "y": 4886, - "uuid": "be2827cf-6e4a-4902-b3f7-3c0d9c19ef2f" + "x": 4794, + "y": 5130, + "uuid": "f20b2350-0bc9-40be-9ddd-510d16ae8cc8" }, { "type": "Add_Node", - "x": 4807, - "y": 5164, - "uuid": "69ef5cfe-9f44-411b-83d6-f6aa8790d92e" + "x": 4666, + "y": 4864, + "uuid": "24ac8fd5-b91a-4c35-bfdc-bf96961da280" }, { "type": "Add_Node", - "x": 4494, - "y": 4991, - "uuid": "cc0a484c-c044-4dce-89a0-cab99bb0becb" + "x": 4617, + "y": 5014, + "uuid": "a06586f8-3c66-48ca-8be7-fd99b9ee82c3" }, { "type": "Add_Node", - "x": 4639, - "y": 4847, - "uuid": "85902a44-f54d-4c46-ac76-b58e365daa06" + "x": 4943, + "y": 5114, + "uuid": "e06066a5-6375-4a40-8d14-c7e5e9c28f02" + }, + { + "type": "Add_Node", + "x": 4949, + "y": 4926, + "uuid": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b" + }, + { + "type": "Add_Node", + "x": 5165, + "y": 5007, + "uuid": "0fe0381a-29bc-4987-ba94-ba4a14e33a13" + }, + { + "type": "Add_Node", + "x": 5358, + "y": 4944, + "uuid": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b" } ], "connections": [ { - "start_id": "69ef5cfe-9f44-411b-83d6-f6aa8790d92e", - "end_id": "be2827cf-6e4a-4902-b3f7-3c0d9c19ef2f", + "start_id": "f20b2350-0bc9-40be-9ddd-510d16ae8cc8", + "end_id": "e06066a5-6375-4a40-8d14-c7e5e9c28f02", "start_port": "output", "end_port": "input B" }, { - "start_id": "85902a44-f54d-4c46-ac76-b58e365daa06", - "end_id": "be2827cf-6e4a-4902-b3f7-3c0d9c19ef2f", + "start_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", + "end_id": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b", + "start_port": "output", + "end_port": "input B" + }, + { + "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "end_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", "start_port": "output", "end_port": "input A" }, { - "start_id": "cc0a484c-c044-4dce-89a0-cab99bb0becb", - "end_id": "85902a44-f54d-4c46-ac76-b58e365daa06", + "start_id": "e06066a5-6375-4a40-8d14-c7e5e9c28f02", + "end_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", + "start_port": "output", + "end_port": "input B" + }, + { + "start_id": "a06586f8-3c66-48ca-8be7-fd99b9ee82c3", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", "start_port": "output", "end_port": "input B" + }, + { + "start_id": "24ac8fd5-b91a-4c35-bfdc-bf96961da280", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_port": "output", + "end_port": "input A" } ] } \ No newline at end of file From 4f45ddbce493e7ac6f2ccf1b1e0350d80f544b1b Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 18:02:12 -0400 Subject: [PATCH 19/88] moded loading modules here and now reading first json file --- main.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 3adf711..6819f7e 100644 --- a/main.py +++ b/main.py @@ -12,6 +12,8 @@ import logging from pathlib import Path +import importlib +import inspect from PySide6 import QtCore, QtGui, QtWidgets @@ -29,6 +31,7 @@ def __init__(self, parent=None): super().__init__(parent) self.settings = None self.project_path = None + self.imports = None # we will store the project import node types here for now. icon = QtGui.QIcon("resources\\app.ico") self.setWindowIcon(icon) @@ -74,7 +77,6 @@ def __init__(self, parent=None): # Signals new_node_type_btn.clicked.connect(self.new_node_cmd) - self.OnProjectPathUpdate.connect(self.node_list.update_project_path) self.load_project("C:/Users/Howard/simple-node-editor/Example_project") @@ -100,7 +102,25 @@ def load_project(self, project_path=None): project_path = Path(project_path) if project_path.exists() and project_path.is_dir(): self.project_path = project_path - self.OnProjectPathUpdate.emit(project_path) + + self.imports = {} + + for file in project_path.glob("*.py"): + spec = importlib.util.spec_from_file_location(file.stem, file) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + for name, obj in inspect.getmembers(module): + if inspect.isclass(obj): + self.imports[obj.__name__] = {"class": obj, "module": module} + break + + self.node_list.update_project(self.imports) + + # work on just the first json file. add the ablitity to work on multiple json files later + for json_path in project_path.glob("*.json"): + self.node_widget.load_scene(json_path, self.imports) + break def get_project_path(self): project_path = QtWidgets.QFileDialog.getExistingDirectory(None, "Select Project Folder", "") @@ -135,7 +155,7 @@ def closeEvent(self, event): """ # debugging lets save the scene: - self.node_widget.save_project("C:/Users/Howard/simple-node-editor/Example_Project/test.json") + # self.node_widget.save_project("C:/Users/Howard/simple-node-editor/Example_Project/test.json") self.settings = QtCore.QSettings("node-editor", "NodeEditor") self.settings.setValue("geometry", self.saveGeometry()) From 366297f7d4898ca1bfd12bfb2b358f44c29ed994 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 18:02:20 -0400 Subject: [PATCH 20/88] update --- Example_Project/test.json | 64 +++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/Example_Project/test.json b/Example_Project/test.json index f519605..0aee684 100644 --- a/Example_Project/test.json +++ b/Example_Project/test.json @@ -2,21 +2,21 @@ "nodes": [ { "type": "Add_Node", - "x": 4794, - "y": 5130, - "uuid": "f20b2350-0bc9-40be-9ddd-510d16ae8cc8" + "x": 5374, + "y": 4897, + "uuid": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b" }, { "type": "Add_Node", - "x": 4666, - "y": 4864, - "uuid": "24ac8fd5-b91a-4c35-bfdc-bf96961da280" + "x": 5165, + "y": 5007, + "uuid": "0fe0381a-29bc-4987-ba94-ba4a14e33a13" }, { "type": "Add_Node", - "x": 4617, - "y": 5014, - "uuid": "a06586f8-3c66-48ca-8be7-fd99b9ee82c3" + "x": 4949, + "y": 4926, + "uuid": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b" }, { "type": "Add_Node", @@ -26,59 +26,59 @@ }, { "type": "Add_Node", - "x": 4949, - "y": 4926, - "uuid": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b" + "x": 4617, + "y": 5014, + "uuid": "a06586f8-3c66-48ca-8be7-fd99b9ee82c3" }, { "type": "Add_Node", - "x": 5165, - "y": 5007, - "uuid": "0fe0381a-29bc-4987-ba94-ba4a14e33a13" + "x": 4666, + "y": 4864, + "uuid": "24ac8fd5-b91a-4c35-bfdc-bf96961da280" }, { "type": "Add_Node", - "x": 5358, - "y": 4944, - "uuid": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b" + "x": 4794, + "y": 5130, + "uuid": "f20b2350-0bc9-40be-9ddd-510d16ae8cc8" } ], "connections": [ { - "start_id": "f20b2350-0bc9-40be-9ddd-510d16ae8cc8", - "end_id": "e06066a5-6375-4a40-8d14-c7e5e9c28f02", + "start_id": "24ac8fd5-b91a-4c35-bfdc-bf96961da280", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", "start_port": "output", - "end_port": "input B" + "end_port": "input A" }, { - "start_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", - "end_id": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b", + "start_id": "a06586f8-3c66-48ca-8be7-fd99b9ee82c3", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", "start_port": "output", "end_port": "input B" }, { - "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_id": "e06066a5-6375-4a40-8d14-c7e5e9c28f02", "end_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", "start_port": "output", - "end_port": "input A" + "end_port": "input B" }, { - "start_id": "e06066a5-6375-4a40-8d14-c7e5e9c28f02", + "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", "end_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", "start_port": "output", - "end_port": "input B" + "end_port": "input A" }, { - "start_id": "a06586f8-3c66-48ca-8be7-fd99b9ee82c3", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", + "end_id": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b", "start_port": "output", "end_port": "input B" }, { - "start_id": "24ac8fd5-b91a-4c35-bfdc-bf96961da280", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_id": "f20b2350-0bc9-40be-9ddd-510d16ae8cc8", + "end_id": "e06066a5-6375-4a40-8d14-c7e5e9c28f02", "start_port": "output", - "end_port": "input A" + "end_port": "input B" } ] } \ No newline at end of file From 7dac9beba96ccf4600d9d601042e29d78616cf2b Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 18:02:50 -0400 Subject: [PATCH 21/88] removed importing modules. Just add to the list the class nodes now. --- node_editor/gui/node_list.py | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/node_editor/gui/node_list.py b/node_editor/gui/node_list.py index 39cfae0..e89bad8 100644 --- a/node_editor/gui/node_list.py +++ b/node_editor/gui/node_list.py @@ -9,20 +9,13 @@ def __init__(self, parent=None): super().__init__(parent) self.setDragEnabled(True) # enable dragging - def update_project_path(self, project_path): - print("project path updated") - for file in project_path.glob("*.py"): - print(f"File: {file.stem}") - spec = importlib.util.spec_from_file_location(file.stem, file) - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - - item = QtWidgets.QListWidgetItem(file.stem) - item.module = module - for name, obj in inspect.getmembers(module): - if inspect.isclass(obj): - item.class_name = obj - break + def update_project(self, imports): + # make an item for each custom class + + for name, data in imports.items(): + item = QtWidgets.QListWidgetItem(name) + item.module = data["module"] + item.class_name = data["class"] self.addItem(item) def mousePressEvent(self, event): From ec9917f50a3b43b95fa4c9c4b8551734117867b0 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 18:03:15 -0400 Subject: [PATCH 22/88] loading scene by json description --- node_editor/gui/node_widget.py | 47 +++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index ba781b4..6284ff3 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -1,5 +1,7 @@ import json import uuid +from collections import OrderedDict + from PySide6 import QtGui, QtWidgets from node_editor.gui.node import Node @@ -44,6 +46,8 @@ def __init__(self, parent): parent (QWidget): The parent widget. """ super().__init__(parent) + + self.node_lookup = {} # A dictionary of nodes, by uuids for faster looking up. Refactor this in the future main_layout = QtWidgets.QVBoxLayout() main_layout.setContentsMargins(0, 0, 0, 0) self.setLayout(main_layout) @@ -65,8 +69,45 @@ def create_node(self, node): pos = self.view.mapFromGlobal(QtGui.QCursor.pos()) node.setPos(self.view.mapToScene(pos)) + def load_scene(self, json_path, imports): + # load the scene json file + data = None + with open(json_path) as f: + data = json.load(f) + + # clear out the node lookup + self.node_lookup = {} + + # Add the nodes + if data: + for node in data["nodes"]: + info = imports[node["type"]] + node_item = info["class"]() + node_item.uuid = node["uuid"] + self.scene.addItem(node_item) + node_item.setPos(node["x"], node["y"]) + + self.node_lookup[node["uuid"]] = node_item + + # Add the connections + for c in data["connections"]: + connection = Connection(None) + self.scene.addItem(connection) + + start_port = self.node_lookup[c["start_id"]].get_port(c["start_port"]) + end_port = self.node_lookup[c["end_id"]].get_port(c["end_port"]) + + connection.start_port = start_port + connection.end_port = end_port + connection.update_start_and_end_pos() + def save_project(self, json_path): # print(f"json path: {json_path}") + + from collections import OrderedDict + + # TODO possibly an ordered dict so things stay in order (better for git changes, and manual editing) + # Maybe connections will need a uuid for each so they can be sorted and kept in order. scene = {"nodes": [], "connections": []} # Need the nodes, and connections of ports to nodes @@ -97,13 +138,13 @@ def save_project(self, json_path): # Nodes if isinstance(item, Node): - print("found node") + # print("found node") pos = item.pos().toPoint() x, y = pos.x(), pos.y() - print(f"pos: {x, y}") + # print(f"pos: {x, y}") obj_type = type(item).__name__ - print(f"node type: {obj_type}") + # print(f"node type: {obj_type}") node_id = str(item.uuid) From 4b92b86695f9eabb9912deb705714bf8e096ba6a Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 18:03:44 -0400 Subject: [PATCH 23/88] helper to get port. TODO should store ports in dict for faster lookup. --- node_editor/gui/node.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index eeac8fa..f704ddc 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -97,6 +97,11 @@ def paint(self, painter, option=None, widget=None): painter.drawPath(self.type_path) painter.drawPath(self.misc_path) + def get_port(self, name): + for port in self._ports: + if port.name() == name: + return port + def add_port(self, name, is_output=False, flags=0, ptr=None): """ Adds a new port to the node. From 9bbbb0223bd9890618dd1e158ab94f2f1e91e1d6 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 18:05:39 -0400 Subject: [PATCH 24/88] nodes will not be made in the GUI. They will be python classes in the project folder --- main.py | 17 ------------- node_editor/gui/node_type_editor.py | 39 ----------------------------- 2 files changed, 56 deletions(-) delete mode 100644 node_editor/gui/node_type_editor.py diff --git a/main.py b/main.py index 6819f7e..6b3b7ed 100644 --- a/main.py +++ b/main.py @@ -18,7 +18,6 @@ from PySide6 import QtCore, QtGui, QtWidgets from node_editor.gui.node_list import NodeList -from node_editor.gui.node_type_editor import NodeTypeEditor from node_editor.gui.node_widget import NodeWidget logging.basicConfig(level=logging.DEBUG) @@ -76,8 +75,6 @@ def __init__(self, parent=None): main_layout.addWidget(self.splitter) # Signals - new_node_type_btn.clicked.connect(self.new_node_cmd) - self.load_project("C:/Users/Howard/simple-node-editor/Example_project") # Restore GUI from last state @@ -129,20 +126,6 @@ def get_project_path(self): self.load_project(project_path) - def new_node_cmd(self): - """ - Handles the New Node Type button click event by showing the NodeTypeEditor dialog. - - Returns: - None. - """ - node_editor = NodeTypeEditor() - - if node_editor.exec() == QtWidgets.QDialog.Accepted: - print("Dialog accepted") - else: - print("Dialog canceled") - def closeEvent(self, event): """ Handles the close event by saving the GUI state and closing the application. diff --git a/node_editor/gui/node_type_editor.py b/node_editor/gui/node_type_editor.py deleted file mode 100644 index 78ea850..0000000 --- a/node_editor/gui/node_type_editor.py +++ /dev/null @@ -1,39 +0,0 @@ -from PySide6 import QtWidgets - - -class NodeTypeEditor(QtWidgets.QDialog): - """ - A dialog window for editing node types. - - Attributes: - edit (QtWidgets.QLineEdit): A line edit widget for editing the node type. - """ - - def __init__(self, parent=None): - """ - Constructs a NodeTypeEditor object. - - Args: - parent (QWidget): The parent widget of this dialog. - """ - super().__init__(parent) - - self.setWindowTitle("Node Type Editor") - - # create the UI elements - label = QtWidgets.QLabel("Node Type:") - self.edit = QtWidgets.QLineEdit() - button_ok = QtWidgets.QPushButton("OK") - button_cancel = QtWidgets.QPushButton("Cancel") - - # set the layout - layout = QtWidgets.QHBoxLayout() - layout.addWidget(label) - layout.addWidget(self.edit) - layout.addWidget(button_ok) - layout.addWidget(button_cancel) - self.setLayout(layout) - - # connect the signals and slots - button_ok.clicked.connect(self.accept) - button_cancel.clicked.connect(self.reject) From 612b1d2807a5f9c340a9ca1ca44aa398ca05ce09 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 18:06:40 -0400 Subject: [PATCH 25/88] removing new node button --- main.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/main.py b/main.py index 6b3b7ed..d95f416 100644 --- a/main.py +++ b/main.py @@ -63,15 +63,12 @@ def __init__(self, parent=None): left_widget = QtWidgets.QWidget() self.splitter = QtWidgets.QSplitter() self.node_widget = NodeWidget(self) - new_node_type_btn = QtWidgets.QPushButton("New Node Type") - new_node_type_btn.setFixedHeight(50) # Add Widgets to layouts self.splitter.addWidget(left_widget) self.splitter.addWidget(self.node_widget) left_widget.setLayout(left_layout) left_layout.addWidget(self.node_list) - left_layout.addWidget(new_node_type_btn) main_layout.addWidget(self.splitter) # Signals From a2e11cda4afea5e52308ca1ebad3f04a2d4134ee Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 18:43:44 -0400 Subject: [PATCH 26/88] update --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0c80e76..beb2244 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,17 @@ # Logic Node Editor -A very basic minimal code for implementing a node graph or editor using PySide6. All nodes are built using QGraphics items. -## Note -I’ve thought about extending some functionality to this that would be useful for most people wanting to use this to bootstrap projects. +The Node-Based Python Tool is a software tool that provides a new way to organize reusable Python code. This tool is implemented in custom node classes that can be easily connected to one another to form a dynamic network. -- Save and load. Not sure what file format. Was thinking it’d be cool to save as a compatible graphviz gv file. Other options would be a very basic node at the top, connections on the bottom file format. Keep the logic of node types as python classes. -- Implement some compute logic on a node. Maybe as a python class/object with standard input/output with type checking. -- Run python code for each node into its own thread when calculating a DAG graph. This would speed processing up on multithreaded systems. And would be nice as a core feature. +The tool is designed to allow you to write Python code in individual files per class/node. This means that your code is self-contained, easily modifiable, and reusable across multiple projects. Additionally, the GUI for the Node-Based Python Tool is designed to be familiar to those who have used Unreal Engine's blueprinting system, making it easy to learn and use. + +My goal with this project is to provide a new and innovative way of organizing and working with Python code. While the tool is still in the development phase, I am constantly working to improve its functionality and features. + +I hope that you find the Node-Based Python Tool to be a valuable addition to your toolkit, and I welcome any feedback or suggestions you may have as I continue to improve and expand its capabilities. Thank you for your interest in my project! + +For minimal GUI code for creating a node network see [GUI-nodes-only](https://github.com/bhowiebkr/simple-node-editor/tree/GUI-nodes-only) branch. -Let me know what your thoughts are and open a thread in the Discussions tab in github on this repo. I’d like to keep features as open, generalized, and simple as possible. [![Video](http://img.youtube.com/vi/DOsFJ8lm9dU/0.jpg)](http://www.youtube.com/watch?v=DOsFJ8lm9dU) ![nodes](https://github.com/bhowiebkr/simple-node-editor/blob/master/images/node_editor.jpg) From 3df785efe8b74785339b547a1221ad596d13c1c2 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 18:44:32 -0400 Subject: [PATCH 27/88] update --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index beb2244..1cb5462 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -# Logic Node Editor - +# Python Node Editor The Node-Based Python Tool is a software tool that provides a new way to organize reusable Python code. This tool is implemented in custom node classes that can be easily connected to one another to form a dynamic network. From bf36bc651e58f33979f8199ac395bde5150b2454 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 19:47:33 -0400 Subject: [PATCH 28/88] removing hard codes --- main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index d95f416..b0fe290 100644 --- a/main.py +++ b/main.py @@ -43,7 +43,7 @@ def __init__(self, parent=None): self.menuBar().addMenu(file_menu) load_action = QtGui.QAction("Load Project", self) - load_action.triggered.connect(self.load_project) + load_action.triggered.connect(self.get_project_path) file_menu.addAction(load_action) save_action = QtGui.QAction("Save Project", self) @@ -71,8 +71,9 @@ def __init__(self, parent=None): left_layout.addWidget(self.node_list) main_layout.addWidget(self.splitter) - # Signals - self.load_project("C:/Users/Howard/simple-node-editor/Example_project") + # Load the example project + example_project_path = (Path(__file__).parent.resolve() / 'Example_project') + self.load_project(example_project_path) # Restore GUI from last state if settings.contains("geometry"): From 3fbebb87681a2a196bf2d8b1084184e1a4b113d2 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 19:50:18 -0400 Subject: [PATCH 29/88] note --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1cb5462..7ede8f2 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ I hope that you find the Node-Based Python Tool to be a valuable addition to you For minimal GUI code for creating a node network see [GUI-nodes-only](https://github.com/bhowiebkr/simple-node-editor/tree/GUI-nodes-only) branch. +Converting the original code base over to this more fully fledged out node editor, there will be loads of code smells. I’ll hold off on doing a refactor until the core components are fully functional. [![Video](http://img.youtube.com/vi/DOsFJ8lm9dU/0.jpg)](http://www.youtube.com/watch?v=DOsFJ8lm9dU) From c052f4277efa1fd19bd636f38f85551fd8e7fdbe Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 19:51:52 -0400 Subject: [PATCH 30/88] gui update --- images/node_editor.jpg | Bin 207477 -> 207477 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/node_editor.jpg b/images/node_editor.jpg index 25b0e7a38a7843e8e0215f8ca7e6f353e0829649..a75ae7e8c3792478636811a986a8c3eda80b9a4d 100644 GIT binary patch literal 207477 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ν$W#Yv;Bc|@uj^(;URv#q(i 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 literal 207477 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%0AldxtAFpDh^Z=2T6KA*1ZV;dMmayz#@uFHY0hJ9 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 Date: Wed, 5 Apr 2023 20:00:33 -0400 Subject: [PATCH 31/88] update --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ede8f2..5d02e6a 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ For minimal GUI code for creating a node network see [GUI-nodes-only](https://gi Converting the original code base over to this more fully fledged out node editor, there will be loads of code smells. I’ll hold off on doing a refactor until the core components are fully functional. +![nodes](https://github.com/bhowiebkr/simple-node-editor/blob/master/images/node_editor.jpg) [![Video](http://img.youtube.com/vi/DOsFJ8lm9dU/0.jpg)](http://www.youtube.com/watch?v=DOsFJ8lm9dU) -![nodes](https://github.com/bhowiebkr/simple-node-editor/blob/master/images/node_editor.jpg) + From 29e18d30bd15737aea6328c6f531827463b67212 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 21:28:21 -0400 Subject: [PATCH 32/88] ports change solid when connected --- node_editor/gui/port.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/node_editor/gui/port.py b/node_editor/gui/port.py index 2db842d..e57ec34 100644 --- a/node_editor/gui/port.py +++ b/node_editor/gui/port.py @@ -92,8 +92,12 @@ def node(self): return self.m_node def paint(self, painter, option=None, widget=None): - painter.setPen(QtGui.QPen(1)) - painter.setBrush(QtCore.Qt.green) + painter.setPen(QtCore.Qt.green) + + if self.is_connected(): + painter.setBrush(QtCore.Qt.green) + else: + painter.setBrush(QtCore.Qt.NoBrush) painter.drawPath(self.path()) painter.setPen(QtCore.Qt.NoPen) From 73499ae576b15e697273d9bbb8b365cf950dbc17 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 23:12:39 -0400 Subject: [PATCH 33/88] Thinner connection line --- node_editor/gui/connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection.py index 2c36d31..8adf234 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection.py @@ -130,8 +130,8 @@ def paint(self, painter, option=None, widget=None): widget (QWidget): The widget used to paint the Connection. """ if self.isSelected() or self._do_highlight: - painter.setPen(QtGui.QPen(QtGui.QColor(255, 102, 0), 3)) + painter.setPen(QtGui.QPen(QtGui.QColor(255, 102, 0), 2)) else: - painter.setPen(QtGui.QPen(QtGui.QColor(0, 128, 255), 2)) + painter.setPen(QtGui.QPen(QtGui.QColor(0, 128, 255), 0)) painter.drawPath(self.path()) From 201f3202c67d2f869b097b0e4d6fa796af3700e2 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 5 Apr 2023 23:13:14 -0400 Subject: [PATCH 34/88] background title color, text alignment to left --- node_editor/gui/node.py | 43 ++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index f704ddc..311de58 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -1,4 +1,5 @@ from PySide6 import QtCore, QtGui, QtWidgets +from PySide6.QtCore import Qt from node_editor.gui.port import Port @@ -41,6 +42,8 @@ def __init__(self): self.setFlag(QtWidgets.QGraphicsPathItem.ItemIsSelectable) self._title_text = "Title" + self._title_color = QtGui.QColor(123, 33, 177) + self._type_text = "base" self._width = 30 # The Width of the node @@ -83,13 +86,14 @@ def paint(self, painter, option=None, widget=None): widget (QWidget): The widget to use for drawing the node (optional). """ - if self.isSelected(): - painter.setPen(QtGui.QPen(QtGui.QColor(241, 175, 0), 2)) - else: - painter.setPen(self.node_color.lighter()) + painter.setPen(self.node_color.lighter()) painter.setBrush(self.node_color) - painter.drawPath(self.path()) + + painter.setBrush(self._title_color) + painter.setPen(self.node_color.lighter()) + painter.drawPath(self.title_bg_path.simplified()) + painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.white) @@ -97,6 +101,12 @@ def paint(self, painter, option=None, widget=None): painter.drawPath(self.type_path) painter.drawPath(self.misc_path) + # Draw the highlight + if self.isSelected(): + painter.setPen(QtGui.QPen(QtGui.QColor(241, 175, 0), 2)) + painter.setBrush(Qt.NoBrush) + painter.drawPath(self.path()) + def get_port(self, name): for port in self._ports: if port.name() == name: @@ -143,9 +153,8 @@ def build(self): total_width = 0 path = QtGui.QPainterPath() # The main path - # The fonts what will be used - title_font = QtGui.QFont("Lucida Sans Unicode", pointSize=16) + title_font = QtGui.QFont("Lucida Sans Unicode", pointSize=12) title_type_font = QtGui.QFont("Lucida Sans Unicode", pointSize=8) port_font = QtGui.QFont("Lucida Sans Unicode") @@ -156,7 +165,7 @@ def build(self): } title_type_dim = { - "w": QtGui.QFontMetrics(title_type_font).horizontalAdvance(f"({self._type_text})"), + "w": QtGui.QFontMetrics(title_type_font).horizontalAdvance(f"{self._type_text}"), "h": QtGui.QFontMetrics(title_type_font).height(), } @@ -188,20 +197,28 @@ def build(self): # Draw the background rectangle path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height, 5, 5) + # The color on the title + bg_height = 35 + self.title_bg_path = QtGui.QPainterPath() # The title background path + self.title_bg_path.setFillRule(Qt.WindingFill) + self.title_bg_path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, bg_height, 5, 5) + self.title_bg_path.addRect(-total_width / 2, -total_height / 2 + bg_height - 10, 10, 10) # bottom left corner + self.title_bg_path.addRect(total_width / 2 - 10, -total_height / 2 + bg_height - 10, 10, 10) # bottom right corner + # Draw the title self.title_path.addText( - -title_dim["w"] / 2, - (-total_height / 2) + title_dim["h"], + -total_width / 2 + 5, + (-total_height / 2) + title_dim["h"] / 2 + 5, title_font, self._title_text, ) # Draw the type self.type_path.addText( - -title_type_dim["w"] / 2, - (-total_height / 2) + title_dim["h"] + title_type_dim["h"], + -total_width / 2 + 5, + (-total_height / 2) + title_dim["h"] + 5, title_type_font, - f"({self._type_text})", + f"{self._type_text}", ) if port_dim: From a128c944796af3e7a514f8599303c46e5156263b Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 6 Apr 2023 00:01:08 -0400 Subject: [PATCH 35/88] gradient title background --- node_editor/gui/node.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index 311de58..2947588 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -90,8 +90,14 @@ def paint(self, painter, option=None, widget=None): painter.setBrush(self.node_color) painter.drawPath(self.path()) - painter.setBrush(self._title_color) - painter.setPen(self.node_color.lighter()) + gradient = QtGui.QLinearGradient() + gradient.setStart(0, -90) + gradient.setFinalStop(0, 0) + gradient.setColorAt(0, self._title_color) # Start color (white) + gradient.setColorAt(1, self._title_color.darker()) # End color (blue) + + painter.setBrush(QtGui.QBrush(gradient)) + painter.setPen(self._title_color) painter.drawPath(self.title_bg_path.simplified()) painter.setPen(QtCore.Qt.NoPen) From d0d2d892157459ac3457cdf83663111ab2d0cfc5 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 6 Apr 2023 00:05:56 -0400 Subject: [PATCH 36/88] changed highlight colors to just be lighter than the original color --- node_editor/gui/connection.py | 5 +++-- node_editor/gui/node.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection.py index 8adf234..a1986a6 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection.py @@ -129,9 +129,10 @@ def paint(self, painter, option=None, widget=None): option (QStyleOptionGraphicsItem): The style options for the Connection. widget (QWidget): The widget used to paint the Connection. """ + color = QtGui.QColor(0, 128, 255) if self.isSelected() or self._do_highlight: - painter.setPen(QtGui.QPen(QtGui.QColor(255, 102, 0), 2)) + painter.setPen(QtGui.QPen(color.lighter(), 2)) else: - painter.setPen(QtGui.QPen(QtGui.QColor(0, 128, 255), 0)) + painter.setPen(QtGui.QPen(color, 0)) painter.drawPath(self.path()) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index 2947588..c057ffd 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -109,7 +109,7 @@ def paint(self, painter, option=None, widget=None): # Draw the highlight if self.isSelected(): - painter.setPen(QtGui.QPen(QtGui.QColor(241, 175, 0), 2)) + painter.setPen(QtGui.QPen(self._title_color.lighter(), 2)) painter.setBrush(Qt.NoBrush) painter.drawPath(self.path()) From 7fc5bc11a00bae14da4e2df0b89ccf7964e5d35f Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 6 Apr 2023 01:50:34 -0400 Subject: [PATCH 37/88] adding execution pins --- Example_Project/Add_node.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py index d1cd508..f752b63 100644 --- a/Example_Project/Add_node.py +++ b/Example_Project/Add_node.py @@ -7,6 +7,11 @@ def __init__(self): self.title = "Add" self.type_text = "Logic Nodes" + + self.add_port(name="Ex In", is_output=False, execution=True) + self.add_port(name="Ex Out", is_output=True, execution=True) + + self.add_port(name="input A", is_output=False) self.add_port(name="input A", is_output=False) self.add_port(name="input B", is_output=False) self.add_port(name="output", is_output=True) From eb2bc1de26c1a89845a4c11eee3198be513182e0 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 6 Apr 2023 01:50:53 -0400 Subject: [PATCH 38/88] gui update --- images/node_editor.jpg | Bin 207477 -> 161900 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/node_editor.jpg b/images/node_editor.jpg index a75ae7e8c3792478636811a986a8c3eda80b9a4d..a170133ad3bd3cc2d205dfa19ed4a1f37a7180c3 100644 GIT binary patch literal 161900 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ν$W#Yv;Bc|@uj^(;URv#q(i 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 From c0307006e88155aa0889be2c9ade1c15f73cb6cd Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 6 Apr 2023 01:51:12 -0400 Subject: [PATCH 39/88] execution connections are thick and white --- node_editor/gui/connection.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection.py index a1986a6..b0653b7 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection.py @@ -129,10 +129,17 @@ def paint(self, painter, option=None, widget=None): option (QStyleOptionGraphicsItem): The style options for the Connection. widget (QWidget): The widget used to paint the Connection. """ + + thickness = 0 color = QtGui.QColor(0, 128, 255) + if self._start_port: + if self._start_port.is_execution(): + thickness = 3 + color = QtGui.QColor(255, 255, 255) + if self.isSelected() or self._do_highlight: - painter.setPen(QtGui.QPen(color.lighter(), 2)) + painter.setPen(QtGui.QPen(color.lighter(), thickness + 2)) else: - painter.setPen(QtGui.QPen(color, 0)) + painter.setPen(QtGui.QPen(color, thickness)) painter.drawPath(self.path()) From 1be72bc9c8cf048e250a2b8749ede47fceee35ed Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 6 Apr 2023 01:52:07 -0400 Subject: [PATCH 40/88] execution ports look and get positioned differently --- node_editor/gui/node.py | 26 +++++++++--------- node_editor/gui/port.py | 60 +++++++++++++++++++++++++++++++++-------- 2 files changed, 63 insertions(+), 23 deletions(-) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index c057ffd..0478b67 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -118,7 +118,7 @@ def get_port(self, name): if port.name() == name: return port - def add_port(self, name, is_output=False, flags=0, ptr=None): + def add_port(self, name, is_output=False, execution=False): """ Adds a new port to the node. @@ -136,8 +136,7 @@ def add_port(self, name, is_output=False, flags=0, ptr=None): port.set_is_output(is_output) port.set_name(name) port.set_node(node=self) - port.set_port_flags(flags) - port.set_ptr(ptr) + port.set_execution(execution) self._ports.append(port) @@ -186,15 +185,16 @@ def build(self): port_dim = None # Add the heigth for each of the ports for port in self._ports: - port_dim = { - "w": QtGui.QFontMetrics(port_font).horizontalAdvance(port.name()), - "h": QtGui.QFontMetrics(port_font).height(), - } + if not port.is_execution(): + port_dim = { + "w": QtGui.QFontMetrics(port_font).horizontalAdvance(port.name()), + "h": QtGui.QFontMetrics(port_font).height(), + } - if port_dim["w"] > total_width: - total_width = port_dim["w"] + if port_dim["w"] > total_width: + total_width = port_dim["w"] - total_height += port_dim["h"] + total_height += port_dim["h"] # Add the margin to the total_width total_width += self.horizontal_margin @@ -228,14 +228,16 @@ def build(self): ) if port_dim: - y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + port_dim["h"] + y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + 5 for port in self._ports: + if not port.is_execution(): + y += port_dim["h"] + if port.is_output(): port.setPos(total_width / 2 - 10, y) else: port.setPos(-total_width / 2 + 10, y) - y += port_dim["h"] self.setPath(path) diff --git a/node_editor/gui/port.py b/node_editor/gui/port.py index e57ec34..5cf4510 100644 --- a/node_editor/gui/port.py +++ b/node_editor/gui/port.py @@ -37,8 +37,22 @@ def __init__(self, parent, scene): self.radius_ = 5 self.margin = 2 + self.execution = False + path = QtGui.QPainterPath() + # if self.execution: + # points = [] + # points.append(QtCore.QPointF(-6, -7)) + # points.append(QtCore.QPointF(-6, 7)) + # points.append(QtCore.QPointF(-2, 7)) + # points.append(QtCore.QPointF(6, 0)) + # points.append(QtCore.QPointF(-2, -7)) + # points.append(QtCore.QPointF(-6, -7)) + + # path.addPolygon(QtGui.QPolygonF(points)) + # else: path.addEllipse(-self.radius_, -self.radius_, 2 * self.radius_, 2 * self.radius_) + self.setPath(path) self.setFlag(QtWidgets.QGraphicsPathItem.ItemSendsScenePositionChanges) @@ -56,6 +70,25 @@ def __init__(self, parent, scene): self.text_path = QtGui.QPainterPath() + def is_execution(self): + return self.execution + + def set_execution(self, execution): + self.execution = execution + + if execution: + path = QtGui.QPainterPath() + + points = [] + points.append(QtCore.QPointF(-6, -7)) + points.append(QtCore.QPointF(-6, 7)) + points.append(QtCore.QPointF(-2, 7)) + points.append(QtCore.QPointF(6, 0)) + points.append(QtCore.QPointF(-2, -7)) + points.append(QtCore.QPointF(-6, -7)) + path.addPolygon(QtGui.QPolygonF(points)) + self.setPath(path) + def set_is_output(self, is_output): self._is_output = is_output @@ -76,12 +109,6 @@ def set_name(self, name): def set_node(self, node): self.m_node = node - def set_port_flags(self, flags): - self.m_port_flags = flags - - def set_ptr(self, ptr): - self.m_ptr = ptr - def name(self): return self._name @@ -92,17 +119,28 @@ def node(self): return self.m_node def paint(self, painter, option=None, widget=None): - painter.setPen(QtCore.Qt.green) + if self.execution: + painter.setPen(QtCore.Qt.white) + else: + painter.setPen(QtCore.Qt.green) if self.is_connected(): - painter.setBrush(QtCore.Qt.green) + if self.execution: + painter.setBrush(QtCore.Qt.white) + else: + painter.setBrush(QtCore.Qt.green) + else: painter.setBrush(QtCore.Qt.NoBrush) + painter.drawPath(self.path()) - painter.setPen(QtCore.Qt.NoPen) - painter.setBrush(QtCore.Qt.white) - painter.drawPath(self.text_path) + # Draw text + + if not self.execution: + painter.setPen(QtCore.Qt.NoPen) + painter.setBrush(QtCore.Qt.white) + painter.drawPath(self.text_path) def clear_connection(self): if self.connection: From 5b7d7f82e2c88b7a6bfc041b9882a7cf28520065 Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 7 Apr 2023 14:09:37 -0400 Subject: [PATCH 41/88] class change of node, and the start of supporting widgets in graphics items through a proxy. --- node_editor/gui/node.py | 63 ++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index 0478b67..d377ab6 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -4,7 +4,7 @@ from node_editor.gui.port import Port -class Node(QtWidgets.QGraphicsPathItem): +class Node(QtWidgets.QGraphicsItem): """ A QGraphicsPathItem representing a node in the node editor. @@ -38,11 +38,12 @@ class Node(QtWidgets.QGraphicsPathItem): def __init__(self): super().__init__() - self.setFlag(QtWidgets.QGraphicsPathItem.ItemIsMovable) - self.setFlag(QtWidgets.QGraphicsPathItem.ItemIsSelectable) + self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable) + self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable) self._title_text = "Title" self._title_color = QtGui.QColor(123, 33, 177) + self.size = QtCore.QRectF() # Size of self._type_text = "base" @@ -60,6 +61,15 @@ def __init__(self): self.horizontal_margin = 30 # horizontal margin self.vertical_margin = 15 # vertical margin + self.init_widget() + + def boundingRect(self): + return self.size + + def set_color(self, title_color=(123, 33, 177), background_color=(20, 20, 20, 200)): + self._title_color = QtGui.QColor(title_color[0], title_color[1], title_color[2]) + self.node_color = QtGui.QColor(background_color[0], background_color[1], background_color[2]) + @property def title(self): return self._title_text @@ -88,7 +98,7 @@ def paint(self, painter, option=None, widget=None): painter.setPen(self.node_color.lighter()) painter.setBrush(self.node_color) - painter.drawPath(self.path()) + painter.drawPath(self.path) gradient = QtGui.QLinearGradient() gradient.setStart(0, -90) @@ -111,7 +121,7 @@ def paint(self, painter, option=None, widget=None): if self.isSelected(): painter.setPen(QtGui.QPen(self._title_color.lighter(), 2)) painter.setBrush(Qt.NoBrush) - painter.drawPath(self.path()) + painter.drawPath(self.path) def get_port(self, name): for port in self._ports: @@ -157,7 +167,7 @@ def build(self): self.misc_path = QtGui.QPainterPath() # a bunch of other stuff total_width = 0 - path = QtGui.QPainterPath() # The main path + self.path = QtGui.QPainterPath() # The main path # The fonts what will be used title_font = QtGui.QFont("Lucida Sans Unicode", pointSize=12) title_type_font = QtGui.QFont("Lucida Sans Unicode", pointSize=8) @@ -185,15 +195,15 @@ def build(self): port_dim = None # Add the heigth for each of the ports for port in self._ports: - if not port.is_execution(): - port_dim = { - "w": QtGui.QFontMetrics(port_font).horizontalAdvance(port.name()), - "h": QtGui.QFontMetrics(port_font).height(), - } + port_dim = { + "w": QtGui.QFontMetrics(port_font).horizontalAdvance(port.name()), + "h": QtGui.QFontMetrics(port_font).height(), + } - if port_dim["w"] > total_width: - total_width = port_dim["w"] + if port_dim["w"] > total_width: + total_width = port_dim["w"] + if not port.is_execution(): total_height += port_dim["h"] # Add the margin to the total_width @@ -201,7 +211,8 @@ def build(self): total_height += self.vertical_margin # Draw the background rectangle - path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height, 5, 5) + self.size = QtCore.QRectF(-total_width / 2, -total_height / 2, total_width, total_height) + self.path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height, 5, 5) # The color on the title bg_height = 35 @@ -227,6 +238,7 @@ def build(self): f"{self._type_text}", ) + # Position the ports. Execution ports stay on the same row if port_dim: y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + 5 @@ -239,8 +251,6 @@ def build(self): else: port.setPos(-total_width / 2 + 10, y) - self.setPath(path) - self._width = total_width self._height = total_height @@ -313,3 +323,24 @@ def delete(self): connection.delete() self.scene().removeItem(self) + + def init_widget(self): + # create the QWidget and add it to a QGraphicsProxyWidget + widget = QtWidgets.QWidget() + layout = QtWidgets.QVBoxLayout() + label = QtWidgets.QPushButton("Button test") + layout.addWidget(label) + widget.setLayout(layout) + proxy = QtWidgets.QGraphicsProxyWidget() + proxy.setWidget(widget) + + proxy.setParentItem(self) + + def compute(self): + # Get the values from the input ports + + # Compute the value + + # Signal output ports + + pass From d4711b3f011370bbd327ffcf1fe59997e5b159d3 Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 7 Apr 2023 14:09:49 -0400 Subject: [PATCH 42/88] color change testing --- Example_Project/Add_node.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py index f752b63..a2280c9 100644 --- a/Example_Project/Add_node.py +++ b/Example_Project/Add_node.py @@ -7,6 +7,7 @@ def __init__(self): self.title = "Add" self.type_text = "Logic Nodes" + self.set_color(title_color=(0, 128, 0)) self.add_port(name="Ex In", is_output=False, execution=True) self.add_port(name="Ex Out", is_output=True, execution=True) From 9b282b7f64f6afc2fbaf9f54f6270ee101702ce3 Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 7 Apr 2023 14:10:18 -0400 Subject: [PATCH 43/88] a button event node. Will change/remove later --- Example_Project/Button_Event_node.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Example_Project/Button_Event_node.py diff --git a/Example_Project/Button_Event_node.py b/Example_Project/Button_Event_node.py new file mode 100644 index 0000000..3d426ed --- /dev/null +++ b/Example_Project/Button_Event_node.py @@ -0,0 +1,15 @@ +from node_editor.gui.node import Node + + +class Button_Event_Node(Node): + def __init__(self): + super().__init__() + + self.title = "Button Event" + self.type_text = "GUI Events" + self.set_color(title_color=(128, 0, 0)) + + self.add_port(name="Ex Out", is_output=True, execution=True) + # self.add_port(name="input A", is_output=False) + + self.build() From 3d72646fe5f319bdb213e40db000b137b0373613 Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 7 Apr 2023 14:10:36 -0400 Subject: [PATCH 44/88] different scene showing 2 node types --- Example_Project/test.json | 76 ++++++++++++++------------------------- 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/Example_Project/test.json b/Example_Project/test.json index 0aee684..b5188d3 100644 --- a/Example_Project/test.json +++ b/Example_Project/test.json @@ -2,63 +2,45 @@ "nodes": [ { "type": "Add_Node", - "x": 5374, - "y": 4897, - "uuid": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b" - }, - { - "type": "Add_Node", - "x": 5165, - "y": 5007, - "uuid": "0fe0381a-29bc-4987-ba94-ba4a14e33a13" - }, - { - "type": "Add_Node", - "x": 4949, - "y": 4926, + "x": 4930, + "y": 4932, "uuid": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b" }, { "type": "Add_Node", - "x": 4943, - "y": 5114, - "uuid": "e06066a5-6375-4a40-8d14-c7e5e9c28f02" - }, - { - "type": "Add_Node", - "x": 4617, - "y": 5014, - "uuid": "a06586f8-3c66-48ca-8be7-fd99b9ee82c3" + "x": 5093, + "y": 4936, + "uuid": "0fe0381a-29bc-4987-ba94-ba4a14e33a13" }, { "type": "Add_Node", - "x": 4666, - "y": 4864, - "uuid": "24ac8fd5-b91a-4c35-bfdc-bf96961da280" + "x": 5266, + "y": 4942, + "uuid": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b" }, { - "type": "Add_Node", - "x": 4794, - "y": 5130, - "uuid": "f20b2350-0bc9-40be-9ddd-510d16ae8cc8" + "type": "Button_Event_Node", + "x": 4762, + "y": 4858, + "uuid": "03d0b835-6c55-44ba-8944-3c6cc2c3a86b" } ], "connections": [ { - "start_id": "24ac8fd5-b91a-4c35-bfdc-bf96961da280", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "start_port": "output", - "end_port": "input A" + "start_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", + "end_id": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b", + "start_port": "Ex Out", + "end_port": "Ex In" }, { - "start_id": "a06586f8-3c66-48ca-8be7-fd99b9ee82c3", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "start_port": "output", - "end_port": "input B" + "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "end_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", + "start_port": "Ex Out", + "end_port": "Ex In" }, { - "start_id": "e06066a5-6375-4a40-8d14-c7e5e9c28f02", - "end_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", + "start_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", + "end_id": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b", "start_port": "output", "end_port": "input B" }, @@ -69,16 +51,10 @@ "end_port": "input A" }, { - "start_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", - "end_id": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b", - "start_port": "output", - "end_port": "input B" - }, - { - "start_id": "f20b2350-0bc9-40be-9ddd-510d16ae8cc8", - "end_id": "e06066a5-6375-4a40-8d14-c7e5e9c28f02", - "start_port": "output", - "end_port": "input B" + "start_id": "03d0b835-6c55-44ba-8944-3c6cc2c3a86b", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_port": "Ex Out", + "end_port": "Ex In" } ] } \ No newline at end of file From dde8be543914b517e842666f6bcc3410eca6f498 Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 7 Apr 2023 19:40:51 -0400 Subject: [PATCH 45/88] widget setup/changing computers --- Example_Project/Add_node.py | 18 ++++++++++++++++++ node_editor/gui/node.py | 14 ++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py index a2280c9..b60d57f 100644 --- a/Example_Project/Add_node.py +++ b/Example_Project/Add_node.py @@ -1,3 +1,5 @@ +from PySide6 import QtWidgets + from node_editor.gui.node import Node @@ -17,3 +19,19 @@ def __init__(self): self.add_port(name="input B", is_output=False) self.add_port(name="output", is_output=True) self.build() + + def init_widget(self): + self.widget = QtWidgets.QWidget() + layout = QtWidgets.QVBoxLayout() + label = QtWidgets.QPushButton("Button test") + layout.addWidget(label) + self.widget.setLayout(layout) + + proxy = QtWidgets.QGraphicsProxyWidget() + proxy.setWidget(self.widget) + proxy.setParentItem(self) + + super().init_widget() + + # print(self.widget.layout().sizeHint()) + # print(self.widget.size()) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index d377ab6..de5d659 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -45,6 +45,9 @@ def __init__(self): self._title_color = QtGui.QColor(123, 33, 177) self.size = QtCore.QRectF() # Size of + self.widget = QtWidgets.QWidget() + self.widget.resize(0, 0) + self._type_text = "base" self._width = 30 # The Width of the node @@ -325,16 +328,7 @@ def delete(self): self.scene().removeItem(self) def init_widget(self): - # create the QWidget and add it to a QGraphicsProxyWidget - widget = QtWidgets.QWidget() - layout = QtWidgets.QVBoxLayout() - label = QtWidgets.QPushButton("Button test") - layout.addWidget(label) - widget.setLayout(layout) - proxy = QtWidgets.QGraphicsProxyWidget() - proxy.setWidget(widget) - - proxy.setParentItem(self) + print(self.widget.size()) def compute(self): # Get the values from the input ports From f2340c21fac67aaded246d562bd2b413497db36a Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 7 Apr 2023 20:04:21 -0400 Subject: [PATCH 46/88] renaming button widget --- Example_Project/Button_Event_node.py | 15 ------------ Example_Project/Button_node.py | 34 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 15 deletions(-) delete mode 100644 Example_Project/Button_Event_node.py create mode 100644 Example_Project/Button_node.py diff --git a/Example_Project/Button_Event_node.py b/Example_Project/Button_Event_node.py deleted file mode 100644 index 3d426ed..0000000 --- a/Example_Project/Button_Event_node.py +++ /dev/null @@ -1,15 +0,0 @@ -from node_editor.gui.node import Node - - -class Button_Event_Node(Node): - def __init__(self): - super().__init__() - - self.title = "Button Event" - self.type_text = "GUI Events" - self.set_color(title_color=(128, 0, 0)) - - self.add_port(name="Ex Out", is_output=True, execution=True) - # self.add_port(name="input A", is_output=False) - - self.build() diff --git a/Example_Project/Button_node.py b/Example_Project/Button_node.py new file mode 100644 index 0000000..6c3ba01 --- /dev/null +++ b/Example_Project/Button_node.py @@ -0,0 +1,34 @@ +from PySide6 import QtWidgets + +from node_editor.gui.node import Node + + +class Button_Node(Node): + def __init__(self): + super().__init__() + + self.title = "Button" + self.type_text = "Inputs" + self.set_color(title_color=(128, 0, 0)) + + self.add_port(name="Ex Out", is_output=True, execution=True) + self.add_port(name="value", is_output=True) + + self.build() + + def init_widget(self): + self.widget = QtWidgets.QWidget() + layout = QtWidgets.QVBoxLayout() + btn = QtWidgets.QPushButton("Button test") + btn.clicked.connect(self.btn_cmd) + layout.addWidget(btn) + self.widget.setLayout(layout) + + proxy = QtWidgets.QGraphicsProxyWidget() + proxy.setWidget(self.widget) + proxy.setParentItem(self) + + super().init_widget() + + def btn_cmd(self): + print('btn command') \ No newline at end of file From e6dda41fe09c5986cec8baabda13fe82c6a9d2cb Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 7 Apr 2023 20:04:43 -0400 Subject: [PATCH 47/88] position widget at the bottom of the node --- node_editor/gui/node.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index de5d659..6ef1aaf 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -64,8 +64,6 @@ def __init__(self): self.horizontal_margin = 30 # horizontal margin self.vertical_margin = 15 # vertical margin - self.init_widget() - def boundingRect(self): return self.size @@ -165,11 +163,14 @@ def build(self): None. """ + self.init_widget() # configure the widget side of things. We need to get the size of the widget before building the rest of the node + self.widget.setStyleSheet("background-color: " + self.node_color.name() + ";") self.title_path = QtGui.QPainterPath() # reset self.type_path = QtGui.QPainterPath() # The path for the type self.misc_path = QtGui.QPainterPath() # a bunch of other stuff - total_width = 0 + + total_width = self.widget.size().width() self.path = QtGui.QPainterPath() # The main path # The fonts what will be used title_font = QtGui.QFont("Lucida Sans Unicode", pointSize=12) @@ -193,7 +194,7 @@ def build(self): total_width = dim # Add both the title and type height together for the total height - total_height = sum([title_dim["h"], title_type_dim["h"]]) + total_height = sum([title_dim["h"], title_type_dim["h"]]) + self.widget.size().height() port_dim = None # Add the heigth for each of the ports @@ -215,7 +216,7 @@ def build(self): # Draw the background rectangle self.size = QtCore.QRectF(-total_width / 2, -total_height / 2, total_width, total_height) - self.path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height, 5, 5) + self.path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height + 15, 5, 5) # The color on the title bg_height = 35 @@ -257,6 +258,9 @@ def build(self): self._width = total_width self._height = total_height + # move the widget to the bottom + self.widget.move(-self.widget.size().width()/2, total_height/2-self.widget.size().height() + 5) + def select_connections(self, value): """ Sets the highlighting of all connected ports to the specified value. @@ -327,8 +331,10 @@ def delete(self): self.scene().removeItem(self) + # Override me def init_widget(self): - print(self.widget.size()) + pass + def compute(self): # Get the values from the input ports From efa9c344da7ace891d4e334b266d867e9eaa49e6 Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 7 Apr 2023 20:05:00 -0400 Subject: [PATCH 48/88] moving widget for button out of add node --- Example_Project/Add_node.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py index b60d57f..2d10e86 100644 --- a/Example_Project/Add_node.py +++ b/Example_Project/Add_node.py @@ -1,4 +1,3 @@ -from PySide6 import QtWidgets from node_editor.gui.node import Node @@ -14,24 +13,8 @@ def __init__(self): self.add_port(name="Ex In", is_output=False, execution=True) self.add_port(name="Ex Out", is_output=True, execution=True) - self.add_port(name="input A", is_output=False) self.add_port(name="input A", is_output=False) self.add_port(name="input B", is_output=False) self.add_port(name="output", is_output=True) self.build() - def init_widget(self): - self.widget = QtWidgets.QWidget() - layout = QtWidgets.QVBoxLayout() - label = QtWidgets.QPushButton("Button test") - layout.addWidget(label) - self.widget.setLayout(layout) - - proxy = QtWidgets.QGraphicsProxyWidget() - proxy.setWidget(self.widget) - proxy.setParentItem(self) - - super().init_widget() - - # print(self.widget.layout().sizeHint()) - # print(self.widget.size()) From ed499f5554e117f8e93c0e38d761fdd9c6618956 Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 7 Apr 2023 20:05:16 -0400 Subject: [PATCH 49/88] connecting add node with button --- Example_Project/test.json | 58 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Example_Project/test.json b/Example_Project/test.json index b5188d3..7907302 100644 --- a/Example_Project/test.json +++ b/Example_Project/test.json @@ -2,59 +2,59 @@ "nodes": [ { "type": "Add_Node", - "x": 4930, - "y": 4932, + "x": 4990, + "y": 4941, "uuid": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b" }, { - "type": "Add_Node", - "x": 5093, - "y": 4936, - "uuid": "0fe0381a-29bc-4987-ba94-ba4a14e33a13" + "type": "Button_Node", + "x": 4652, + "y": 4899, + "uuid": "32fa39d4-d90b-46ea-bcec-bbb52f12e217" }, { "type": "Add_Node", - "x": 5266, - "y": 4942, - "uuid": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b" + "x": 4825, + "y": 5053, + "uuid": "610ee41c-45ff-486e-a074-cc88b2e282f6" }, { - "type": "Button_Event_Node", - "x": 4762, - "y": 4858, - "uuid": "03d0b835-6c55-44ba-8944-3c6cc2c3a86b" + "type": "Add_Node", + "x": 5189, + "y": 4936, + "uuid": "7f781f85-a9dd-4d28-ba79-91bb69c9254a" } ], "connections": [ { - "start_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", - "end_id": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b", + "start_id": "32fa39d4-d90b-46ea-bcec-bbb52f12e217", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_port": "value", + "end_port": "input A" + }, + { + "start_id": "610ee41c-45ff-486e-a074-cc88b2e282f6", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_port": "output", + "end_port": "input B" + }, + { + "start_id": "32fa39d4-d90b-46ea-bcec-bbb52f12e217", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", "start_port": "Ex Out", "end_port": "Ex In" }, { "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "end_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", + "end_id": "7f781f85-a9dd-4d28-ba79-91bb69c9254a", "start_port": "Ex Out", "end_port": "Ex In" }, - { - "start_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", - "end_id": "6e09cc9a-8b79-4129-bf61-637c6b8eb39b", - "start_port": "output", - "end_port": "input B" - }, { "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "end_id": "0fe0381a-29bc-4987-ba94-ba4a14e33a13", + "end_id": "7f781f85-a9dd-4d28-ba79-91bb69c9254a", "start_port": "output", "end_port": "input A" - }, - { - "start_id": "03d0b835-6c55-44ba-8944-3c6cc2c3a86b", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "start_port": "Ex Out", - "end_port": "Ex In" } ] } \ No newline at end of file From cf9103da67cc48c75cde74dc824a800f1d146ec0 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 00:48:57 -0400 Subject: [PATCH 50/88] a scaler node --- Example_Project/Scaler_node.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Example_Project/Scaler_node.py diff --git a/Example_Project/Scaler_node.py b/Example_Project/Scaler_node.py new file mode 100644 index 0000000..e8575ae --- /dev/null +++ b/Example_Project/Scaler_node.py @@ -0,0 +1,30 @@ +from PySide6 import QtWidgets + +from node_editor.gui.node import Node +from Example_Project.common_widgets import FloatLineEdit + + +class Scaler_Node(Node): + def __init__(self): + super().__init__() + + self.title = "Scaler" + self.type_text = "Constants" + self.set_color(title_color=(255, 165, 0)) + + self.add_port(name="value", is_output=True) + + self.build() + + def init_widget(self): + self.widget = QtWidgets.QWidget() + layout = QtWidgets.QVBoxLayout() + self.scaler_line = FloatLineEdit() + layout.addWidget(self.scaler_line) + self.widget.setLayout(layout) + + proxy = QtWidgets.QGraphicsProxyWidget() + proxy.setWidget(self.widget) + proxy.setParentItem(self) + + super().init_widget() From 59b0307ed112bf4c87d9489fb7fc1ac50a7eb165 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 00:49:03 -0400 Subject: [PATCH 51/88] common widgets --- Example_Project/common_widgets.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Example_Project/common_widgets.py diff --git a/Example_Project/common_widgets.py b/Example_Project/common_widgets.py new file mode 100644 index 0000000..dcbc3f6 --- /dev/null +++ b/Example_Project/common_widgets.py @@ -0,0 +1,28 @@ +from PySide6 import QtWidgets +from PySide6 import QtGui +from PySide6.QtCore import Qt + +class FloatLineEdit(QtWidgets.QLineEdit): + def __init__(self, parent=None): + super().__init__(parent) + self.setValidator(FloatValidator()) + + def keyPressEvent(self, event): + if event.key() == Qt.Key_Space: + event.ignore() + else: + super().keyPressEvent(event) + +class FloatValidator(QtGui.QDoubleValidator): + def __init__(self, parent=None): + super().__init__(parent) + + def validate(self, input_str, pos): + state, num, pos = super().validate(input_str, pos) + if state == QtGui.QValidator.Acceptable: + return QtGui.QValidator.Acceptable, num, pos + if str(num).count('.') > 1: + return QtGui.QValidator.Invalid, num, pos + if input_str[pos-1] == '.': + return QtGui.QValidator.Acceptable, num, pos + return QtGui.QValidator.Invalid, num, pos \ No newline at end of file From 1444b38f7bb94dafa91a92932fd3d9e7a83b5bd1 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 00:49:19 -0400 Subject: [PATCH 52/88] skipping things that are not nodes --- main.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index b0fe290..46cd890 100644 --- a/main.py +++ b/main.py @@ -101,14 +101,20 @@ def load_project(self, project_path=None): self.imports = {} for file in project_path.glob("*.py"): + + if not file.stem.endswith('_node'): + print('file:', file.stem) + continue spec = importlib.util.spec_from_file_location(file.stem, file) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) for name, obj in inspect.getmembers(module): + if not name.endswith('_Node'): + continue if inspect.isclass(obj): self.imports[obj.__name__] = {"class": obj, "module": module} - break + #break self.node_list.update_project(self.imports) From 68950b17eb6f29fa584a9caadf5608bbe66659eb Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 01:45:43 -0400 Subject: [PATCH 53/88] print node with only inputs --- Example_Project/Print_node.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Example_Project/Print_node.py diff --git a/Example_Project/Print_node.py b/Example_Project/Print_node.py new file mode 100644 index 0000000..d0fa7c3 --- /dev/null +++ b/Example_Project/Print_node.py @@ -0,0 +1,15 @@ +from node_editor.gui.node import Node + + +class Print_Node(Node): + def __init__(self): + super().__init__() + + self.title = "Print" + self.type_text = "Debug Nodes" + self.set_color(title_color=(160, 32, 240)) + + self.add_port(name="Ex In", is_output=False, execution=True) + + self.add_port(name="input", is_output=False) + self.build() From 630b81275bef75869a87fd27e0ced7a29a32602c Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 01:46:21 -0400 Subject: [PATCH 54/88] removing margins --- Example_Project/Button_node.py | 6 ++++-- Example_Project/Scaler_node.py | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Example_Project/Button_node.py b/Example_Project/Button_node.py index 6c3ba01..90d8a12 100644 --- a/Example_Project/Button_node.py +++ b/Example_Project/Button_node.py @@ -12,13 +12,15 @@ def __init__(self): self.set_color(title_color=(128, 0, 0)) self.add_port(name="Ex Out", is_output=True, execution=True) - self.add_port(name="value", is_output=True) + # self.add_port(name="value", is_output=True) self.build() def init_widget(self): self.widget = QtWidgets.QWidget() layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + btn = QtWidgets.QPushButton("Button test") btn.clicked.connect(self.btn_cmd) layout.addWidget(btn) @@ -31,4 +33,4 @@ def init_widget(self): super().init_widget() def btn_cmd(self): - print('btn command') \ No newline at end of file + print("btn command") diff --git a/Example_Project/Scaler_node.py b/Example_Project/Scaler_node.py index e8575ae..8a94583 100644 --- a/Example_Project/Scaler_node.py +++ b/Example_Project/Scaler_node.py @@ -18,7 +18,9 @@ def __init__(self): def init_widget(self): self.widget = QtWidgets.QWidget() + self.widget.setFixedWidth(100) layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) self.scaler_line = FloatLineEdit() layout.addWidget(self.scaler_line) self.widget.setLayout(layout) From e507426ba68a30455a7c30d0561997f203f7bd64 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 01:46:56 -0400 Subject: [PATCH 55/88] hiding prints --- node_editor/gui/connection.py | 2 +- node_editor/gui/node_editor.py | 4 ++-- node_editor/gui/port.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection.py index b0653b7..78cd134 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection.py @@ -90,7 +90,7 @@ def update_start_and_end_pos(self): """ if self.start_port and not self.start_port.is_output(): - print("flipping connection") + # print("flipping connection") temp = self.end_port self._end_port = self.start_port self._start_port = temp diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index 75af872..5b5834f 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -131,7 +131,7 @@ def eventFilter(self, watched, event): # connecting a port if isinstance(item, Port): if self.port.can_connect_to(item): - print("Making connection") + # print("Making connection") # delete existing connection on the new port if item.connection: @@ -145,7 +145,7 @@ def eventFilter(self, watched, event): self.connection.end_port = item self.connection.update_start_and_end_pos() else: - print("Deleting connection") + # print("Deleting connection") self.connection.delete() self.connection = None diff --git a/node_editor/gui/port.py b/node_editor/gui/port.py index 5cf4510..ec6f235 100644 --- a/node_editor/gui/port.py +++ b/node_editor/gui/port.py @@ -147,7 +147,7 @@ def clear_connection(self): self.connection.delete() def can_connect_to(self, port): - print(port.node(), self.node()) + # print(port.node(), self.node()) if not port: return False if port.node() == self.node(): From 396fc6b68f43f11fe8b4c70776856441fda2cd4f Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 01:47:42 -0400 Subject: [PATCH 56/88] Getting height alignment correct for all staes of inputs ports --- node_editor/gui/node.py | 45 +++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index 6ef1aaf..8d488f9 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -50,8 +50,8 @@ def __init__(self): self._type_text = "base" - self._width = 30 # The Width of the node - self._height = 30 # the height of the node + self._width = 20 # The Width of the node + self._height = 20 # the height of the node self._ports = [] # A list of ports self.uuid = None # An identifier to used when saving and loading the scene @@ -61,7 +61,7 @@ def __init__(self): self.type_path = QtGui.QPainterPath() # The path for the type self.misc_path = QtGui.QPainterPath() # a bunch of other stuff - self.horizontal_margin = 30 # horizontal margin + self.horizontal_margin = 15 # horizontal margin self.vertical_margin = 15 # vertical margin def boundingRect(self): @@ -163,12 +163,13 @@ def build(self): None. """ - self.init_widget() # configure the widget side of things. We need to get the size of the widget before building the rest of the node + self.init_widget() # configure the widget side of things. We need to get the size of the widget before building the rest of the node self.widget.setStyleSheet("background-color: " + self.node_color.name() + ";") self.title_path = QtGui.QPainterPath() # reset self.type_path = QtGui.QPainterPath() # The path for the type self.misc_path = QtGui.QPainterPath() # a bunch of other stuff + bg_height = 35 # background title height total_width = self.widget.size().width() self.path = QtGui.QPainterPath() # The main path @@ -194,10 +195,12 @@ def build(self): total_width = dim # Add both the title and type height together for the total height - total_height = sum([title_dim["h"], title_type_dim["h"]]) + self.widget.size().height() + # total_height = sum([title_dim["h"], title_type_dim["h"]]) + self.widget.size().height() + total_height = bg_height + self.widget.size().height() port_dim = None # Add the heigth for each of the ports + exec_height_added = False for port in self._ports: port_dim = { "w": QtGui.QFontMetrics(port_font).horizontalAdvance(port.name()), @@ -207,19 +210,20 @@ def build(self): if port_dim["w"] > total_width: total_width = port_dim["w"] - if not port.is_execution(): + if port.is_execution() and not exec_height_added or not port.is_execution(): total_height += port_dim["h"] + exec_height_added = True # Add the margin to the total_width total_width += self.horizontal_margin - total_height += self.vertical_margin + # total_height += self.vertical_margin # Draw the background rectangle self.size = QtCore.QRectF(-total_width / 2, -total_height / 2, total_width, total_height) - self.path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height + 15, 5, 5) + self.path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height + 10, 5, 5) # The color on the title - bg_height = 35 + self.title_bg_path = QtGui.QPainterPath() # The title background path self.title_bg_path.setFillRule(Qt.WindingFill) self.title_bg_path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, bg_height, 5, 5) @@ -244,11 +248,27 @@ def build(self): # Position the ports. Execution ports stay on the same row if port_dim: - y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + 5 + # y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + 5 + y = bg_height - total_height / 2 - 10 + # Do the execution ports + exe_shifted = False for port in self._ports: if not port.is_execution(): + continue + if not exe_shifted: y += port_dim["h"] + exe_shifted = True + if port.is_output(): + port.setPos(total_width / 2 - 10, y) + else: + port.setPos(-total_width / 2 + 10, y) + + # Do the rest of the ports + for port in self._ports: + if port.is_execution(): + continue + y += port_dim["h"] if port.is_output(): port.setPos(total_width / 2 - 10, y) @@ -259,7 +279,7 @@ def build(self): self._height = total_height # move the widget to the bottom - self.widget.move(-self.widget.size().width()/2, total_height/2-self.widget.size().height() + 5) + self.widget.move(-self.widget.size().width() / 2, total_height / 2 - self.widget.size().height() + 5) def select_connections(self, value): """ @@ -333,8 +353,7 @@ def delete(self): # Override me def init_widget(self): - pass - + pass def compute(self): # Get the values from the input ports From f30995f16e5e1af1060cf72faf49288b2689c016 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 01:47:57 -0400 Subject: [PATCH 57/88] debug with a 4 node types --- Example_Project/test.json | 60 +++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/Example_Project/test.json b/Example_Project/test.json index 7907302..0ef42aa 100644 --- a/Example_Project/test.json +++ b/Example_Project/test.json @@ -2,42 +2,36 @@ "nodes": [ { "type": "Add_Node", - "x": 4990, - "y": 4941, + "x": 4974, + "y": 4947, "uuid": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b" }, { "type": "Button_Node", - "x": 4652, - "y": 4899, + "x": 4734, + "y": 4894, "uuid": "32fa39d4-d90b-46ea-bcec-bbb52f12e217" }, { - "type": "Add_Node", - "x": 4825, - "y": 5053, - "uuid": "610ee41c-45ff-486e-a074-cc88b2e282f6" + "type": "Scaler_Node", + "x": 4740, + "y": 5013, + "uuid": "99788e6a-af8c-4b31-bdc3-b7c275743bb2" }, { - "type": "Add_Node", - "x": 5189, - "y": 4936, - "uuid": "7f781f85-a9dd-4d28-ba79-91bb69c9254a" + "type": "Print_Node", + "x": 5178, + "y": 4946, + "uuid": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4" + }, + { + "type": "Scaler_Node", + "x": 4733, + "y": 5122, + "uuid": "fb254b28-ef69-4fc1-8619-ed4fd0581689" } ], "connections": [ - { - "start_id": "32fa39d4-d90b-46ea-bcec-bbb52f12e217", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "start_port": "value", - "end_port": "input A" - }, - { - "start_id": "610ee41c-45ff-486e-a074-cc88b2e282f6", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "start_port": "output", - "end_port": "input B" - }, { "start_id": "32fa39d4-d90b-46ea-bcec-bbb52f12e217", "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", @@ -46,15 +40,27 @@ }, { "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "end_id": "7f781f85-a9dd-4d28-ba79-91bb69c9254a", + "end_id": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4", "start_port": "Ex Out", "end_port": "Ex In" }, + { + "start_id": "99788e6a-af8c-4b31-bdc3-b7c275743bb2", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_port": "value", + "end_port": "input A" + }, + { + "start_id": "fb254b28-ef69-4fc1-8619-ed4fd0581689", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_port": "value", + "end_port": "input B" + }, { "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "end_id": "7f781f85-a9dd-4d28-ba79-91bb69c9254a", + "end_id": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4", "start_port": "output", - "end_port": "input A" + "end_port": "input" } ] } \ No newline at end of file From cfae4af72c21dc87e0fcc4831555abc815f126ac Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 01:49:44 -0400 Subject: [PATCH 58/88] node look changed --- images/node_editor.jpg | Bin 161900 -> 103207 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/node_editor.jpg b/images/node_editor.jpg index a170133ad3bd3cc2d205dfa19ed4a1f37a7180c3..9007b0ad3d5789b50aa8761384b7bf343146edee 100644 GIT binary patch literal 103207 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 Date: Sat, 8 Apr 2023 01:56:31 -0400 Subject: [PATCH 59/88] forcing github to update image --- README.md | 2 +- images/{node_editor.jpg => node_editor2.jpg} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename images/{node_editor.jpg => node_editor2.jpg} (100%) diff --git a/README.md b/README.md index 5d02e6a..31528a0 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ For minimal GUI code for creating a node network see [GUI-nodes-only](https://gi Converting the original code base over to this more fully fledged out node editor, there will be loads of code smells. I’ll hold off on doing a refactor until the core components are fully functional. -![nodes](https://github.com/bhowiebkr/simple-node-editor/blob/master/images/node_editor.jpg) +![nodes](https://github.com/bhowiebkr/simple-node-editor/blob/master/images/node_editor2.jpg) [![Video](http://img.youtube.com/vi/DOsFJ8lm9dU/0.jpg)](http://www.youtube.com/watch?v=DOsFJ8lm9dU) diff --git a/images/node_editor.jpg b/images/node_editor2.jpg similarity index 100% rename from images/node_editor.jpg rename to images/node_editor2.jpg From 0c09629aa7906194fe92d7bb93f6e966642a8b80 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 10:48:50 -0400 Subject: [PATCH 60/88] added a status to nodes --- node_editor/gui/node.py | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index 8d488f9..2919bd7 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -2,6 +2,13 @@ from PySide6.QtCore import Qt from node_editor.gui.port import Port +from enum import Enum + + +class Node_Status(Enum): + CLEAN = 1 + DIRTY = 2 + ERROR = 3 class Node(QtWidgets.QGraphicsItem): @@ -44,6 +51,7 @@ def __init__(self): self._title_text = "Title" self._title_color = QtGui.QColor(123, 33, 177) self.size = QtCore.QRectF() # Size of + self.status = Node_Status.DIRTY self.widget = QtWidgets.QWidget() self.widget.resize(0, 0) @@ -60,10 +68,19 @@ def __init__(self): self.title_path = QtGui.QPainterPath() # The path for the title self.type_path = QtGui.QPainterPath() # The path for the type self.misc_path = QtGui.QPainterPath() # a bunch of other stuff + self.status_path = QtGui.QPainterPath() # A path showing the status of the node self.horizontal_margin = 15 # horizontal margin self.vertical_margin = 15 # vertical margin + def get_status_color(self): + if self.status == Node_Status.CLEAN: + return QtGui.QColor(0, 255, 0) + elif self.status == Node_Status.DIRTY: + return QtGui.QColor(255, 165, 0) + elif self.status == Node_Status.ERROR: + return QtGui.QColor(255, 0, 0) + def boundingRect(self): return self.size @@ -118,6 +135,11 @@ def paint(self, painter, option=None, widget=None): painter.drawPath(self.type_path) painter.drawPath(self.misc_path) + # Status path + painter.setBrush(self.get_status_color()) + painter.setPen(self.get_status_color().darker()) + painter.drawPath(self.status_path.simplified()) + # Draw the highlight if self.isSelected(): painter.setPen(QtGui.QPen(self._title_color.lighter(), 2)) @@ -222,8 +244,14 @@ def build(self): self.size = QtCore.QRectF(-total_width / 2, -total_height / 2, total_width, total_height) self.path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height + 10, 5, 5) - # The color on the title + # Draw the status rectangle + self.status_path.setFillRule(Qt.WindingFill) + self.status_path.addRoundedRect(total_width / 2 - 12, -total_height / 2 + 2, 10, 10, 2, 2) + # self.status_path.addRect(total_width / 2 - 10, -total_height / 2, 5, 5) + # self.status_path.addRect(total_width / 2 - 10, -total_height / 2 + 15, 5, 5) + # self.status_path.addRect(total_width / 2 - 5, -total_height / 2 + 15, 5, 5) + # The color on the title self.title_bg_path = QtGui.QPainterPath() # The title background path self.title_bg_path.setFillRule(Qt.WindingFill) self.title_bg_path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, bg_height, 5, 5) @@ -355,11 +383,18 @@ def delete(self): def init_widget(self): pass - def compute(self): + def execute(self): # Get the values from the input ports + self.execute_inputs() # Compute the value + pass - # Signal output ports + # execute nodes connected to output + self.execute_outputs() + + def execute_inputs(self): + pass + def execute_outputs(self): pass From 0c520db0a7aabd7a4bc6a771f525f7ac0bb3f61a Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 13:39:51 -0400 Subject: [PATCH 61/88] renamed port to pin --- Example_Project/Add_node.py | 12 ++-- Example_Project/Button_node.py | 4 +- Example_Project/Print_node.py | 4 +- Example_Project/Scaler_node.py | 2 +- Example_Project/test.json | 64 +++++++++--------- node_editor/gui/connection.py | 74 ++++++++++---------- node_editor/gui/node.py | 120 ++++++++++++++++----------------- node_editor/gui/node_editor.py | 16 ++--- node_editor/gui/node_widget.py | 24 +++---- node_editor/gui/port.py | 64 +++++++++--------- 10 files changed, 191 insertions(+), 193 deletions(-) diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py index 2d10e86..e7189a3 100644 --- a/Example_Project/Add_node.py +++ b/Example_Project/Add_node.py @@ -1,4 +1,3 @@ - from node_editor.gui.node import Node @@ -10,11 +9,10 @@ def __init__(self): self.type_text = "Logic Nodes" self.set_color(title_color=(0, 128, 0)) - self.add_port(name="Ex In", is_output=False, execution=True) - self.add_port(name="Ex Out", is_output=True, execution=True) + self.add_pin(name="Ex In", is_output=False, execution=True) + self.add_pin(name="Ex Out", is_output=True, execution=True) - self.add_port(name="input A", is_output=False) - self.add_port(name="input B", is_output=False) - self.add_port(name="output", is_output=True) + self.add_pin(name="input A", is_output=False) + self.add_pin(name="input B", is_output=False) + self.add_pin(name="output", is_output=True) self.build() - diff --git a/Example_Project/Button_node.py b/Example_Project/Button_node.py index 90d8a12..a9345f4 100644 --- a/Example_Project/Button_node.py +++ b/Example_Project/Button_node.py @@ -11,8 +11,8 @@ def __init__(self): self.type_text = "Inputs" self.set_color(title_color=(128, 0, 0)) - self.add_port(name="Ex Out", is_output=True, execution=True) - # self.add_port(name="value", is_output=True) + self.add_pin(name="Ex Out", is_output=True, execution=True) + # self.add_pin(name="value", is_output=True) self.build() diff --git a/Example_Project/Print_node.py b/Example_Project/Print_node.py index d0fa7c3..ffb722a 100644 --- a/Example_Project/Print_node.py +++ b/Example_Project/Print_node.py @@ -9,7 +9,7 @@ def __init__(self): self.type_text = "Debug Nodes" self.set_color(title_color=(160, 32, 240)) - self.add_port(name="Ex In", is_output=False, execution=True) + self.add_pin(name="Ex In", is_output=False, execution=True) - self.add_port(name="input", is_output=False) + self.add_pin(name="input", is_output=False) self.build() diff --git a/Example_Project/Scaler_node.py b/Example_Project/Scaler_node.py index 8a94583..fd79edc 100644 --- a/Example_Project/Scaler_node.py +++ b/Example_Project/Scaler_node.py @@ -12,7 +12,7 @@ def __init__(self): self.type_text = "Constants" self.set_color(title_color=(255, 165, 0)) - self.add_port(name="value", is_output=True) + self.add_pin(name="value", is_output=True) self.build() diff --git a/Example_Project/test.json b/Example_Project/test.json index 0ef42aa..70229c5 100644 --- a/Example_Project/test.json +++ b/Example_Project/test.json @@ -1,16 +1,16 @@ { "nodes": [ { - "type": "Add_Node", - "x": 4974, - "y": 4947, - "uuid": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b" + "type": "Scaler_Node", + "x": 4733, + "y": 5122, + "uuid": "fb254b28-ef69-4fc1-8619-ed4fd0581689" }, { - "type": "Button_Node", - "x": 4734, - "y": 4894, - "uuid": "32fa39d4-d90b-46ea-bcec-bbb52f12e217" + "type": "Print_Node", + "x": 5178, + "y": 4946, + "uuid": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4" }, { "type": "Scaler_Node", @@ -19,48 +19,48 @@ "uuid": "99788e6a-af8c-4b31-bdc3-b7c275743bb2" }, { - "type": "Print_Node", - "x": 5178, - "y": 4946, - "uuid": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4" + "type": "Button_Node", + "x": 4734, + "y": 4894, + "uuid": "32fa39d4-d90b-46ea-bcec-bbb52f12e217" }, { - "type": "Scaler_Node", - "x": 4733, - "y": 5122, - "uuid": "fb254b28-ef69-4fc1-8619-ed4fd0581689" + "type": "Add_Node", + "x": 4974, + "y": 4947, + "uuid": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b" } ], "connections": [ - { - "start_id": "32fa39d4-d90b-46ea-bcec-bbb52f12e217", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "start_port": "Ex Out", - "end_port": "Ex In" - }, { "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", "end_id": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4", - "start_port": "Ex Out", - "end_port": "Ex In" + "start_pin": "output", + "end_pin": "input" }, { - "start_id": "99788e6a-af8c-4b31-bdc3-b7c275743bb2", + "start_id": "fb254b28-ef69-4fc1-8619-ed4fd0581689", "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "start_port": "value", - "end_port": "input A" + "start_pin": "value", + "end_pin": "input B" }, { - "start_id": "fb254b28-ef69-4fc1-8619-ed4fd0581689", + "start_id": "99788e6a-af8c-4b31-bdc3-b7c275743bb2", "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "start_port": "value", - "end_port": "input B" + "start_pin": "value", + "end_pin": "input A" }, { "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", "end_id": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4", - "start_port": "output", - "end_port": "input" + "start_pin": "Ex Out", + "end_pin": "Ex In" + }, + { + "start_id": "32fa39d4-d90b-46ea-bcec-bbb52f12e217", + "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_pin": "Ex Out", + "end_pin": "Ex In" } ] } \ No newline at end of file diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection.py index 78cd134..9540e15 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection.py @@ -6,8 +6,8 @@ class Connection(QtWidgets.QGraphicsPathItem): A Connection represents a graphical connection between two NodePorts in a PySide6 application. Attributes: - start_port (NodePort): The NodePort where the connection starts. - end_port (NodePort): The NodePort where the connection ends. + start_pin (NodePort): The NodePort where the connection starts. + end_pin (NodePort): The NodePort where the connection ends. start_pos (QPointF): The starting position of the connection. end_pos (QPointF): The ending position of the connection. @@ -20,8 +20,8 @@ class Connection(QtWidgets.QGraphicsPathItem): Example: conn = Connection(parent) - conn.start_port = start_port - conn.end_port = end_port + conn.start_pin = start_pin + conn.end_pin = end_pin conn.update_start_and_end_pos() conn.update_path() """ @@ -35,8 +35,8 @@ def __init__(self, parent): self.setBrush(QtCore.Qt.NoBrush) self.setZValue(-1) - self._start_port = None - self._end_port = None + self._start_pin = None + self._end_pin = None self.start_pos = QtCore.QPointF() self.end_pos = QtCore.QPointF() @@ -45,33 +45,33 @@ def __init__(self, parent): def delete(self): """ - Deletes the connection and removes it from the scene and any connected ports. + Deletes the connection and removes it from the scene and any connected pins. """ - for port in (self._start_port, self._end_port): - if port: - # port.remove_connection(self) - port.connection = None - port = None + for pin in (self._start_pin, self._end_pin): + if pin: + # pin.remove_connection(self) + pin.connection = None + pin = None self.scene().removeItem(self) @property - def start_port(self): - return self._start_port + def start_pin(self): + return self._start_pin @property - def end_port(self): - return self._end_port + def end_pin(self): + return self._end_pin - @start_port.setter - def start_port(self, port): - self._start_port = port - self._start_port.connection = self + @start_pin.setter + def start_pin(self, pin): + self._start_pin = pin + self._start_pin.connection = self - @end_port.setter - def end_port(self, port): - self._end_port = port - self._end_port.connection = self + @end_pin.setter + def end_pin(self, pin): + self._end_pin = pin + self._end_pin.connection = self def nodes(self): """ @@ -80,33 +80,33 @@ def nodes(self): Returns: tuple: A tuple of the two Node objects connected by this Connection. """ - return (self._start_port.node(), self._end_port.node()) + return (self._start_pin.node(), self._end_pin.node()) def update_start_and_end_pos(self): """ Update the start and end positions of the Connection. - Get the start and end ports and use them to set the start and end positions. + Get the start and end pins and use them to set the start and end positions. """ - if self.start_port and not self.start_port.is_output(): + if self.start_pin and not self.start_pin.is_output(): # print("flipping connection") - temp = self.end_port - self._end_port = self.start_port - self._start_port = temp + temp = self.end_pin + self._end_pin = self.start_pin + self._start_pin = temp - if self._start_port: - self.start_pos = self._start_port.scenePos() + if self._start_pin: + self.start_pos = self._start_pin.scenePos() # if we are pulling off an exiting connection we skip code below - if self._end_port: - self.end_pos = self._end_port.scenePos() + if self._end_pin: + self.end_pos = self._end_pin.scenePos() self.update_path() def update_path(self): """ - Draws a smooth cubic curve from the start to end ports. + Draws a smooth cubic curve from the start to end pins. """ path = QtGui.QPainterPath() path.moveTo(self.start_pos) @@ -132,8 +132,8 @@ def paint(self, painter, option=None, widget=None): thickness = 0 color = QtGui.QColor(0, 128, 255) - if self._start_port: - if self._start_port.is_execution(): + if self._start_pin: + if self._start_pin.is_execution(): thickness = 3 color = QtGui.QColor(255, 255, 255) diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index 2919bd7..c330ec4 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -1,7 +1,7 @@ from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Qt -from node_editor.gui.port import Port +from node_editor.gui.port import Pin from enum import Enum @@ -27,8 +27,8 @@ class Node(QtWidgets.QGraphicsItem): The width of the node. _height : int The height of the node. - _ports : list - A list of ports connected to this node. + _pins : list + A list of pins connected to this node. title_path : QtGui.QPainterPath The path for the title of the node. type_path : QtGui.QPainterPath @@ -60,7 +60,7 @@ def __init__(self): self._width = 20 # The Width of the node self._height = 20 # the height of the node - self._ports = [] # A list of ports + self._pins = [] # A list of pins self.uuid = None # An identifier to used when saving and loading the scene self.node_color = QtGui.QColor(20, 20, 20, 200) @@ -146,39 +146,39 @@ def paint(self, painter, option=None, widget=None): painter.setBrush(Qt.NoBrush) painter.drawPath(self.path) - def get_port(self, name): - for port in self._ports: - if port.name() == name: - return port + def get_pin(self, name): + for pin in self._pins: + if pin.name() == name: + return pin - def add_port(self, name, is_output=False, execution=False): + def add_pin(self, name, is_output=False, execution=False): """ - Adds a new port to the node. + Adds a new pin to the node. Args: - name (str): The name of the new port. - is_output (bool, optional): True if the new port is an output port, False if it's an input port. Default is False. - flags (int, optional): A set of flags to apply to the new port. Default is 0. - ptr (Any, optional): A pointer to associate with the new port. Default is None. + name (str): The name of the new pin. + is_output (bool, optional): True if the new pin is an output pin, False if it's an input pin. Default is False. + flags (int, optional): A set of flags to apply to the new pin. Default is 0. + ptr (Any, optional): A pointer to associate with the new pin. Default is None. Returns: None: This method doesn't return anything. """ - port = Port(self, self.scene()) - port.set_is_output(is_output) - port.set_name(name) - port.set_node(node=self) - port.set_execution(execution) + pin = Pin(self, self.scene()) + pin.set_is_output(is_output) + pin.set_name(name) + pin.set_node(node=self) + pin.set_execution(execution) - self._ports.append(port) + self._pins.append(pin) def build(self): """ Builds the node by constructing its graphical representation. This method calculates the dimensions of the node, sets the fonts for various elements, and adds the necessary - graphical components to the node, such as the title, type, and ports. Once the graphical representation of the node + graphical components to the node, such as the title, type, and pins. Once the graphical representation of the node is constructed, the `setPath` method is called to set the path for the node. Returns: @@ -198,7 +198,7 @@ def build(self): # The fonts what will be used title_font = QtGui.QFont("Lucida Sans Unicode", pointSize=12) title_type_font = QtGui.QFont("Lucida Sans Unicode", pointSize=8) - port_font = QtGui.QFont("Lucida Sans Unicode") + pin_font = QtGui.QFont("Lucida Sans Unicode") # Get the dimentions of the title and type title_dim = { @@ -220,20 +220,20 @@ def build(self): # total_height = sum([title_dim["h"], title_type_dim["h"]]) + self.widget.size().height() total_height = bg_height + self.widget.size().height() - port_dim = None - # Add the heigth for each of the ports + pin_dim = None + # Add the heigth for each of the pins exec_height_added = False - for port in self._ports: - port_dim = { - "w": QtGui.QFontMetrics(port_font).horizontalAdvance(port.name()), - "h": QtGui.QFontMetrics(port_font).height(), + for pin in self._pins: + pin_dim = { + "w": QtGui.QFontMetrics(pin_font).horizontalAdvance(pin.name()), + "h": QtGui.QFontMetrics(pin_font).height(), } - if port_dim["w"] > total_width: - total_width = port_dim["w"] + if pin_dim["w"] > total_width: + total_width = pin_dim["w"] - if port.is_execution() and not exec_height_added or not port.is_execution(): - total_height += port_dim["h"] + if pin.is_execution() and not exec_height_added or not pin.is_execution(): + total_height += pin_dim["h"] exec_height_added = True # Add the margin to the total_width @@ -274,34 +274,34 @@ def build(self): f"{self._type_text}", ) - # Position the ports. Execution ports stay on the same row - if port_dim: + # Position the pins. Execution pins stay on the same row + if pin_dim: # y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + 5 y = bg_height - total_height / 2 - 10 - # Do the execution ports + # Do the execution pins exe_shifted = False - for port in self._ports: - if not port.is_execution(): + for pin in self._pins: + if not pin.is_execution(): continue if not exe_shifted: - y += port_dim["h"] + y += pin_dim["h"] exe_shifted = True - if port.is_output(): - port.setPos(total_width / 2 - 10, y) + if pin.is_output(): + pin.setPos(total_width / 2 - 10, y) else: - port.setPos(-total_width / 2 + 10, y) + pin.setPos(-total_width / 2 + 10, y) - # Do the rest of the ports - for port in self._ports: - if port.is_execution(): + # Do the rest of the pins + for pin in self._pins: + if pin.is_execution(): continue - y += port_dim["h"] + y += pin_dim["h"] - if port.is_output(): - port.setPos(total_width / 2 - 10, y) + if pin.is_output(): + pin.setPos(total_width / 2 - 10, y) else: - port.setPos(-total_width / 2 + 10, y) + pin.setPos(-total_width / 2 + 10, y) self._width = total_width self._height = total_height @@ -311,23 +311,23 @@ def build(self): def select_connections(self, value): """ - Sets the highlighting of all connected ports to the specified value. + Sets the highlighting of all connected pins to the specified value. - This method takes a boolean value `value` as input and sets the `_do_highlight` attribute of all connected ports to - this value. If a port is not connected, this method does nothing for that port. After setting the `_do_highlight` - attribute for all connected ports, the `update_path` method is called for each connection. + This method takes a boolean value `value` as input and sets the `_do_highlight` attribute of all connected pins to + this value. If a pin is not connected, this method does nothing for that pin. After setting the `_do_highlight` + attribute for all connected pins, the `update_path` method is called for each connection. Args: - value: A boolean value indicating whether to highlight the connected ports or not. + value: A boolean value indicating whether to highlight the connected pins or not. Returns: None. """ - for port in self._ports: - if port.connection: - port.connection._do_highlight = value - port.connection.update_path() + for pin in self._pins: + if pin.connection: + pin.connection._do_highlight = value + pin.connection.update_path() def contextMenuEvent(self, event): """Open a context menu when the node is right-clicked. @@ -364,7 +364,7 @@ def contextMenuEvent(self, event): def delete(self): """Deletes the connection. - This function removes any connected ports by calling :any:`Port.remove_connection` for each port + This function removes any connected pins by calling :any:`Port.remove_connection` for each pin connected to this connection. After all connections have been removed, the stored :any:`Port` references are set to None. Finally, :any:`QGraphicsScene.removeItem` is called on the scene to remove this widget. @@ -373,7 +373,7 @@ def delete(self): None """ - to_delete = [port.connection for port in self._ports if port.connection] + to_delete = [pin.connection for pin in self._pins if pin.connection] for connection in to_delete: connection.delete() @@ -384,7 +384,7 @@ def init_widget(self): pass def execute(self): - # Get the values from the input ports + # Get the values from the input pins self.execute_inputs() # Compute the value diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index 5b5834f..1c30935 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -4,7 +4,7 @@ from node_editor.gui.connection import Connection from node_editor.gui.node import Node -from node_editor.gui.port import Port +from node_editor.gui.port import Pin class NodeEditor(QtCore.QObject): @@ -13,8 +13,8 @@ class NodeEditor(QtCore.QObject): nodes and connections. :ivar connection: A Connection object representing the current connection being created. :vartype connection: Connection - :ivar port: A Port object representing the current port being clicked for a new connection. - :vartype port: Port + :ivar port: A Pin object representing the current port being clicked for a new connection. + :vartype port: Pin :ivar scene: The QGraphicsScene on which the nodes and connections are drawn. :vartype scene: QGraphicsScene :ivar _last_selected: The last Node object that was selected. @@ -77,7 +77,7 @@ def eventFilter(self, watched, event): if event.button() == QtCore.Qt.LeftButton: item = self.item_at(event.scenePos()) - if isinstance(item, Port): + if isinstance(item, Pin): self.connection = Connection(None) self.scene.addItem(self.connection) self.port = item @@ -90,7 +90,7 @@ def eventFilter(self, watched, event): self.connection = Connection(None) self.connection.start_pos = item.start_pos self.scene.addItem(self.connection) - self.port = item.start_port + self.port = item.start_pin self.connection.end_pos = event.scenePos() self.connection.update_start_and_end_pos() # to fix the offset return True @@ -129,7 +129,7 @@ def eventFilter(self, watched, event): item = self.item_at(event.scenePos()) # connecting a port - if isinstance(item, Port): + if isinstance(item, Pin): if self.port.can_connect_to(item): # print("Making connection") @@ -141,8 +141,8 @@ def eventFilter(self, watched, event): self.port.clear_connection() item.clear_connection() - self.connection.start_port = self.port - self.connection.end_port = item + self.connection.start_pin = self.port + self.connection.end_pin = item self.connection.update_start_and_end_pos() else: # print("Deleting connection") diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index 6284ff3..bf6f23b 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -10,7 +10,7 @@ from node_editor.gui.connection import Connection from node_editor.gui.node import Node -from node_editor.gui.port import Port +from node_editor.gui.port import Pin class NodeScene(QtWidgets.QGraphicsScene): @@ -94,11 +94,11 @@ def load_scene(self, json_path, imports): connection = Connection(None) self.scene.addItem(connection) - start_port = self.node_lookup[c["start_id"]].get_port(c["start_port"]) - end_port = self.node_lookup[c["end_id"]].get_port(c["end_port"]) + start_pin = self.node_lookup[c["start_id"]].get_pin(c["start_pin"]) + end_pin = self.node_lookup[c["end_id"]].get_pin(c["end_pin"]) - connection.start_port = start_port - connection.end_port = end_port + connection.start_pin = start_pin + connection.end_pin = end_pin connection.update_start_and_end_pos() def save_project(self, json_path): @@ -118,22 +118,22 @@ def save_project(self, json_path): nodes = item.nodes() start_id = str(nodes[0].uuid) end_id = str(nodes[1].uuid) - start_port = item.start_port.name() - end_port = item.end_port.name() + start_pin = item.start_pin.name() + end_pin = item.end_pin.name() # print(f"Node ids {start_id, end_id}") - # print(f"connected ports {item.start_port.name(), item.end_port.name()}") + # print(f"connected ports {item.start_pin.name(), item.end_pin.name()}") connection = { "start_id": start_id, "end_id": end_id, - "start_port": start_port, - "end_port": end_port, + "start_pin": start_pin, + "end_pin": end_pin, } scene["connections"].append(connection) continue - # Ports - if isinstance(item, Port): + # Pins + if isinstance(item, Pin): continue # Nodes diff --git a/node_editor/gui/port.py b/node_editor/gui/port.py index ec6f235..d84a808 100644 --- a/node_editor/gui/port.py +++ b/node_editor/gui/port.py @@ -1,33 +1,33 @@ from PySide6 import QtCore, QtGui, QtWidgets -class Port(QtWidgets.QGraphicsPathItem): - """A graphics item representing an input or output port for a node in a node-based graphical user interface. +class Pin(QtWidgets.QGraphicsPathItem): + """A graphics item representing an input or output pin for a node in a node-based graphical user interface. Attributes: - radius_ (int): The radius of the port circle. - margin (int): The margin between the port circle and the port name text. - port_text_height (int): The height of the port name text. - port_text_width (int): The width of the port name text. - _is_output (bool): True if the port is an output port, False if it is an input port. - _name (str): The name of the port. - m_node (Node): The node to which the port belongs. - connection (Connection): The connection attached to the port, if any. - text_path (QPainterPath): The path used to draw the port name text. + radius_ (int): The radius of the pin circle. + margin (int): The margin between the pin circle and the pin name text. + pin_text_height (int): The height of the pin name text. + pin_text_width (int): The width of the pin name text. + _is_output (bool): True if the pin is an output pin, False if it is an input pin. + _name (str): The name of the pin. + m_node (Node): The node to which the pin belongs. + connection (Connection): The connection attached to the pin, if any. + text_path (QPainterPath): The path used to draw the pin name text. Methods: - set_is_output(is_output: bool) -> None: Set the output status of the port. - set_name(name: str) -> None: Set the name of the port. - set_node(node: Node) -> None: Set the node to which the port belongs. - set_port_flags(flags: int) -> None: Set the port flags. - set_ptr(ptr: Any) -> None: Set the pointer to the port. - name() -> str: Get the name of the port. - is_output() -> bool: Check if the port is an output port. - node() -> Node: Get the node to which the port belongs. - paint(painter: QtGui.QPainter, option: QtWidgets.QStyleOptionGraphicsItem, widget: Optional[QtWidgets.QWidget]) -> None: Paint the port. - clear_connection() -> None: Clear the connection attached to the port. - can_connect_to(port: Port) -> bool: Check if the port can be connected to another port. - is_connected() -> bool: Check if the port is connected to another port. + set_is_output(is_output: bool) -> None: Set the output status of the pin. + set_name(name: str) -> None: Set the name of the pin. + set_node(node: Node) -> None: Set the node to which the pin belongs. + set_pin_flags(flags: int) -> None: Set the pin flags. + set_ptr(ptr: Any) -> None: Set the pointer to the pin. + name() -> str: Get the name of the pin. + is_output() -> bool: Check if the pin is an output pin. + node() -> Node: Get the node to which the pin belongs. + paint(painter: QtGui.QPainter, option: QtWidgets.QStyleOptionGraphicsItem, widget: Optional[QtWidgets.QWidget]) -> None: Paint the pin. + clear_connection() -> None: Clear the connection attached to the pin. + can_connect_to(pin: Pin) -> bool: Check if the pin can be connected to another pin. + is_connected() -> bool: Check if the pin is connected to another pin. itemChange(change: QtWidgets.QGraphicsItem.GraphicsItemChange, value: Any) -> Any: Handle item change events. """ @@ -59,7 +59,7 @@ def __init__(self, parent, scene): self.font = QtGui.QFont() self.font_metrics = QtGui.QFontMetrics(self.font) - self.port_text_height = self.font_metrics.height() + self.pin_text_height = self.font_metrics.height() self._is_output = False self._name = None @@ -95,14 +95,14 @@ def set_is_output(self, is_output): def set_name(self, name): self._name = name nice_name = self._name.replace("_", " ").title() - self.port_text_width = self.font_metrics.horizontalAdvance(nice_name) + self.pin_text_width = self.font_metrics.horizontalAdvance(nice_name) if self._is_output: - x = -self.radius_ - self.margin - self.port_text_width + x = -self.radius_ - self.margin - self.pin_text_width else: x = self.radius_ + self.margin - y = self.port_text_height / 4 + y = self.pin_text_height / 4 self.text_path.addText(x, y, self.font, nice_name) @@ -146,14 +146,14 @@ def clear_connection(self): if self.connection: self.connection.delete() - def can_connect_to(self, port): - # print(port.node(), self.node()) - if not port: + def can_connect_to(self, pin): + # print(pin.node(), self.node()) + if not pin: return False - if port.node() == self.node(): + if pin.node() == self.node(): return False - return self._is_output != port._is_output + return self._is_output != pin._is_output def is_connected(self): return bool(self.connection) From 787dc6b86da6aa45149d8798bfea9a39df8186a2 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 14:01:47 -0400 Subject: [PATCH 62/88] refactor node into logic and graphics --- node_editor/gui/common.py | 7 + node_editor/gui/node.py | 362 +++----------------------- node_editor/gui/node_graphics_item.py | 230 ++++++++++++++++ 3 files changed, 266 insertions(+), 333 deletions(-) create mode 100644 node_editor/gui/common.py create mode 100644 node_editor/gui/node_graphics_item.py diff --git a/node_editor/gui/common.py b/node_editor/gui/common.py new file mode 100644 index 0000000..ab7e2c5 --- /dev/null +++ b/node_editor/gui/common.py @@ -0,0 +1,7 @@ +from enum import Enum + + +class Node_Status(Enum): + CLEAN = 1 + DIRTY = 2 + ERROR = 3 diff --git a/node_editor/gui/node.py b/node_editor/gui/node.py index c330ec4..8e892df 100644 --- a/node_editor/gui/node.py +++ b/node_editor/gui/node.py @@ -2,149 +2,51 @@ from PySide6.QtCore import Qt from node_editor.gui.port import Pin -from enum import Enum +from node_editor.gui.node_graphics_item import Node_Graphics_Item +from node_editor.gui.common import Node_Status -class Node_Status(Enum): - CLEAN = 1 - DIRTY = 2 - ERROR = 3 - - -class Node(QtWidgets.QGraphicsItem): - """ - A QGraphicsPathItem representing a node in the node editor. - - Attributes - ---------- - node_color : QtGui.QColor - The color of the node. - _title_text : str - The text of the node's title. - _type_text : str - The text of the node's type. - _width : int - The width of the node. - _height : int - The height of the node. - _pins : list - A list of pins connected to this node. - title_path : QtGui.QPainterPath - The path for the title of the node. - type_path : QtGui.QPainterPath - The path for the type of the node. - misc_path : QtGui.QPainterPath - The path for miscellaneous items. - horizontal_margin : int - The horizontal margin of the node. - vertical_margin : int - The vertical margin of the node. - - """ - +class Node(Node_Graphics_Item): def __init__(self): super().__init__() - self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable) - self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable) - - self._title_text = "Title" - self._title_color = QtGui.QColor(123, 33, 177) - self.size = QtCore.QRectF() # Size of - self.status = Node_Status.DIRTY - - self.widget = QtWidgets.QWidget() - self.widget.resize(0, 0) - - self._type_text = "base" - - self._width = 20 # The Width of the node - self._height = 20 # the height of the node - self._pins = [] # A list of pins - self.uuid = None # An identifier to used when saving and loading the scene - - self.node_color = QtGui.QColor(20, 20, 20, 200) - - self.title_path = QtGui.QPainterPath() # The path for the title - self.type_path = QtGui.QPainterPath() # The path for the type - self.misc_path = QtGui.QPainterPath() # a bunch of other stuff - self.status_path = QtGui.QPainterPath() # A path showing the status of the node - - self.horizontal_margin = 15 # horizontal margin - self.vertical_margin = 15 # vertical margin - - def get_status_color(self): - if self.status == Node_Status.CLEAN: - return QtGui.QColor(0, 255, 0) - elif self.status == Node_Status.DIRTY: - return QtGui.QColor(255, 165, 0) - elif self.status == Node_Status.ERROR: - return QtGui.QColor(255, 0, 0) + # Override me + def init_widget(self): + pass - def boundingRect(self): - return self.size + def execute(self): + # Get the values from the input pins + self.execute_inputs() - def set_color(self, title_color=(123, 33, 177), background_color=(20, 20, 20, 200)): - self._title_color = QtGui.QColor(title_color[0], title_color[1], title_color[2]) - self.node_color = QtGui.QColor(background_color[0], background_color[1], background_color[2]) + # Compute the value + pass - @property - def title(self): - return self._title_text + # execute nodes connected to output + self.execute_outputs() - @title.setter - def title(self, title): - self._title_text = title + def execute_inputs(self): + pass - @property - def type_text(self): - return self._type_text + def execute_outputs(self): + pass - @type_text.setter - def type_text(self, type_text): - self._type_text = type_text + def delete(self): + """Deletes the connection. - def paint(self, painter, option=None, widget=None): - """ - Paints the node on the given painter. + This function removes any connected pins by calling :any:`Port.remove_connection` for each pin + connected to this connection. After all connections have been removed, the stored :any:`Port` + references are set to None. Finally, :any:`QGraphicsScene.removeItem` is called on the scene to + remove this widget. - Args: - painter (QtGui.QPainter): The painter to use for drawing the node. - option (QStyleOptionGraphicsItem): The style options to use for drawing the node (optional). - widget (QWidget): The widget to use for drawing the node (optional). + Returns: + None """ - painter.setPen(self.node_color.lighter()) - painter.setBrush(self.node_color) - painter.drawPath(self.path) - - gradient = QtGui.QLinearGradient() - gradient.setStart(0, -90) - gradient.setFinalStop(0, 0) - gradient.setColorAt(0, self._title_color) # Start color (white) - gradient.setColorAt(1, self._title_color.darker()) # End color (blue) - - painter.setBrush(QtGui.QBrush(gradient)) - painter.setPen(self._title_color) - painter.drawPath(self.title_bg_path.simplified()) - - painter.setPen(QtCore.Qt.NoPen) - painter.setBrush(QtCore.Qt.white) - - painter.drawPath(self.title_path) - painter.drawPath(self.type_path) - painter.drawPath(self.misc_path) - - # Status path - painter.setBrush(self.get_status_color()) - painter.setPen(self.get_status_color().darker()) - painter.drawPath(self.status_path.simplified()) + to_delete = [pin.connection for pin in self._pins if pin.connection] + for connection in to_delete: + connection.delete() - # Draw the highlight - if self.isSelected(): - painter.setPen(QtGui.QPen(self._title_color.lighter(), 2)) - painter.setBrush(Qt.NoBrush) - painter.drawPath(self.path) + self.scene().removeItem(self) def get_pin(self, name): for pin in self._pins: @@ -173,142 +75,6 @@ def add_pin(self, name, is_output=False, execution=False): self._pins.append(pin) - def build(self): - """ - Builds the node by constructing its graphical representation. - - This method calculates the dimensions of the node, sets the fonts for various elements, and adds the necessary - graphical components to the node, such as the title, type, and pins. Once the graphical representation of the node - is constructed, the `setPath` method is called to set the path for the node. - - Returns: - None. - """ - - self.init_widget() # configure the widget side of things. We need to get the size of the widget before building the rest of the node - self.widget.setStyleSheet("background-color: " + self.node_color.name() + ";") - self.title_path = QtGui.QPainterPath() # reset - self.type_path = QtGui.QPainterPath() # The path for the type - self.misc_path = QtGui.QPainterPath() # a bunch of other stuff - - bg_height = 35 # background title height - - total_width = self.widget.size().width() - self.path = QtGui.QPainterPath() # The main path - # The fonts what will be used - title_font = QtGui.QFont("Lucida Sans Unicode", pointSize=12) - title_type_font = QtGui.QFont("Lucida Sans Unicode", pointSize=8) - pin_font = QtGui.QFont("Lucida Sans Unicode") - - # Get the dimentions of the title and type - title_dim = { - "w": QtGui.QFontMetrics(title_font).horizontalAdvance(self._title_text), - "h": QtGui.QFontMetrics(title_font).height(), - } - - title_type_dim = { - "w": QtGui.QFontMetrics(title_type_font).horizontalAdvance(f"{self._type_text}"), - "h": QtGui.QFontMetrics(title_type_font).height(), - } - - # Get the max width - for dim in [title_dim["w"], title_type_dim["w"]]: - if dim > total_width: - total_width = dim - - # Add both the title and type height together for the total height - # total_height = sum([title_dim["h"], title_type_dim["h"]]) + self.widget.size().height() - total_height = bg_height + self.widget.size().height() - - pin_dim = None - # Add the heigth for each of the pins - exec_height_added = False - for pin in self._pins: - pin_dim = { - "w": QtGui.QFontMetrics(pin_font).horizontalAdvance(pin.name()), - "h": QtGui.QFontMetrics(pin_font).height(), - } - - if pin_dim["w"] > total_width: - total_width = pin_dim["w"] - - if pin.is_execution() and not exec_height_added or not pin.is_execution(): - total_height += pin_dim["h"] - exec_height_added = True - - # Add the margin to the total_width - total_width += self.horizontal_margin - # total_height += self.vertical_margin - - # Draw the background rectangle - self.size = QtCore.QRectF(-total_width / 2, -total_height / 2, total_width, total_height) - self.path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height + 10, 5, 5) - - # Draw the status rectangle - self.status_path.setFillRule(Qt.WindingFill) - self.status_path.addRoundedRect(total_width / 2 - 12, -total_height / 2 + 2, 10, 10, 2, 2) - # self.status_path.addRect(total_width / 2 - 10, -total_height / 2, 5, 5) - # self.status_path.addRect(total_width / 2 - 10, -total_height / 2 + 15, 5, 5) - # self.status_path.addRect(total_width / 2 - 5, -total_height / 2 + 15, 5, 5) - - # The color on the title - self.title_bg_path = QtGui.QPainterPath() # The title background path - self.title_bg_path.setFillRule(Qt.WindingFill) - self.title_bg_path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, bg_height, 5, 5) - self.title_bg_path.addRect(-total_width / 2, -total_height / 2 + bg_height - 10, 10, 10) # bottom left corner - self.title_bg_path.addRect(total_width / 2 - 10, -total_height / 2 + bg_height - 10, 10, 10) # bottom right corner - - # Draw the title - self.title_path.addText( - -total_width / 2 + 5, - (-total_height / 2) + title_dim["h"] / 2 + 5, - title_font, - self._title_text, - ) - - # Draw the type - self.type_path.addText( - -total_width / 2 + 5, - (-total_height / 2) + title_dim["h"] + 5, - title_type_font, - f"{self._type_text}", - ) - - # Position the pins. Execution pins stay on the same row - if pin_dim: - # y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + 5 - y = bg_height - total_height / 2 - 10 - - # Do the execution pins - exe_shifted = False - for pin in self._pins: - if not pin.is_execution(): - continue - if not exe_shifted: - y += pin_dim["h"] - exe_shifted = True - if pin.is_output(): - pin.setPos(total_width / 2 - 10, y) - else: - pin.setPos(-total_width / 2 + 10, y) - - # Do the rest of the pins - for pin in self._pins: - if pin.is_execution(): - continue - y += pin_dim["h"] - - if pin.is_output(): - pin.setPos(total_width / 2 - 10, y) - else: - pin.setPos(-total_width / 2 + 10, y) - - self._width = total_width - self._height = total_height - - # move the widget to the bottom - self.widget.move(-self.widget.size().width() / 2, total_height / 2 - self.widget.size().height() + 5) - def select_connections(self, value): """ Sets the highlighting of all connected pins to the specified value. @@ -328,73 +94,3 @@ def select_connections(self, value): if pin.connection: pin.connection._do_highlight = value pin.connection.update_path() - - def contextMenuEvent(self, event): - """Open a context menu when the node is right-clicked. - - Args: - event (QtGui.QContextMenuEvent): The context menu event. - - Returns: - None - """ - menu = QtWidgets.QMenu(self) - pos = event.pos() - - # actions - delete_node = QtWidgets.QAction("Delete Node") - edit_node = QtWidgets.QAction("Edit Node") - menu.addAction(delete_node) - - action = menu.exec_(self.mapToGlobal(pos)) - - if action == delete_node: - item_name = self.selectedItems()[0].text() - - if item_name not in ["And", "Not", "Input", "Output"]: - print(f"delete node: {item_name}") - else: - print("Cannot delete default nodes") - - elif action == edit_node: - print("editing node") - - # confirm to open in the editor replacing what is existing - - def delete(self): - """Deletes the connection. - - This function removes any connected pins by calling :any:`Port.remove_connection` for each pin - connected to this connection. After all connections have been removed, the stored :any:`Port` - references are set to None. Finally, :any:`QGraphicsScene.removeItem` is called on the scene to - remove this widget. - - Returns: - None - """ - - to_delete = [pin.connection for pin in self._pins if pin.connection] - for connection in to_delete: - connection.delete() - - self.scene().removeItem(self) - - # Override me - def init_widget(self): - pass - - def execute(self): - # Get the values from the input pins - self.execute_inputs() - - # Compute the value - pass - - # execute nodes connected to output - self.execute_outputs() - - def execute_inputs(self): - pass - - def execute_outputs(self): - pass diff --git a/node_editor/gui/node_graphics_item.py b/node_editor/gui/node_graphics_item.py new file mode 100644 index 0000000..6b17261 --- /dev/null +++ b/node_editor/gui/node_graphics_item.py @@ -0,0 +1,230 @@ +from PySide6 import QtCore, QtGui, QtWidgets +from PySide6.QtCore import Qt + +from node_editor.gui.common import Node_Status + + +class Node_Graphics_Item(QtWidgets.QGraphicsItem): + def __init__(self): + super().__init__() + + self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable) + self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable) + + self.title_text = "Title" + self.title_color = QtGui.QColor(123, 33, 177) + self.size = QtCore.QRectF() # Size of + self.status = Node_Status.DIRTY + + self.widget = QtWidgets.QWidget() + self.widget.resize(0, 0) + + self.type_text = "base" + + self._width = 20 # The Width of the node + self._height = 20 # the height of the node + self._pins = [] # A list of pins + self.uuid = None # An identifier to used when saving and loading the scene + + self.node_color = QtGui.QColor(20, 20, 20, 200) + + self.title_path = QtGui.QPainterPath() # The path for the title + self.type_path = QtGui.QPainterPath() # The path for the type + self.misc_path = QtGui.QPainterPath() # a bunch of other stuff + self.status_path = QtGui.QPainterPath() # A path showing the status of the node + + self.horizontal_margin = 15 # horizontal margin + self.vertical_margin = 15 # vertical margin + + def get_status_color(self): + if self.status == Node_Status.CLEAN: + return QtGui.QColor(0, 255, 0) + elif self.status == Node_Status.DIRTY: + return QtGui.QColor(255, 165, 0) + elif self.status == Node_Status.ERROR: + return QtGui.QColor(255, 0, 0) + + def boundingRect(self): + return self.size + + def set_color(self, title_color=(123, 33, 177), background_color=(20, 20, 20, 200)): + self.title_color = QtGui.QColor(title_color[0], title_color[1], title_color[2]) + self.node_color = QtGui.QColor(background_color[0], background_color[1], background_color[2]) + + def paint(self, painter, option=None, widget=None): + """ + Paints the node on the given painter. + + Args: + painter (QtGui.QPainter): The painter to use for drawing the node. + option (QStyleOptionGraphicsItem): The style options to use for drawing the node (optional). + widget (QWidget): The widget to use for drawing the node (optional). + """ + + painter.setPen(self.node_color.lighter()) + painter.setBrush(self.node_color) + painter.drawPath(self.path) + + gradient = QtGui.QLinearGradient() + gradient.setStart(0, -90) + gradient.setFinalStop(0, 0) + gradient.setColorAt(0, self.title_color) # Start color (white) + gradient.setColorAt(1, self.title_color.darker()) # End color (blue) + + painter.setBrush(QtGui.QBrush(gradient)) + painter.setPen(self.title_color) + painter.drawPath(self.title_bg_path.simplified()) + + painter.setPen(QtCore.Qt.NoPen) + painter.setBrush(QtCore.Qt.white) + + painter.drawPath(self.title_path) + painter.drawPath(self.type_path) + painter.drawPath(self.misc_path) + + # Status path + painter.setBrush(self.get_status_color()) + painter.setPen(self.get_status_color().darker()) + painter.drawPath(self.status_path.simplified()) + + # Draw the highlight + if self.isSelected(): + painter.setPen(QtGui.QPen(self.title_color.lighter(), 2)) + painter.setBrush(Qt.NoBrush) + painter.drawPath(self.path) + + def build(self): + """ + Builds the node by constructing its graphical representation. + + This method calculates the dimensions of the node, sets the fonts for various elements, and adds the necessary + graphical components to the node, such as the title, type, and pins. Once the graphical representation of the node + is constructed, the `setPath` method is called to set the path for the node. + + Returns: + None. + """ + + self.init_widget() # configure the widget side of things. We need to get the size of the widget before building the rest of the node + self.widget.setStyleSheet("background-color: " + self.node_color.name() + ";") + self.title_path = QtGui.QPainterPath() # reset + self.type_path = QtGui.QPainterPath() # The path for the type + self.misc_path = QtGui.QPainterPath() # a bunch of other stuff + + bg_height = 35 # background title height + + total_width = self.widget.size().width() + self.path = QtGui.QPainterPath() # The main path + # The fonts what will be used + title_font = QtGui.QFont("Lucida Sans Unicode", pointSize=12) + title_type_font = QtGui.QFont("Lucida Sans Unicode", pointSize=8) + pin_font = QtGui.QFont("Lucida Sans Unicode") + + # Get the dimentions of the title and type + title_dim = { + "w": QtGui.QFontMetrics(title_font).horizontalAdvance(self.title_text), + "h": QtGui.QFontMetrics(title_font).height(), + } + + title_type_dim = { + "w": QtGui.QFontMetrics(title_type_font).horizontalAdvance(f"{self.type_text}"), + "h": QtGui.QFontMetrics(title_type_font).height(), + } + + # Get the max width + for dim in [title_dim["w"], title_type_dim["w"]]: + if dim > total_width: + total_width = dim + + # Add both the title and type height together for the total height + # total_height = sum([title_dim["h"], title_type_dim["h"]]) + self.widget.size().height() + total_height = bg_height + self.widget.size().height() + + pin_dim = None + # Add the heigth for each of the pins + exec_height_added = False + for pin in self._pins: + pin_dim = { + "w": QtGui.QFontMetrics(pin_font).horizontalAdvance(pin.name()), + "h": QtGui.QFontMetrics(pin_font).height(), + } + + if pin_dim["w"] > total_width: + total_width = pin_dim["w"] + + if pin.is_execution() and not exec_height_added or not pin.is_execution(): + total_height += pin_dim["h"] + exec_height_added = True + + # Add the margin to the total_width + total_width += self.horizontal_margin + # total_height += self.vertical_margin + + # Draw the background rectangle + self.size = QtCore.QRectF(-total_width / 2, -total_height / 2, total_width, total_height) + self.path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height + 10, 5, 5) + + # Draw the status rectangle + self.status_path.setFillRule(Qt.WindingFill) + self.status_path.addRoundedRect(total_width / 2 - 12, -total_height / 2 + 2, 10, 10, 2, 2) + # self.status_path.addRect(total_width / 2 - 10, -total_height / 2, 5, 5) + # self.status_path.addRect(total_width / 2 - 10, -total_height / 2 + 15, 5, 5) + # self.status_path.addRect(total_width / 2 - 5, -total_height / 2 + 15, 5, 5) + + # The color on the title + self.title_bg_path = QtGui.QPainterPath() # The title background path + self.title_bg_path.setFillRule(Qt.WindingFill) + self.title_bg_path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, bg_height, 5, 5) + self.title_bg_path.addRect(-total_width / 2, -total_height / 2 + bg_height - 10, 10, 10) # bottom left corner + self.title_bg_path.addRect(total_width / 2 - 10, -total_height / 2 + bg_height - 10, 10, 10) # bottom right corner + + # Draw the title + self.title_path.addText( + -total_width / 2 + 5, + (-total_height / 2) + title_dim["h"] / 2 + 5, + title_font, + self.title_text, + ) + + # Draw the type + self.type_path.addText( + -total_width / 2 + 5, + (-total_height / 2) + title_dim["h"] + 5, + title_type_font, + f"{self.type_text}", + ) + + # Position the pins. Execution pins stay on the same row + if pin_dim: + # y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + 5 + y = bg_height - total_height / 2 - 10 + + # Do the execution pins + exe_shifted = False + for pin in self._pins: + if not pin.is_execution(): + continue + if not exe_shifted: + y += pin_dim["h"] + exe_shifted = True + if pin.is_output(): + pin.setPos(total_width / 2 - 10, y) + else: + pin.setPos(-total_width / 2 + 10, y) + + # Do the rest of the pins + for pin in self._pins: + if pin.is_execution(): + continue + y += pin_dim["h"] + + if pin.is_output(): + pin.setPos(total_width / 2 - 10, y) + else: + pin.setPos(-total_width / 2 + 10, y) + + self._width = total_width + self._height = total_height + + # move the widget to the bottom + self.widget.move(-self.widget.size().width() / 2, total_height / 2 - self.widget.size().height() + 5) From 7aca786f6cd00c344cb8a15040e83358f68cabe2 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 14:02:07 -0400 Subject: [PATCH 63/88] changing param of title --- Example_Project/Add_node.py | 2 +- Example_Project/Button_node.py | 4 ++-- Example_Project/Print_node.py | 2 +- Example_Project/Scaler_node.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py index e7189a3..e9c9252 100644 --- a/Example_Project/Add_node.py +++ b/Example_Project/Add_node.py @@ -5,7 +5,7 @@ class Add_Node(Node): def __init__(self): super().__init__() - self.title = "Add" + self.title_text = "Add" self.type_text = "Logic Nodes" self.set_color(title_color=(0, 128, 0)) diff --git a/Example_Project/Button_node.py b/Example_Project/Button_node.py index a9345f4..af1ed55 100644 --- a/Example_Project/Button_node.py +++ b/Example_Project/Button_node.py @@ -7,12 +7,11 @@ class Button_Node(Node): def __init__(self): super().__init__() - self.title = "Button" + self.title_text = "Button" self.type_text = "Inputs" self.set_color(title_color=(128, 0, 0)) self.add_pin(name="Ex Out", is_output=True, execution=True) - # self.add_pin(name="value", is_output=True) self.build() @@ -34,3 +33,4 @@ def init_widget(self): def btn_cmd(self): print("btn command") + self.execute() diff --git a/Example_Project/Print_node.py b/Example_Project/Print_node.py index ffb722a..e5a3c33 100644 --- a/Example_Project/Print_node.py +++ b/Example_Project/Print_node.py @@ -5,7 +5,7 @@ class Print_Node(Node): def __init__(self): super().__init__() - self.title = "Print" + self.title_text = "Print" self.type_text = "Debug Nodes" self.set_color(title_color=(160, 32, 240)) diff --git a/Example_Project/Scaler_node.py b/Example_Project/Scaler_node.py index fd79edc..59377be 100644 --- a/Example_Project/Scaler_node.py +++ b/Example_Project/Scaler_node.py @@ -8,7 +8,7 @@ class Scaler_Node(Node): def __init__(self): super().__init__() - self.title = "Scaler" + self.title_text = "Scaler" self.type_text = "Constants" self.set_color(title_color=(255, 165, 0)) From 0df372998eb67834264453b5030ca49cb6142afe Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 14:44:14 -0400 Subject: [PATCH 64/88] readme update --- README.md | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 31528a0..3cac90c 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,30 @@ # Python Node Editor -The Node-Based Python Tool is a software tool that provides a new way to organize reusable Python code. This tool is implemented in custom node classes that can be easily connected to one another to form a dynamic network. +This is a node based Python tool used for visual scripting that is designed to be used for composing high level Python code into reusable blocks. Nodes look and function similar to Unreal Engine blueprints. Each node consists of connection pins and a widget section enabling the developer to write a full custom PySide GUI for each node type. -The tool is designed to allow you to write Python code in individual files per class/node. This means that your code is self-contained, easily modifiable, and reusable across multiple projects. Additionally, the GUI for the Node-Based Python Tool is designed to be familiar to those who have used Unreal Engine's blueprinting system, making it easy to learn and use. +The tool is designed to allow you to write Python code in individual files per class/node. This means that your code is self-contained, easily modifiable, and reusable across multiple projects. Additionally, the GUI is designed to be familiar to those who have used Unreal Engine's blueprinting system, making it easy to learn and use. My goal with this project is to provide a new and innovative way of organizing and working with Python code. While the tool is still in the development phase, I am constantly working to improve its functionality and features. -I hope that you find the Node-Based Python Tool to be a valuable addition to your toolkit, and I welcome any feedback or suggestions you may have as I continue to improve and expand its capabilities. Thank you for your interest in my project! +Visual scripting using nodes does have some benefits and drawbacks and it’s up to the end developer to decide when such a system is beneficial or not. -For minimal GUI code for creating a node network see [GUI-nodes-only](https://github.com/bhowiebkr/simple-node-editor/tree/GUI-nodes-only) branch. +![nodes](https://github.com/bhowiebkr/simple-node-editor/blob/master/images/node_editor2.jpg) -Converting the original code base over to this more fully fledged out node editor, there will be loads of code smells. I’ll hold off on doing a refactor until the core components are fully functional. +Use it for: +- high level composing/configurable code. If a given system consists of many similar components but have a unique set of steps or requirements on similar tasks. Example a VFX or game pipeline. +- readability for non programmers as a dependency graph with built-in functionality +- enabling non-programmers a simple system to assemble blocks of logic +- networks that require a high level of feedback throughout that network and not just the end result. Example shader building, sound synthesizing, machine learning, robotics and sensors. Each node can have a custom visual feedback such as images, graphs, sound timelines, spreadsheets etc. +- prototyping logic. +- Generator scripts. Taking an input or building up a result that gets saved for other uses. Example textures, images, sound, ML training data. + +Don’t use it for +- Anything complex. 40 nodes or less. This is because the user not only needs to think of how nodes are logically connected, but also the visual composure of nodes in the graph. It’s always best to refactor code when a graph gets too complex to make sense of. +- code that needs to run fast. The overhead of node based tools will increase processing in almost all cases. +- Code that doesn’t need a GUI/human interface to use. + +For minimal GUI code for creating a node network see [GUI-nodes-only](https://github.com/bhowiebkr/simple-node-editor/tree/GUI-nodes-only) branch. -![nodes](https://github.com/bhowiebkr/simple-node-editor/blob/master/images/node_editor2.jpg) [![Video](http://img.youtube.com/vi/DOsFJ8lm9dU/0.jpg)](http://www.youtube.com/watch?v=DOsFJ8lm9dU) From e30d57f10a9e6202fbc61668fac756faa313bbba Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 16:40:05 -0400 Subject: [PATCH 65/88] moving files around --- node_editor/{gui => }/common.py | 0 node_editor/{gui => }/node.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename node_editor/{gui => }/common.py (100%) rename node_editor/{gui => }/node.py (100%) diff --git a/node_editor/gui/common.py b/node_editor/common.py similarity index 100% rename from node_editor/gui/common.py rename to node_editor/common.py diff --git a/node_editor/gui/node.py b/node_editor/node.py similarity index 100% rename from node_editor/gui/node.py rename to node_editor/node.py From 3f184d1fd6967e53b4b1b2a171e317ab300a0fd2 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sat, 8 Apr 2023 16:46:17 -0400 Subject: [PATCH 66/88] refactoring --- Example_Project/Add_node.py | 2 +- Example_Project/Button_node.py | 2 +- Example_Project/Print_node.py | 2 +- Example_Project/Scaler_node.py | 2 +- node_editor/compute_engine.py | 0 node_editor/gui/node_editor.py | 2 +- node_editor/gui/node_graphics_item.py | 2 +- node_editor/gui/node_list.py | 2 ++ node_editor/gui/node_widget.py | 4 ++-- node_editor/gui/view.py | 2 +- node_editor/node.py | 7 +++++-- 11 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 node_editor/compute_engine.py diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py index e9c9252..d6f12e4 100644 --- a/Example_Project/Add_node.py +++ b/Example_Project/Add_node.py @@ -1,4 +1,4 @@ -from node_editor.gui.node import Node +from node_editor.node import Node class Add_Node(Node): diff --git a/Example_Project/Button_node.py b/Example_Project/Button_node.py index af1ed55..68fbdb0 100644 --- a/Example_Project/Button_node.py +++ b/Example_Project/Button_node.py @@ -1,6 +1,6 @@ from PySide6 import QtWidgets -from node_editor.gui.node import Node +from node_editor.node import Node class Button_Node(Node): diff --git a/Example_Project/Print_node.py b/Example_Project/Print_node.py index e5a3c33..51ea384 100644 --- a/Example_Project/Print_node.py +++ b/Example_Project/Print_node.py @@ -1,4 +1,4 @@ -from node_editor.gui.node import Node +from node_editor.node import Node class Print_Node(Node): diff --git a/Example_Project/Scaler_node.py b/Example_Project/Scaler_node.py index 59377be..21c6e97 100644 --- a/Example_Project/Scaler_node.py +++ b/Example_Project/Scaler_node.py @@ -1,6 +1,6 @@ from PySide6 import QtWidgets -from node_editor.gui.node import Node +from node_editor.node import Node from Example_Project.common_widgets import FloatLineEdit diff --git a/node_editor/compute_engine.py b/node_editor/compute_engine.py new file mode 100644 index 0000000..e69de29 diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index 1c30935..9cc71f1 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -3,7 +3,7 @@ from PySide6 import QtCore, QtWidgets from node_editor.gui.connection import Connection -from node_editor.gui.node import Node +from node_editor.node import Node from node_editor.gui.port import Pin diff --git a/node_editor/gui/node_graphics_item.py b/node_editor/gui/node_graphics_item.py index 6b17261..3d40bbc 100644 --- a/node_editor/gui/node_graphics_item.py +++ b/node_editor/gui/node_graphics_item.py @@ -1,7 +1,7 @@ from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Qt -from node_editor.gui.common import Node_Status +from node_editor.common import Node_Status class Node_Graphics_Item(QtWidgets.QGraphicsItem): diff --git a/node_editor/gui/node_list.py b/node_editor/gui/node_list.py index e89bad8..34ee9a6 100644 --- a/node_editor/gui/node_list.py +++ b/node_editor/gui/node_list.py @@ -13,6 +13,8 @@ def update_project(self, imports): # make an item for each custom class for name, data in imports.items(): + name = name.replace("_Node", "") + item = QtWidgets.QListWidgetItem(name) item.module = data["module"] item.class_name = data["class"] diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index bf6f23b..bf82492 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -4,12 +4,12 @@ from PySide6 import QtGui, QtWidgets -from node_editor.gui.node import Node +from node_editor.node import Node from node_editor.gui.node_editor import NodeEditor from node_editor.gui.view import View from node_editor.gui.connection import Connection -from node_editor.gui.node import Node +from node_editor.node import Node from node_editor.gui.port import Pin diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index 03de4ec..b9b7fba 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -1,6 +1,6 @@ from PySide6 import QtCore, QtGui, QtOpenGLWidgets, QtWidgets -from node_editor.gui.node import Node +from node_editor.node import Node class View(QtWidgets.QGraphicsView): diff --git a/node_editor/node.py b/node_editor/node.py index 8e892df..baa2d8e 100644 --- a/node_editor/node.py +++ b/node_editor/node.py @@ -3,7 +3,7 @@ from node_editor.gui.port import Pin from node_editor.gui.node_graphics_item import Node_Graphics_Item -from node_editor.gui.common import Node_Status +from node_editor.common import Node_Status class Node(Node_Graphics_Item): @@ -14,12 +14,15 @@ def __init__(self): def init_widget(self): pass + def compute(self): + raise NotImplementedError("compute is not implemented") + def execute(self): # Get the values from the input pins self.execute_inputs() # Compute the value - pass + self.compute() # execute nodes connected to output self.execute_outputs() From d8f94f213c1d98fafd9770d73de75af82f9dfc3f Mon Sep 17 00:00:00 2001 From: Bryan Date: Sun, 9 Apr 2023 02:03:20 -0400 Subject: [PATCH 67/88] refactoring --- node_editor/connection.py | 57 +++++++++++++++ .../{connection.py => connection_graphics.py} | 72 ++----------------- node_editor/gui/node_editor.py | 6 +- ...node_graphics_item.py => node_graphics.py} | 2 +- node_editor/gui/node_widget.py | 6 +- node_editor/gui/port.py | 12 +--- node_editor/node.py | 4 +- 7 files changed, 72 insertions(+), 87 deletions(-) create mode 100644 node_editor/connection.py rename node_editor/gui/{connection.py => connection_graphics.py} (59%) rename node_editor/gui/{node_graphics_item.py => node_graphics.py} (99%) diff --git a/node_editor/connection.py b/node_editor/connection.py new file mode 100644 index 0000000..81d6005 --- /dev/null +++ b/node_editor/connection.py @@ -0,0 +1,57 @@ +from node_editor.gui.connection_graphics import Connection_Graphics + + +class Connection(Connection_Graphics): + def __init__(self, parent): + super().__init__(parent) + + self.start_pin = None + self.end_pin = None + + def delete(self): + """ + Deletes the connection and removes it from the scene and any connected pins. + """ + for pin in (self.start_pin, self.end_pin): + if pin: + pin.connection = None + pin = None + + self.scene().removeItem(self) + + def set_start_pin(self, pin): + self.start_pin = pin + self.start_pin.connection = self + + def set_end_pin(self, pin): + self.end_pin = pin + self.end_pin.connection = self + + def nodes(self): + """ + Returns a tuple of the two connected nodes. + + Returns: + tuple: A tuple of the two Node objects connected by this Connection. + """ + return (self.start_pin.node(), self.end_pin.node()) + + def update_start_and_end_pos(self): + """ + Update the start and end positions of the Connection. + + Get the start and end pins and use them to set the start and end positions. + """ + + if self.start_pin and not self.start_pin.is_output(): + temp = self.end_pin + self.end_pin = self.start_pin + self.start_pin = temp + + if self.start_pin: + self.start_pos = self.start_pin.scenePos() + + if self.end_pin: + self.end_pos = self.end_pin.scenePos() + + self.update_path() diff --git a/node_editor/gui/connection.py b/node_editor/gui/connection_graphics.py similarity index 59% rename from node_editor/gui/connection.py rename to node_editor/gui/connection_graphics.py index 9540e15..df47fc7 100644 --- a/node_editor/gui/connection.py +++ b/node_editor/gui/connection_graphics.py @@ -1,7 +1,7 @@ from PySide6 import QtCore, QtGui, QtWidgets -class Connection(QtWidgets.QGraphicsPathItem): +class Connection_Graphics(QtWidgets.QGraphicsPathItem): """ A Connection represents a graphical connection between two NodePorts in a PySide6 application. @@ -35,75 +35,13 @@ def __init__(self, parent): self.setBrush(QtCore.Qt.NoBrush) self.setZValue(-1) - self._start_pin = None - self._end_pin = None - self.start_pos = QtCore.QPointF() self.end_pos = QtCore.QPointF() + self.start_pin = None + self.end_pin = None self._do_highlight = False - def delete(self): - """ - Deletes the connection and removes it from the scene and any connected pins. - """ - for pin in (self._start_pin, self._end_pin): - if pin: - # pin.remove_connection(self) - pin.connection = None - pin = None - - self.scene().removeItem(self) - - @property - def start_pin(self): - return self._start_pin - - @property - def end_pin(self): - return self._end_pin - - @start_pin.setter - def start_pin(self, pin): - self._start_pin = pin - self._start_pin.connection = self - - @end_pin.setter - def end_pin(self, pin): - self._end_pin = pin - self._end_pin.connection = self - - def nodes(self): - """ - Returns a tuple of the two connected nodes. - - Returns: - tuple: A tuple of the two Node objects connected by this Connection. - """ - return (self._start_pin.node(), self._end_pin.node()) - - def update_start_and_end_pos(self): - """ - Update the start and end positions of the Connection. - - Get the start and end pins and use them to set the start and end positions. - """ - - if self.start_pin and not self.start_pin.is_output(): - # print("flipping connection") - temp = self.end_pin - self._end_pin = self.start_pin - self._start_pin = temp - - if self._start_pin: - self.start_pos = self._start_pin.scenePos() - - # if we are pulling off an exiting connection we skip code below - if self._end_pin: - self.end_pos = self._end_pin.scenePos() - - self.update_path() - def update_path(self): """ Draws a smooth cubic curve from the start to end pins. @@ -132,8 +70,8 @@ def paint(self, painter, option=None, widget=None): thickness = 0 color = QtGui.QColor(0, 128, 255) - if self._start_pin: - if self._start_pin.is_execution(): + if self.start_pin: + if self.start_pin.is_execution(): thickness = 3 color = QtGui.QColor(255, 255, 255) diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index 9cc71f1..fa632a3 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -2,7 +2,7 @@ from PySide6 import QtCore, QtWidgets -from node_editor.gui.connection import Connection +from node_editor.connection import Connection from node_editor.node import Node from node_editor.gui.port import Pin @@ -141,8 +141,8 @@ def eventFilter(self, watched, event): self.port.clear_connection() item.clear_connection() - self.connection.start_pin = self.port - self.connection.end_pin = item + self.connection.set_start_pin(self.port) + self.connection.set_end_pin(item) self.connection.update_start_and_end_pos() else: # print("Deleting connection") diff --git a/node_editor/gui/node_graphics_item.py b/node_editor/gui/node_graphics.py similarity index 99% rename from node_editor/gui/node_graphics_item.py rename to node_editor/gui/node_graphics.py index 3d40bbc..103ad91 100644 --- a/node_editor/gui/node_graphics_item.py +++ b/node_editor/gui/node_graphics.py @@ -4,7 +4,7 @@ from node_editor.common import Node_Status -class Node_Graphics_Item(QtWidgets.QGraphicsItem): +class Node_Graphics(QtWidgets.QGraphicsItem): def __init__(self): super().__init__() diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index bf82492..eedb8ce 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -8,7 +8,7 @@ from node_editor.gui.node_editor import NodeEditor from node_editor.gui.view import View -from node_editor.gui.connection import Connection +from node_editor.connection import Connection from node_editor.node import Node from node_editor.gui.port import Pin @@ -97,8 +97,8 @@ def load_scene(self, json_path, imports): start_pin = self.node_lookup[c["start_id"]].get_pin(c["start_pin"]) end_pin = self.node_lookup[c["end_id"]].get_pin(c["end_pin"]) - connection.start_pin = start_pin - connection.end_pin = end_pin + connection.set_start_pin(start_pin) + connection.set_end_pin(end_pin) connection.update_start_and_end_pos() def save_project(self, json_path): diff --git a/node_editor/gui/port.py b/node_editor/gui/port.py index d84a808..fd03359 100644 --- a/node_editor/gui/port.py +++ b/node_editor/gui/port.py @@ -40,17 +40,7 @@ def __init__(self, parent, scene): self.execution = False path = QtGui.QPainterPath() - # if self.execution: - # points = [] - # points.append(QtCore.QPointF(-6, -7)) - # points.append(QtCore.QPointF(-6, 7)) - # points.append(QtCore.QPointF(-2, 7)) - # points.append(QtCore.QPointF(6, 0)) - # points.append(QtCore.QPointF(-2, -7)) - # points.append(QtCore.QPointF(-6, -7)) - - # path.addPolygon(QtGui.QPolygonF(points)) - # else: + path.addEllipse(-self.radius_, -self.radius_, 2 * self.radius_, 2 * self.radius_) self.setPath(path) diff --git a/node_editor/node.py b/node_editor/node.py index baa2d8e..39e2ef9 100644 --- a/node_editor/node.py +++ b/node_editor/node.py @@ -2,11 +2,11 @@ from PySide6.QtCore import Qt from node_editor.gui.port import Pin -from node_editor.gui.node_graphics_item import Node_Graphics_Item +from node_editor.gui.node_graphics import Node_Graphics from node_editor.common import Node_Status -class Node(Node_Graphics_Item): +class Node(Node_Graphics): def __init__(self): super().__init__() From fc9b015dd3c4ab19e216b03af71a1056d2d5ad41 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sun, 9 Apr 2023 02:03:48 -0400 Subject: [PATCH 68/88] compute engine for getting the pin data between nodes --- node_editor/compute_engine.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/node_editor/compute_engine.py b/node_editor/compute_engine.py index e69de29..609a982 100644 --- a/node_editor/compute_engine.py +++ b/node_editor/compute_engine.py @@ -0,0 +1,31 @@ +# Compute the value of the pin based on the current state of the graph +def get_pin_data(pin): + pass + + # if pin isn't connected, return it current data + + # get the evalutation order of the owning node of the pin + + # loop over each node and process it + + # retur the pin's data + + +# Get a list of nodes in the order to be computed. Forward evaluation by default. +def get_node_compute_order(node, forward=False): + # Create a set to keep track of visited nodes + visited = set() + # Create a stack to keep track of nodes to visit + stack = [node] + # Create a list to store the evaluation order + order = [] + + +# Get the next nodes that this node is dependent on +def get_next_input_node(node): + pass + + +# Get the next nodes that is affected by the input node. +def get_next_output_node(node): + pass From 9cfff659e6a7cbbad756b439673bdec3bedcd8ee Mon Sep 17 00:00:00 2001 From: Bryan Date: Sun, 9 Apr 2023 02:11:59 -0400 Subject: [PATCH 69/88] rename --- node_editor/gui/{port.py => port_graphics.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename node_editor/gui/{port.py => port_graphics.py} (100%) diff --git a/node_editor/gui/port.py b/node_editor/gui/port_graphics.py similarity index 100% rename from node_editor/gui/port.py rename to node_editor/gui/port_graphics.py From 9bc19e85f362195b37ba73a8bd538f085e759a25 Mon Sep 17 00:00:00 2001 From: Bryan Date: Sun, 9 Apr 2023 02:16:06 -0400 Subject: [PATCH 70/88] rename --- node_editor/gui/{port_graphics.py => pin_graphics.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename node_editor/gui/{port_graphics.py => pin_graphics.py} (100%) diff --git a/node_editor/gui/port_graphics.py b/node_editor/gui/pin_graphics.py similarity index 100% rename from node_editor/gui/port_graphics.py rename to node_editor/gui/pin_graphics.py From d72b36771101dce0582d2611f816a42cc392a23e Mon Sep 17 00:00:00 2001 From: Bryan Date: Sun, 9 Apr 2023 02:43:13 -0400 Subject: [PATCH 71/88] refactor --- node_editor/connection.py | 2 +- node_editor/gui/connection_graphics.py | 2 +- node_editor/gui/node_editor.py | 2 +- node_editor/gui/node_graphics.py | 12 +++--- node_editor/gui/node_widget.py | 13 ++++--- node_editor/gui/pin_graphics.py | 53 ++++++-------------------- node_editor/node.py | 8 ++-- node_editor/pin.py | 33 ++++++++++++++++ 8 files changed, 66 insertions(+), 59 deletions(-) create mode 100644 node_editor/pin.py diff --git a/node_editor/connection.py b/node_editor/connection.py index 81d6005..e107580 100644 --- a/node_editor/connection.py +++ b/node_editor/connection.py @@ -43,7 +43,7 @@ def update_start_and_end_pos(self): Get the start and end pins and use them to set the start and end positions. """ - if self.start_pin and not self.start_pin.is_output(): + if self.start_pin and not self.start_pin.is_output: temp = self.end_pin self.end_pin = self.start_pin self.start_pin = temp diff --git a/node_editor/gui/connection_graphics.py b/node_editor/gui/connection_graphics.py index df47fc7..1766eaa 100644 --- a/node_editor/gui/connection_graphics.py +++ b/node_editor/gui/connection_graphics.py @@ -71,7 +71,7 @@ def paint(self, painter, option=None, widget=None): thickness = 0 color = QtGui.QColor(0, 128, 255) if self.start_pin: - if self.start_pin.is_execution(): + if self.start_pin.execution: thickness = 3 color = QtGui.QColor(255, 255, 255) diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index fa632a3..b3c17a7 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -4,7 +4,7 @@ from node_editor.connection import Connection from node_editor.node import Node -from node_editor.gui.port import Pin +from node_editor.pin import Pin class NodeEditor(QtCore.QObject): diff --git a/node_editor/gui/node_graphics.py b/node_editor/gui/node_graphics.py index 103ad91..f611bf7 100644 --- a/node_editor/gui/node_graphics.py +++ b/node_editor/gui/node_graphics.py @@ -145,14 +145,14 @@ def build(self): exec_height_added = False for pin in self._pins: pin_dim = { - "w": QtGui.QFontMetrics(pin_font).horizontalAdvance(pin.name()), + "w": QtGui.QFontMetrics(pin_font).horizontalAdvance(pin.name), "h": QtGui.QFontMetrics(pin_font).height(), } if pin_dim["w"] > total_width: total_width = pin_dim["w"] - if pin.is_execution() and not exec_height_added or not pin.is_execution(): + if pin.execution and not exec_height_added or not pin.execution: total_height += pin_dim["h"] exec_height_added = True @@ -202,23 +202,23 @@ def build(self): # Do the execution pins exe_shifted = False for pin in self._pins: - if not pin.is_execution(): + if not pin.execution: continue if not exe_shifted: y += pin_dim["h"] exe_shifted = True - if pin.is_output(): + if pin.is_output: pin.setPos(total_width / 2 - 10, y) else: pin.setPos(-total_width / 2 + 10, y) # Do the rest of the pins for pin in self._pins: - if pin.is_execution(): + if pin.execution: continue y += pin_dim["h"] - if pin.is_output(): + if pin.is_output: pin.setPos(total_width / 2 - 10, y) else: pin.setPos(-total_width / 2 + 10, y) diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index eedb8ce..f9f0222 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -10,7 +10,7 @@ from node_editor.connection import Connection from node_editor.node import Node -from node_editor.gui.port import Pin +from node_editor.pin import Pin class NodeScene(QtWidgets.QGraphicsScene): @@ -97,13 +97,16 @@ def load_scene(self, json_path, imports): start_pin = self.node_lookup[c["start_id"]].get_pin(c["start_pin"]) end_pin = self.node_lookup[c["end_id"]].get_pin(c["end_pin"]) - connection.set_start_pin(start_pin) - connection.set_end_pin(end_pin) + print("start_pin", start_pin) + + if start_pin: + connection.set_start_pin(start_pin) + + if end_pin: + connection.set_end_pin(end_pin) connection.update_start_and_end_pos() def save_project(self, json_path): - # print(f"json path: {json_path}") - from collections import OrderedDict # TODO possibly an ordered dict so things stay in order (better for git changes, and manual editing) diff --git a/node_editor/gui/pin_graphics.py b/node_editor/gui/pin_graphics.py index fd03359..2e39dac 100644 --- a/node_editor/gui/pin_graphics.py +++ b/node_editor/gui/pin_graphics.py @@ -1,7 +1,7 @@ from PySide6 import QtCore, QtGui, QtWidgets -class Pin(QtWidgets.QGraphicsPathItem): +class Pin_Graphics(QtWidgets.QGraphicsPathItem): """A graphics item representing an input or output pin for a node in a node-based graphical user interface. Attributes: @@ -51,21 +51,12 @@ def __init__(self, parent, scene): self.pin_text_height = self.font_metrics.height() - self._is_output = False - self._name = None + self.is_output = False self.margin = 2 - self.m_node = None - self.connection = None - self.text_path = QtGui.QPainterPath() - def is_execution(self): - return self.execution - def set_execution(self, execution): - self.execution = execution - if execution: path = QtGui.QPainterPath() @@ -79,15 +70,11 @@ def set_execution(self, execution): path.addPolygon(QtGui.QPolygonF(points)) self.setPath(path) - def set_is_output(self, is_output): - self._is_output = is_output - def set_name(self, name): - self._name = name - nice_name = self._name.replace("_", " ").title() + nice_name = self.name.replace("_", " ").title() self.pin_text_width = self.font_metrics.horizontalAdvance(nice_name) - if self._is_output: + if self.is_output: x = -self.radius_ - self.margin - self.pin_text_width else: x = self.radius_ + self.margin @@ -96,17 +83,17 @@ def set_name(self, name): self.text_path.addText(x, y, self.font, nice_name) - def set_node(self, node): - self.m_node = node + # def set_node(self, node): + # self.m_node = node - def name(self): - return self._name + # def name(self): + # return self._name - def is_output(self): - return self._is_output + # def is_output(self): + # return self._is_output - def node(self): - return self.m_node + # def node(self): + # return self.m_node def paint(self, painter, option=None, widget=None): if self.execution: @@ -132,22 +119,6 @@ def paint(self, painter, option=None, widget=None): painter.setBrush(QtCore.Qt.white) painter.drawPath(self.text_path) - def clear_connection(self): - if self.connection: - self.connection.delete() - - def can_connect_to(self, pin): - # print(pin.node(), self.node()) - if not pin: - return False - if pin.node() == self.node(): - return False - - return self._is_output != pin._is_output - - def is_connected(self): - return bool(self.connection) - def itemChange(self, change, value): if change == QtWidgets.QGraphicsItem.ItemScenePositionHasChanged and self.connection: self.connection.update_start_and_end_pos() diff --git a/node_editor/node.py b/node_editor/node.py index 39e2ef9..c5b55d6 100644 --- a/node_editor/node.py +++ b/node_editor/node.py @@ -1,7 +1,7 @@ from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Qt -from node_editor.gui.port import Pin +from node_editor.pin import Pin from node_editor.gui.node_graphics import Node_Graphics from node_editor.common import Node_Status @@ -53,7 +53,7 @@ def delete(self): def get_pin(self, name): for pin in self._pins: - if pin.name() == name: + if pin.name == name: return pin def add_pin(self, name, is_output=False, execution=False): @@ -71,9 +71,9 @@ def add_pin(self, name, is_output=False, execution=False): """ pin = Pin(self, self.scene()) - pin.set_is_output(is_output) + pin.is_output = is_output pin.set_name(name) - pin.set_node(node=self) + pin.node = self pin.set_execution(execution) self._pins.append(pin) diff --git a/node_editor/pin.py b/node_editor/pin.py new file mode 100644 index 0000000..5b8d833 --- /dev/null +++ b/node_editor/pin.py @@ -0,0 +1,33 @@ +from node_editor.gui.pin_graphics import Pin_Graphics + + +class Pin(Pin_Graphics): + def __init__(self, parent, scene): + super().__init__(parent, scene) + + self.name = None + self.node = None + self.connection = None + + def set_execution(self, execution): + self.execution = execution + super().set_execution(execution) + + def set_name(self, name): + self.name = name + super().set_name(name) + + def clear_connection(self): + if self.connection: + self.connection.delete() + + def can_connect_to(self, pin): + if not pin: + return False + if pin.node == self.node: + return False + + return self.is_output != pin.is_output + + def is_connected(self): + return bool(self.connection) From 45450c5d978dfe43dd2391af766e5fcb01efe37b Mon Sep 17 00:00:00 2001 From: Bryan Date: Sun, 9 Apr 2023 02:47:56 -0400 Subject: [PATCH 72/88] moving compute to pin --- node_editor/compute_engine.py | 31 ------------------------------- node_editor/pin.py | 26 ++++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 31 deletions(-) delete mode 100644 node_editor/compute_engine.py diff --git a/node_editor/compute_engine.py b/node_editor/compute_engine.py deleted file mode 100644 index 609a982..0000000 --- a/node_editor/compute_engine.py +++ /dev/null @@ -1,31 +0,0 @@ -# Compute the value of the pin based on the current state of the graph -def get_pin_data(pin): - pass - - # if pin isn't connected, return it current data - - # get the evalutation order of the owning node of the pin - - # loop over each node and process it - - # retur the pin's data - - -# Get a list of nodes in the order to be computed. Forward evaluation by default. -def get_node_compute_order(node, forward=False): - # Create a set to keep track of visited nodes - visited = set() - # Create a stack to keep track of nodes to visit - stack = [node] - # Create a list to store the evaluation order - order = [] - - -# Get the next nodes that this node is dependent on -def get_next_input_node(node): - pass - - -# Get the next nodes that is affected by the input node. -def get_next_output_node(node): - pass diff --git a/node_editor/pin.py b/node_editor/pin.py index 5b8d833..3e6eb3d 100644 --- a/node_editor/pin.py +++ b/node_editor/pin.py @@ -31,3 +31,29 @@ def can_connect_to(self, pin): def is_connected(self): return bool(self.connection) + + def get_data(self): + # Get a list of nodes in the order to be computed. Forward evaluation by default. + def get_node_compute_order(node, forward=False): + # Create a set to keep track of visited nodes + visited = set() + # Create a stack to keep track of nodes to visit + stack = [node] + # Create a list to store the evaluation order + order = [] + + # Get the next nodes that this node is dependent on + def get_next_input_node(node): + pass + + # Get the next nodes that is affected by the input node. + def get_next_output_node(node): + pass + + # if pin isn't connected, return it current data + + # get the evalutation order of the owning node of the pin + + # loop over each node and process it + + # return the pin's data From 4155d9b814dfd4f63d5176852b2f69c4bac7fd8f Mon Sep 17 00:00:00 2001 From: Bryan Date: Sun, 9 Apr 2023 02:52:01 -0400 Subject: [PATCH 73/88] cleanup --- node_editor/gui/pin_graphics.py | 41 --------------------------------- 1 file changed, 41 deletions(-) diff --git a/node_editor/gui/pin_graphics.py b/node_editor/gui/pin_graphics.py index 2e39dac..f935958 100644 --- a/node_editor/gui/pin_graphics.py +++ b/node_editor/gui/pin_graphics.py @@ -2,35 +2,6 @@ class Pin_Graphics(QtWidgets.QGraphicsPathItem): - """A graphics item representing an input or output pin for a node in a node-based graphical user interface. - - Attributes: - radius_ (int): The radius of the pin circle. - margin (int): The margin between the pin circle and the pin name text. - pin_text_height (int): The height of the pin name text. - pin_text_width (int): The width of the pin name text. - _is_output (bool): True if the pin is an output pin, False if it is an input pin. - _name (str): The name of the pin. - m_node (Node): The node to which the pin belongs. - connection (Connection): The connection attached to the pin, if any. - text_path (QPainterPath): The path used to draw the pin name text. - - Methods: - set_is_output(is_output: bool) -> None: Set the output status of the pin. - set_name(name: str) -> None: Set the name of the pin. - set_node(node: Node) -> None: Set the node to which the pin belongs. - set_pin_flags(flags: int) -> None: Set the pin flags. - set_ptr(ptr: Any) -> None: Set the pointer to the pin. - name() -> str: Get the name of the pin. - is_output() -> bool: Check if the pin is an output pin. - node() -> Node: Get the node to which the pin belongs. - paint(painter: QtGui.QPainter, option: QtWidgets.QStyleOptionGraphicsItem, widget: Optional[QtWidgets.QWidget]) -> None: Paint the pin. - clear_connection() -> None: Clear the connection attached to the pin. - can_connect_to(pin: Pin) -> bool: Check if the pin can be connected to another pin. - is_connected() -> bool: Check if the pin is connected to another pin. - itemChange(change: QtWidgets.QGraphicsItem.GraphicsItemChange, value: Any) -> Any: Handle item change events. - """ - def __init__(self, parent, scene): super().__init__(parent) @@ -83,18 +54,6 @@ def set_name(self, name): self.text_path.addText(x, y, self.font, nice_name) - # def set_node(self, node): - # self.m_node = node - - # def name(self): - # return self._name - - # def is_output(self): - # return self._is_output - - # def node(self): - # return self.m_node - def paint(self, painter, option=None, widget=None): if self.execution: painter.setPen(QtCore.Qt.white) From 7abdf5ab7f5c67218b3a0ca16d7154ff194031cc Mon Sep 17 00:00:00 2001 From: Bryan Date: Mon, 23 Sep 2024 11:30:20 -0700 Subject: [PATCH 74/88] adding pre-commit with static type checking --- .gitignore | 2 +- .pre-commit-config.yaml | 40 ++++++++++ Example_Project/Add_node.py | 22 +++++- Example_Project/Print_node.py | 22 +++++- Example_Project/Scaler_node.py | 4 +- Example_Project/__init__.py | 0 Example_Project/common_widgets.py | 27 ++++--- Example_Project/test.json | 2 +- README.md | 5 +- launch.bat | 7 ++ main.py | 61 ++++++++------- mypy.ini | 4 + node_editor/__init__.py | 0 node_editor/common.py | 2 + node_editor/connection.py | 79 ++++++++++--------- node_editor/gui/connection_graphics.py | 50 +++++++++--- node_editor/gui/node_editor.py | 35 ++++++--- node_editor/gui/node_graphics.py | 41 ++++++---- node_editor/gui/node_list.py | 47 ++++++++--- node_editor/gui/node_widget.py | 44 ++++++----- node_editor/gui/pin_graphics.py | 104 +++++++++++++++---------- node_editor/gui/view.py | 88 +++++++++++---------- node_editor/node.py | 46 ++++++----- node_editor/pin.py | 49 +++++++----- pre-commit_check.bat | 0 requirements-dev.txt | 5 ++ 26 files changed, 509 insertions(+), 277 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 Example_Project/__init__.py create mode 100644 launch.bat create mode 100644 mypy.ini create mode 100644 node_editor/__init__.py create mode 100644 pre-commit_check.bat create mode 100644 requirements-dev.txt diff --git a/.gitignore b/.gitignore index 6a962e5..1b9bd8d 100644 --- a/.gitignore +++ b/.gitignore @@ -106,4 +106,4 @@ venv.bak/ temp #vscode settings -settings.json \ No newline at end of file +settings.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..9e6f6c3 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,40 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 # Use the ref you want to point at + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + +- repo: https://github.com/psf/black + rev: 24.8.0 + hooks: + - id: black + args: [--line-length=120] + +- repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.11.2 + hooks: + - id: mypy + args: [--strict, --ignore-missing-imports] + +- repo: https://github.com/pycqa/flake8 + rev: 7.1.1 + hooks: + - id: flake8 + additional_dependencies: [flake8-typing-imports==1.12.0] + args: [--max-line-length=120] + +- repo: https://github.com/asottile/reorder_python_imports + rev: v3.13.0 + hooks: + - id: reorder-python-imports + args: [--py37-plus, --add-import, 'from __future__ import annotations'] + +- repo: https://github.com/asottile/setup-cfg-fmt + rev: v2.5.0 + hooks: + - id: setup-cfg-fmt diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py index d6f12e4..abb1bf1 100644 --- a/Example_Project/Add_node.py +++ b/Example_Project/Add_node.py @@ -1,12 +1,16 @@ +from __future__ import annotations + +from typing import Tuple + from node_editor.node import Node class Add_Node(Node): - def __init__(self): + def __init__(self) -> None: super().__init__() - self.title_text = "Add" - self.type_text = "Logic Nodes" + self.title_text: str = "Add" + self.type_text: str = "Logic Nodes" self.set_color(title_color=(0, 128, 0)) self.add_pin(name="Ex In", is_output=False, execution=True) @@ -16,3 +20,15 @@ def __init__(self): self.add_pin(name="input B", is_output=False) self.add_pin(name="output", is_output=True) self.build() + + def set_color(self, title_color: Tuple[int, int, int]) -> None: + # Assuming set_color is defined in the parent class + super().set_color(title_color=title_color) + + def add_pin(self, name: str, is_output: bool, execution: bool = False) -> None: + # Assuming add_pin is defined in the parent class + super().add_pin(name=name, is_output=is_output, execution=execution) + + def build(self) -> None: + # Assuming build is defined in the parent class + super().build() diff --git a/Example_Project/Print_node.py b/Example_Project/Print_node.py index 51ea384..b9b0332 100644 --- a/Example_Project/Print_node.py +++ b/Example_Project/Print_node.py @@ -1,15 +1,31 @@ +from __future__ import annotations + +from typing import Tuple + from node_editor.node import Node class Print_Node(Node): - def __init__(self): + def __init__(self) -> None: super().__init__() - self.title_text = "Print" - self.type_text = "Debug Nodes" + self.title_text: str = "Print" + self.type_text: str = "Debug Nodes" self.set_color(title_color=(160, 32, 240)) self.add_pin(name="Ex In", is_output=False, execution=True) self.add_pin(name="input", is_output=False) self.build() + + def set_color(self, title_color: Tuple[int, int, int]) -> None: + # Assuming set_color is defined in the parent class + super().set_color(title_color=title_color) + + def add_pin(self, name: str, is_output: bool, execution: bool = False) -> None: + # Assuming add_pin is defined in the parent class + super().add_pin(name=name, is_output=is_output, execution=execution) + + def build(self) -> None: + # Assuming build is defined in the parent class + super().build() diff --git a/Example_Project/Scaler_node.py b/Example_Project/Scaler_node.py index 21c6e97..2417e51 100644 --- a/Example_Project/Scaler_node.py +++ b/Example_Project/Scaler_node.py @@ -1,7 +1,9 @@ +from __future__ import annotations + from PySide6 import QtWidgets -from node_editor.node import Node from Example_Project.common_widgets import FloatLineEdit +from node_editor.node import Node class Scaler_Node(Node): diff --git a/Example_Project/__init__.py b/Example_Project/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Example_Project/common_widgets.py b/Example_Project/common_widgets.py index dcbc3f6..0eaede4 100644 --- a/Example_Project/common_widgets.py +++ b/Example_Project/common_widgets.py @@ -1,28 +1,35 @@ -from PySide6 import QtWidgets +from __future__ import annotations + +from typing import Optional +from typing import Tuple + from PySide6 import QtGui +from PySide6 import QtWidgets from PySide6.QtCore import Qt -class FloatLineEdit(QtWidgets.QLineEdit): - def __init__(self, parent=None): + +class FloatLineEdit(QtWidgets.QLineEdit): # type: ignore + def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: super().__init__(parent) self.setValidator(FloatValidator()) - def keyPressEvent(self, event): + def keyPressEvent(self, event: QtGui.QKeyEvent) -> None: if event.key() == Qt.Key_Space: event.ignore() else: super().keyPressEvent(event) -class FloatValidator(QtGui.QDoubleValidator): - def __init__(self, parent=None): + +class FloatValidator(QtGui.QDoubleValidator): # type: ignore + def __init__(self, parent: Optional[QtGui.QObject] = None) -> None: super().__init__(parent) - def validate(self, input_str, pos): + def validate(self, input_str: str, pos: int) -> Tuple[QtGui.QValidator.State, str, int]: state, num, pos = super().validate(input_str, pos) if state == QtGui.QValidator.Acceptable: return QtGui.QValidator.Acceptable, num, pos - if str(num).count('.') > 1: + if str(num).count(".") > 1: return QtGui.QValidator.Invalid, num, pos - if input_str[pos-1] == '.': + if input_str[pos - 1] == ".": return QtGui.QValidator.Acceptable, num, pos - return QtGui.QValidator.Invalid, num, pos \ No newline at end of file + return QtGui.QValidator.Invalid, num, pos diff --git a/Example_Project/test.json b/Example_Project/test.json index 70229c5..534fa91 100644 --- a/Example_Project/test.json +++ b/Example_Project/test.json @@ -63,4 +63,4 @@ "end_pin": "Ex In" } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index 3cac90c..9d849ab 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ The tool is designed to allow you to write Python code in individual files per c My goal with this project is to provide a new and innovative way of organizing and working with Python code. While the tool is still in the development phase, I am constantly working to improve its functionality and features. -Visual scripting using nodes does have some benefits and drawbacks and it’s up to the end developer to decide when such a system is beneficial or not. +Visual scripting using nodes does have some benefits and drawbacks and it’s up to the end developer to decide when such a system is beneficial or not. ![nodes](https://github.com/bhowiebkr/simple-node-editor/blob/master/images/node_editor2.jpg) @@ -16,7 +16,7 @@ Use it for: - enabling non-programmers a simple system to assemble blocks of logic - networks that require a high level of feedback throughout that network and not just the end result. Example shader building, sound synthesizing, machine learning, robotics and sensors. Each node can have a custom visual feedback such as images, graphs, sound timelines, spreadsheets etc. - prototyping logic. -- Generator scripts. Taking an input or building up a result that gets saved for other uses. Example textures, images, sound, ML training data. +- Generator scripts. Taking an input or building up a result that gets saved for other uses. Example textures, images, sound, ML training data. Don’t use it for - Anything complex. 40 nodes or less. This is because the user not only needs to think of how nodes are logically connected, but also the visual composure of nodes in the graph. It’s always best to refactor code when a graph gets too complex to make sense of. @@ -27,4 +27,3 @@ For minimal GUI code for creating a node network see [GUI-nodes-only](https://gi [![Video](http://img.youtube.com/vi/DOsFJ8lm9dU/0.jpg)](http://www.youtube.com/watch?v=DOsFJ8lm9dU) - diff --git a/launch.bat b/launch.bat new file mode 100644 index 0000000..d8ebe60 --- /dev/null +++ b/launch.bat @@ -0,0 +1,7 @@ +@echo off + +:: Activate the virtual environment +call venv\Scripts\activate + +:: Start the three Python programs in separate command windows +start cmd /k python .\main.py diff --git a/main.py b/main.py index 46cd890..dac12e3 100644 --- a/main.py +++ b/main.py @@ -9,13 +9,22 @@ Author: Bryan Howard Repo: https://github.com/bhowiebkr/simple-node-editor """ +from __future__ import annotations -import logging -from pathlib import Path import importlib import inspect +import logging +import sys +from pathlib import Path +from typing import Any +from typing import Dict +from typing import Optional -from PySide6 import QtCore, QtGui, QtWidgets +import qdarktheme +from PySide6 import QtCore +from PySide6 import QtGui +from PySide6 import QtWidgets +from PySide6.QtCore import QByteArray # Or from PySide2.QtCore import QByteArray from node_editor.gui.node_list import NodeList from node_editor.gui.node_widget import NodeWidget @@ -23,14 +32,16 @@ logging.basicConfig(level=logging.DEBUG) -class NodeEditor(QtWidgets.QMainWindow): +class NodeEditor(QtWidgets.QMainWindow): # type: ignore OnProjectPathUpdate = QtCore.Signal(Path) - def __init__(self, parent=None): + def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: super().__init__(parent) - self.settings = None - self.project_path = None - self.imports = None # we will store the project import node types here for now. + self.settings: Optional[QtCore.QSettings] = None + self.project_path: Optional[Path] = None + self.imports: Optional[Dict[str, Dict[str, Any]]] = ( + None # we will store the project import node types here for now. + ) icon = QtGui.QIcon("resources\\app.ico") self.setWindowIcon(icon) @@ -59,10 +70,10 @@ def __init__(self, parent=None): left_layout.setContentsMargins(0, 0, 0, 0) # Widgets - self.node_list = NodeList(self) + self.node_list: NodeList = NodeList(self) left_widget = QtWidgets.QWidget() - self.splitter = QtWidgets.QSplitter() - self.node_widget = NodeWidget(self) + self.splitter: QtWidgets.QSplitter = QtWidgets.QSplitter() + self.node_widget: NodeWidget = NodeWidget(self) # Add Widgets to layouts self.splitter.addWidget(left_widget) @@ -72,17 +83,17 @@ def __init__(self, parent=None): main_layout.addWidget(self.splitter) # Load the example project - example_project_path = (Path(__file__).parent.resolve() / 'Example_project') + example_project_path = Path(__file__).parent.resolve() / "Example_project" self.load_project(example_project_path) # Restore GUI from last state if settings.contains("geometry"): - self.restoreGeometry(settings.value("geometry")) + self.restoreGeometry(QByteArray(settings.value("geometry"))) s = settings.value("splitterSize") self.splitter.restoreState(s) - def save_project(self): + def save_project(self) -> None: file_dialog = QtWidgets.QFileDialog() file_dialog.setAcceptMode(QtWidgets.QFileDialog.AcceptSave) file_dialog.setDefaultSuffix("json") @@ -90,7 +101,7 @@ def save_project(self): file_path, _ = file_dialog.getSaveFileName() self.node_widget.save_project(file_path) - def load_project(self, project_path=None): + def load_project(self, project_path: Optional[Path] = None) -> None: if not project_path: return @@ -101,36 +112,35 @@ def load_project(self, project_path=None): self.imports = {} for file in project_path.glob("*.py"): - - if not file.stem.endswith('_node'): - print('file:', file.stem) + if not file.stem.endswith("_node"): + print("file:", file.stem) continue spec = importlib.util.spec_from_file_location(file.stem, file) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) for name, obj in inspect.getmembers(module): - if not name.endswith('_Node'): + if not name.endswith("_Node"): continue if inspect.isclass(obj): self.imports[obj.__name__] = {"class": obj, "module": module} - #break + # break self.node_list.update_project(self.imports) # work on just the first json file. add the ablitity to work on multiple json files later for json_path in project_path.glob("*.json"): - self.node_widget.load_scene(json_path, self.imports) + self.node_widget.load_scene(str(json_path), self.imports) break - def get_project_path(self): + def get_project_path(self) -> None: project_path = QtWidgets.QFileDialog.getExistingDirectory(None, "Select Project Folder", "") if not project_path: return - self.load_project(project_path) + self.load_project(Path(project_path)) - def closeEvent(self, event): + def closeEvent(self, event: QtGui.QCloseEvent) -> None: """ Handles the close event by saving the GUI state and closing the application. @@ -151,9 +161,6 @@ def closeEvent(self, event): if __name__ == "__main__": - import sys - - import qdarktheme app = QtWidgets.QApplication(sys.argv) app.setWindowIcon(QtGui.QIcon("resources\\app.ico")) diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..2721f97 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,4 @@ +[mypy] +python_version = 3.8 +ignore_missing_imports = True +strict = True \ No newline at end of file diff --git a/node_editor/__init__.py b/node_editor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/node_editor/common.py b/node_editor/common.py index ab7e2c5..4d49a5f 100644 --- a/node_editor/common.py +++ b/node_editor/common.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from enum import Enum diff --git a/node_editor/connection.py b/node_editor/connection.py index e107580..fd3110b 100644 --- a/node_editor/connection.py +++ b/node_editor/connection.py @@ -1,57 +1,62 @@ +from __future__ import annotations + +from typing import Optional +from typing import Tuple + +from PySide6.QtCore import QPointF +from PySide6.QtWidgets import QGraphicsScene + from node_editor.gui.connection_graphics import Connection_Graphics +from node_editor.node import Node +from node_editor.pin import Pin class Connection(Connection_Graphics): - def __init__(self, parent): + def __init__(self, parent: Optional[Connection_Graphics]) -> None: super().__init__(parent) + self.start_pin: Optional[Pin] = None + self.end_pin: Optional[Pin] = None + self.start_pos: QPointF = QPointF() + self.end_pos: QPointF = QPointF() - self.start_pin = None - self.end_pin = None - - def delete(self): - """ - Deletes the connection and removes it from the scene and any connected pins. - """ + def delete(self) -> None: for pin in (self.start_pin, self.end_pin): - if pin: + if pin is not None: pin.connection = None - pin = None - - self.scene().removeItem(self) + self.start_pin = None + self.end_pin = None + scene = self.scene() + if scene is not None: + scene.removeItem(self) - def set_start_pin(self, pin): + def set_start_pin(self, pin: Pin) -> None: self.start_pin = pin - self.start_pin.connection = self + pin.connection = self - def set_end_pin(self, pin): + def set_end_pin(self, pin: Pin) -> None: self.end_pin = pin - self.end_pin.connection = self - - def nodes(self): - """ - Returns a tuple of the two connected nodes. - - Returns: - tuple: A tuple of the two Node objects connected by this Connection. - """ - return (self.start_pin.node(), self.end_pin.node()) + pin.connection = self - def update_start_and_end_pos(self): - """ - Update the start and end positions of the Connection. + def nodes(self) -> Tuple[Optional[Node], Optional[Node]]: + return ( + self.start_pin.node if self.start_pin is not None else None, + self.end_pin.node if self.end_pin is not None else None, + ) - Get the start and end pins and use them to set the start and end positions. - """ + def update_start_and_end_pos(self) -> None: + if self.start_pin is not None and not self.start_pin.is_output: + self.start_pin, self.end_pin = self.end_pin, self.start_pin - if self.start_pin and not self.start_pin.is_output: - temp = self.end_pin - self.end_pin = self.start_pin - self.start_pin = temp - - if self.start_pin: + if self.start_pin is not None: self.start_pos = self.start_pin.scenePos() - if self.end_pin: + if self.end_pin is not None: self.end_pos = self.end_pin.scenePos() self.update_path() + + def scene(self) -> Optional[QGraphicsScene]: + return super().scene() + + def update_path(self) -> None: + super().update_path() diff --git a/node_editor/gui/connection_graphics.py b/node_editor/gui/connection_graphics.py index 1766eaa..1564c36 100644 --- a/node_editor/gui/connection_graphics.py +++ b/node_editor/gui/connection_graphics.py @@ -1,7 +1,16 @@ -from PySide6 import QtCore, QtGui, QtWidgets +from __future__ import annotations +from typing import Optional +from typing import Tuple -class Connection_Graphics(QtWidgets.QGraphicsPathItem): +from PySide6 import QtCore +from PySide6 import QtGui +from PySide6 import QtWidgets + +from node_editor.node import Node + + +class Connection_Graphics(QtWidgets.QGraphicsPathItem): # type: ignore """ A Connection represents a graphical connection between two NodePorts in a PySide6 application. @@ -26,23 +35,23 @@ class Connection_Graphics(QtWidgets.QGraphicsPathItem): conn.update_path() """ - def __init__(self, parent): + def __init__(self, parent: Optional[QtWidgets.QGraphicsItem] = None) -> None: super().__init__(parent) - self.setFlag(QtWidgets.QGraphicsPathItem.ItemIsSelectable) + self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsSelectable) self.setPen(QtGui.QPen(QtGui.QColor(200, 200, 200), 2)) - self.setBrush(QtCore.Qt.NoBrush) + self.setBrush(QtCore.Qt.BrushStyle.NoBrush) self.setZValue(-1) - self.start_pos = QtCore.QPointF() - self.end_pos = QtCore.QPointF() - self.start_pin = None - self.end_pin = None + self.start_pos: QtCore.QPointF = QtCore.QPointF() + self.end_pos: QtCore.QPointF = QtCore.QPointF() + self.start_pin: Optional[NodePort] = None + self.end_pin: Optional[NodePort] = None - self._do_highlight = False + self._do_highlight: bool = False - def update_path(self): + def update_path(self) -> None: """ Draws a smooth cubic curve from the start to end pins. """ @@ -58,7 +67,12 @@ def update_path(self): self.setPath(path) - def paint(self, painter, option=None, widget=None): + def paint( + self, + painter: QtGui.QPainter, + option: Optional[QtWidgets.QStyleOptionGraphicsItem] = None, + widget: Optional[QtWidgets.QWidget] = None, + ) -> None: """ Override the default paint method depending on if the object is selected. @@ -81,3 +95,15 @@ def paint(self, painter, option=None, widget=None): painter.setPen(QtGui.QPen(color, thickness)) painter.drawPath(self.path()) + + def delete(self) -> None: + pass + + def nodes(self) -> Tuple[Node, Node]: + # Implement the logic to return the connected nodes + if self.start_pin and self.end_pin: + return (self.start_pin.node, self.end_pin.node) + raise ValueError("Both start_pin and end_pin must be set") + + def update_start_and_end_pos(self) -> None: + pass diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index b3c17a7..82535d9 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -1,13 +1,19 @@ +from __future__ import annotations + from contextlib import suppress +from typing import Optional -from PySide6 import QtCore, QtWidgets +from PySide6 import QtCore +from PySide6 import QtWidgets +from PySide6.QtWidgets import QGraphicsItem +from PySide6.QtWidgets import QGraphicsScene from node_editor.connection import Connection from node_editor.node import Node from node_editor.pin import Pin -class NodeEditor(QtCore.QObject): +class NodeEditor(QtWidgets.QWidget): """ The main class of the node editor. This class handles the logic for creating, connecting, and deleting nodes and connections. @@ -21,7 +27,7 @@ class NodeEditor(QtCore.QObject): :vartype _last_selected: Node """ - def __init__(self, parent): + def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: """ Constructor for NodeEditor. @@ -30,12 +36,14 @@ def __init__(self, parent): """ super().__init__(parent) - self.connection = None - self.port = None - self.scene = None - self._last_selected = None - - def install(self, scene): + self.setWindowTitle("Node Editor") + self.setGeometry(100, 100, 800, 600) + self.connection: Optional[Connection] = None + self.port: Optional[Pin] = None + self.scene: Optional[QGraphicsScene] = None + self._last_selected: Optional[Node] = None + + def install(self, scene: QGraphicsScene) -> None: """ Installs the NodeEditor into a QGraphicsScene. @@ -46,7 +54,7 @@ def install(self, scene): self.scene = scene self.scene.installEventFilter(self) - def item_at(self, position): + def item_at(self, position: QtCore.QPointF) -> Optional[QGraphicsItem]: """ Returns the QGraphicsItem at the given position. @@ -56,10 +64,13 @@ def item_at(self, position): :rtype: QGraphicsItem """ + if self.scene is None: + return None + items = self.scene.items(QtCore.QRectF(position - QtCore.QPointF(1, 1), QtCore.QSizeF(3, 3))) return items[0] if items else None - def eventFilter(self, watched, event): + def eventFilter(self, watched: QtCore.QObject, event: QtCore.QEvent) -> bool: """ Filters events from the QGraphicsScene. @@ -70,7 +81,7 @@ def eventFilter(self, watched, event): :return: True if the event was filtered, False otherwise. :rtype: bool """ - if type(event) == QtWidgets.QWidgetItem: + if type(event) is QtWidgets.QWidgetItem: return False if event.type() == QtCore.QEvent.GraphicsSceneMousePress: diff --git a/node_editor/gui/node_graphics.py b/node_editor/gui/node_graphics.py index f611bf7..c7404fa 100644 --- a/node_editor/gui/node_graphics.py +++ b/node_editor/gui/node_graphics.py @@ -1,15 +1,22 @@ -from PySide6 import QtCore, QtGui, QtWidgets +from __future__ import annotations + +from typing import List +from typing import Optional + +from PySide6 import QtCore +from PySide6 import QtGui +from PySide6 import QtWidgets from PySide6.QtCore import Qt from node_editor.common import Node_Status -class Node_Graphics(QtWidgets.QGraphicsItem): - def __init__(self): +class Node_Graphics(QtWidgets.QGraphicsItem): # type: ignore + def __init__(self) -> None: super().__init__() - self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable) - self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable) + self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsMovable) + self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsSelectable) self.title_text = "Title" self.title_color = QtGui.QColor(123, 33, 177) @@ -23,8 +30,8 @@ def __init__(self): self._width = 20 # The Width of the node self._height = 20 # the height of the node - self._pins = [] # A list of pins - self.uuid = None # An identifier to used when saving and loading the scene + self._pins: List[Pin] = [] # A list of pins + self.uuid: Optional[str] = None # An identifier to used when saving and loading the scene self.node_color = QtGui.QColor(20, 20, 20, 200) @@ -93,19 +100,19 @@ def paint(self, painter, option=None, widget=None): painter.setBrush(Qt.NoBrush) painter.drawPath(self.path) - def build(self): + def build(self) -> None: """ Builds the node by constructing its graphical representation. This method calculates the dimensions of the node, sets the fonts for various elements, and adds the necessary - graphical components to the node, such as the title, type, and pins. Once the graphical representation of the node - is constructed, the `setPath` method is called to set the path for the node. + graphical components to the node, such as the title, type, and pins. Once the graphical representation of the + node is constructed, the `setPath` method is called to set the path for the node. Returns: None. """ - - self.init_widget() # configure the widget side of things. We need to get the size of the widget before building the rest of the node + # configure the widget side of things. We need to get the size of the widget beforebuilding the rest of the node + # self.init_widget() self.widget.setStyleSheet("background-color: " + self.node_color.name() + ";") self.title_path = QtGui.QPainterPath() # reset self.type_path = QtGui.QPainterPath() # The path for the type @@ -165,7 +172,7 @@ def build(self): self.path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, total_height + 10, 5, 5) # Draw the status rectangle - self.status_path.setFillRule(Qt.WindingFill) + self.status_path.setFillRule(Qt.FillRule.WindingFill) self.status_path.addRoundedRect(total_width / 2 - 12, -total_height / 2 + 2, 10, 10, 2, 2) # self.status_path.addRect(total_width / 2 - 10, -total_height / 2, 5, 5) # self.status_path.addRect(total_width / 2 - 10, -total_height / 2 + 15, 5, 5) @@ -173,10 +180,12 @@ def build(self): # The color on the title self.title_bg_path = QtGui.QPainterPath() # The title background path - self.title_bg_path.setFillRule(Qt.WindingFill) + self.title_bg_path.setFillRule(Qt.FillRule.WindingFill) self.title_bg_path.addRoundedRect(-total_width / 2, -total_height / 2, total_width, bg_height, 5, 5) self.title_bg_path.addRect(-total_width / 2, -total_height / 2 + bg_height - 10, 10, 10) # bottom left corner - self.title_bg_path.addRect(total_width / 2 - 10, -total_height / 2 + bg_height - 10, 10, 10) # bottom right corner + self.title_bg_path.addRect( + total_width / 2 - 10, -total_height / 2 + bg_height - 10, 10, 10 + ) # bottom right corner # Draw the title self.title_path.addText( @@ -227,4 +236,4 @@ def build(self): self._height = total_height # move the widget to the bottom - self.widget.move(-self.widget.size().width() / 2, total_height / 2 - self.widget.size().height() + 5) + self.widget.move(int(-self.widget.size().width() / 2), int(total_height / 2 - self.widget.size().height() + 5)) diff --git a/node_editor/gui/node_list.py b/node_editor/gui/node_list.py index 34ee9a6..f584427 100644 --- a/node_editor/gui/node_list.py +++ b/node_editor/gui/node_list.py @@ -1,7 +1,34 @@ -from PySide6 import QtCore, QtGui, QtWidgets -import sys -import importlib -import inspect +from __future__ import annotations + +from types import ModuleType +from typing import Dict +from typing import List +from typing import Optional +from typing import Union + +from PySide6 import QtCore +from PySide6 import QtGui +from PySide6 import QtWidgets + + +class CustomQListWidgetItem(QtWidgets.QListWidgetItem): # type: ignore + module: str + class_name: str + + +class CustomQMimeData(QtCore.QMimeData): # type: ignore + item: CustomQListWidgetItem + + +class ImportData: + def __init__(self, module: str, class_: str): + self.module: str = module + self.class_: str = class_ + + +class NodeList(QtWidgets.QListWidget): # type: ignore + module: str + class_: str class NodeList(QtWidgets.QListWidget): @@ -9,24 +36,26 @@ def __init__(self, parent=None): super().__init__(parent) self.setDragEnabled(True) # enable dragging - def update_project(self, imports): - # make an item for each custom class + def update_project(self, imports: Dict[str, Dict[str, Union[type, ModuleType]]]) -> None: + print("imports:", imports, type(imports)) + # make an item for each custom class for name, data in imports.items(): name = name.replace("_Node", "") item = QtWidgets.QListWidgetItem(name) + item.module = data["module"] item.class_name = data["class"] self.addItem(item) - def mousePressEvent(self, event): + def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: item = self.itemAt(event.pos()) - if item and item.text(): + if isinstance(item, CustomQListWidgetItem) and item.text(): name = item.text() drag = QtGui.QDrag(self) - mime_data = QtCore.QMimeData() + mime_data = CustomQMimeData() mime_data.setText(name) mime_data.item = item drag.setMimeData(mime_data) diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index f9f0222..d382937 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -1,34 +1,34 @@ +from __future__ import annotations + import json import uuid -from collections import OrderedDict +from typing import Dict +from typing import Optional -from PySide6 import QtGui, QtWidgets +from PySide6 import QtGui +from PySide6 import QtWidgets -from node_editor.node import Node +from node_editor.connection import Connection from node_editor.gui.node_editor import NodeEditor from node_editor.gui.view import View - -from node_editor.connection import Connection from node_editor.node import Node from node_editor.pin import Pin -class NodeScene(QtWidgets.QGraphicsScene): - def dragEnterEvent(self, e): +class NodeScene(QtWidgets.QGraphicsScene): # type: ignore + def dragEnterEvent(self, e: QtGui.QDragEnterEvent) -> None: e.acceptProposedAction() - def dropEvent(self, e): - # find item at these coordinates - item = self.itemAt(e.scenePos()) - if item.setAcceptDrops: - # pass on event to item at the coordinates + def dropEvent(self, e: QtGui.QDropEvent) -> None: + item = self.itemAt(e.scenePos(), QtGui.QTransform()) + if item and hasattr(item, "setAcceptDrops"): item.dropEvent(e) - def dragMoveEvent(self, e): + def dragMoveEvent(self, e: QtGui.QDragMoveEvent) -> None: e.acceptProposedAction() -class NodeWidget(QtWidgets.QWidget): +class NodeWidget(QtWidgets.QWidget): # type: ignore """ Widget for creating and displaying a node editor. @@ -38,7 +38,7 @@ class NodeWidget(QtWidgets.QWidget): view (View): The view object for the node editor. """ - def __init__(self, parent): + def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: """ Initializes the NodeWidget object. @@ -47,7 +47,9 @@ def __init__(self, parent): """ super().__init__(parent) - self.node_lookup = {} # A dictionary of nodes, by uuids for faster looking up. Refactor this in the future + self.node_lookup: Dict[uuid.UUID, Node] = ( + {} + ) # A dictionary of nodes, by uuids for faster looking up. Refactor this in the future main_layout = QtWidgets.QVBoxLayout() main_layout.setContentsMargins(0, 0, 0, 0) self.setLayout(main_layout) @@ -63,13 +65,13 @@ def __init__(self, parent): self.view.request_node.connect(self.create_node) - def create_node(self, node): + def create_node(self, node: Node) -> None: node.uuid = uuid.uuid4() self.scene.addItem(node) pos = self.view.mapFromGlobal(QtGui.QCursor.pos()) node.setPos(self.view.mapToScene(pos)) - def load_scene(self, json_path, imports): + def load_scene(self, json_path: str, imports: Dict[str, Dict[str, Node]]) -> None: # load the scene json file data = None with open(json_path) as f: @@ -106,12 +108,12 @@ def load_scene(self, json_path, imports): connection.set_end_pin(end_pin) connection.update_start_and_end_pos() - def save_project(self, json_path): - from collections import OrderedDict + def save_project(self, json_path: str) -> None: + # from collections import OrderedDict # TODO possibly an ordered dict so things stay in order (better for git changes, and manual editing) # Maybe connections will need a uuid for each so they can be sorted and kept in order. - scene = {"nodes": [], "connections": []} + scene: Dict[str, list] = {"nodes": [], "connections": []} # Need the nodes, and connections of ports to nodes for item in self.scene.items(): diff --git a/node_editor/gui/pin_graphics.py b/node_editor/gui/pin_graphics.py index f935958..31981ab 100644 --- a/node_editor/gui/pin_graphics.py +++ b/node_editor/gui/pin_graphics.py @@ -1,85 +1,105 @@ -from PySide6 import QtCore, QtGui, QtWidgets +from __future__ import annotations +from typing import Optional +from typing import Union + +from PySide6 import QtCore +from PySide6 import QtGui +from PySide6 import QtWidgets +from PySide6.QtCore import Qt -class Pin_Graphics(QtWidgets.QGraphicsPathItem): - def __init__(self, parent, scene): - super().__init__(parent) - self.radius_ = 5 - self.margin = 2 +class Pin_Graphics(QtWidgets.QGraphicsPathItem): # type: ignore + def __init__(self, parent: Optional[QtWidgets.QGraphicsItem], scene: QtWidgets.QGraphicsScene) -> None: + super().__init__(parent) - self.execution = False + self.radius_: float = 5 + self.margin: int = 2 - path = QtGui.QPainterPath() + self.execution: bool = False + path: QtGui.QPainterPath = QtGui.QPainterPath() path.addEllipse(-self.radius_, -self.radius_, 2 * self.radius_, 2 * self.radius_) self.setPath(path) self.setFlag(QtWidgets.QGraphicsPathItem.ItemSendsScenePositionChanges) - self.font = QtGui.QFont() - self.font_metrics = QtGui.QFontMetrics(self.font) + self.font: QtGui.QFont = QtGui.QFont() + self.font_metrics: QtGui.QFontMetrics = QtGui.QFontMetrics(self.font) + + self.pin_text_height: int = self.font_metrics.height() - self.pin_text_height = self.font_metrics.height() + self.is_output: bool = False - self.is_output = False - self.margin = 2 + self.text_path: QtGui.QPainterPath = QtGui.QPainterPath() - self.text_path = QtGui.QPainterPath() + self.name: str = "" # Add this line to define self.name + self.connection: Optional[Union[QtWidgets.QGraphicsItem, QtCore.QObject]] = ( + None # Add this line to define self.connection + ) - def set_execution(self, execution): + def set_execution(self, execution: bool) -> None: if execution: - path = QtGui.QPainterPath() - - points = [] - points.append(QtCore.QPointF(-6, -7)) - points.append(QtCore.QPointF(-6, 7)) - points.append(QtCore.QPointF(-2, 7)) - points.append(QtCore.QPointF(6, 0)) - points.append(QtCore.QPointF(-2, -7)) - points.append(QtCore.QPointF(-6, -7)) + path: QtGui.QPainterPath = QtGui.QPainterPath() + + points: list[QtCore.QPointF] = [ + QtCore.QPointF(-6, -7), + QtCore.QPointF(-6, 7), + QtCore.QPointF(-2, 7), + QtCore.QPointF(6, 0), + QtCore.QPointF(-2, -7), + QtCore.QPointF(-6, -7), + ] path.addPolygon(QtGui.QPolygonF(points)) self.setPath(path) - def set_name(self, name): - nice_name = self.name.replace("_", " ").title() - self.pin_text_width = self.font_metrics.horizontalAdvance(nice_name) + def set_name(self, name: str) -> None: + self.name = name # Add this line to set self.name + nice_name: str = self.name.replace("_", " ").title() + self.pin_text_width: int = self.font_metrics.horizontalAdvance(nice_name) if self.is_output: x = -self.radius_ - self.margin - self.pin_text_width else: x = self.radius_ + self.margin - y = self.pin_text_height / 4 + y: float = self.pin_text_height / 4 self.text_path.addText(x, y, self.font, nice_name) - def paint(self, painter, option=None, widget=None): + def paint( + self, + painter: QtGui.QPainter, + option: Optional[QtWidgets.QStyleOptionGraphicsItem] = None, + widget: Optional[QtWidgets.QWidget] = None, + ) -> None: if self.execution: - painter.setPen(QtCore.Qt.white) + painter.setPen(Qt.GlobalColor.white) else: - painter.setPen(QtCore.Qt.green) + painter.setPen(Qt.GlobalColor.green) if self.is_connected(): if self.execution: - painter.setBrush(QtCore.Qt.white) + painter.setBrush(Qt.GlobalColor.white) else: - painter.setBrush(QtCore.Qt.green) - + painter.setBrush(Qt.GlobalColor.green) else: - painter.setBrush(QtCore.Qt.NoBrush) + painter.setBrush(Qt.BrushStyle.NoBrush) painter.drawPath(self.path()) # Draw text - if not self.execution: - painter.setPen(QtCore.Qt.NoPen) - painter.setBrush(QtCore.Qt.white) + painter.setPen(Qt.NoPen) + painter.setBrush(Qt.white) painter.drawPath(self.text_path) - def itemChange(self, change, value): - if change == QtWidgets.QGraphicsItem.ItemScenePositionHasChanged and self.connection: - self.connection.update_start_and_end_pos() - + def itemChange(self, change: QtWidgets.QGraphicsItem.GraphicsItemChange, value: object) -> object: + if change == QtWidgets.QGraphicsItem.GraphicsItemChange.ItemScenePositionHasChanged and self.connection: + if hasattr(self.connection, "update_start_and_end_pos"): + self.connection.update_start_and_end_pos() return value + + def is_connected(self) -> bool: + # Add this method to resolve the 'is_connected' call in the paint method + return self.connection is not None diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index b9b7fba..fc159af 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -1,4 +1,11 @@ -from PySide6 import QtCore, QtGui, QtOpenGLWidgets, QtWidgets +from __future__ import annotations + +from typing import Optional + +from PySide6 import QtCore +from PySide6 import QtGui +from PySide6 import QtOpenGLWidgets +from PySide6 import QtWidgets from node_editor.node import Node @@ -8,34 +15,35 @@ class View(QtWidgets.QGraphicsView): View class for node editor. """ - _background_color = QtGui.QColor(38, 38, 38) + _background_color: QtGui.QColor = QtGui.QColor(38, 38, 38) - _grid_pen_s = QtGui.QPen(QtGui.QColor(52, 52, 52, 255), 0.5) - _grid_pen_l = QtGui.QPen(QtGui.QColor(22, 22, 22, 255), 1.0) + _grid_pen_s: QtGui.QPen = QtGui.QPen(QtGui.QColor(52, 52, 52, 255), 0.5) + _grid_pen_l: QtGui.QPen = QtGui.QPen(QtGui.QColor(22, 22, 22, 255), 1.0) - _grid_size_fine = 15 - _grid_size_course = 150 + _grid_size_fine: int = 15 + _grid_size_course: int = 150 - _mouse_wheel_zoom_rate = 0.0015 + _mouse_wheel_zoom_rate: float = 0.0015 request_node = QtCore.Signal(object) - def __init__(self, parent): + def __init__(self, parent: QtWidgets.QWidget) -> None: super().__init__(parent) self.setRenderHint(QtGui.QPainter.Antialiasing) - self._manipulationMode = 0 + self._manipulationMode: int = 0 - gl_format = QtGui.QSurfaceFormat() + gl_format: QtGui.QSurfaceFormat = QtGui.QSurfaceFormat() gl_format.setSamples(10) QtGui.QSurfaceFormat.setDefaultFormat(gl_format) - gl_widget = QtOpenGLWidgets.QOpenGLWidget() + gl_widget: QtOpenGLWidgets.QOpenGLWidget = QtOpenGLWidgets.QOpenGLWidget() - self.currentScale = 1 - self._pan = False - self._pan_start_x = 0 - self._pan_start_y = 0 - self._numScheduledScalings = 0 - self.lastMousePos = QtCore.QPoint() + self.currentScale: float = 1 + self._pan: bool = False + self._pan_start_x: int = 0 + self._pan_start_y: int = 0 + self._numScheduledScalings: int = 0 + self.lastMousePos: QtCore.QPoint = QtCore.QPoint() + self.anim: Optional[QtCore.QTimeLine] = None self.setViewport(gl_widget) @@ -45,7 +53,7 @@ def __init__(self, parent): self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setFrameShape(QtWidgets.QFrame.NoFrame) - def wheelEvent(self, event): + def wheelEvent(self, event: QtGui.QWheelEvent) -> None: """ Handles the wheel events, e.g. zoom in/out. @@ -70,7 +78,7 @@ def wheelEvent(self, event): self.anim.finished.connect(self.anim_finished) self.anim.start() - def scaling_time(self, x): + def scaling_time(self, x: float) -> None: """ Updates the current scale based on the wheel events. @@ -82,7 +90,7 @@ def scaling_time(self, x): self.scale(factor, factor) - def anim_finished(self): + def anim_finished(self) -> None: """ Called when the zoom animation is finished. """ @@ -91,7 +99,7 @@ def anim_finished(self): else: self._numScheduledScalings += 1 - def drawBackground(self, painter, rect): + def drawBackground(self, painter: QtGui.QPainter, rect: QtCore.QRectF) -> None: """ Draws the background for the node editor view. @@ -145,21 +153,21 @@ def drawBackground(self, painter, rect): return super().drawBackground(painter, rect) - def contextMenuEvent(self, event): + def contextMenuEvent(self, event: QtGui.QContextMenuEvent) -> None: """ - This method is called when a context menu event is triggered in the view. It finds the item at the event position and - shows a context menu if the item is a Node. + This method is called when a context menu event is triggered in the view. It finds the item at the + event position and shows a context menu if the item is a Node. """ - cursor = QtGui.QCursor() + # cursor = QtGui.QCursor() # origin = self.mapFromGlobal(cursor.pos()) - pos = self.mapFromGlobal(cursor.pos()) + # pos = self.mapFromGlobal(cursor.pos()) item = self.itemAt(event.pos()) if item: if isinstance(item, Node): print("Found Node", item) - menu = QtWidgets.QMenu(self) + # menu = QtWidgets.QMenu(self) # hello_action = QtWidgets.QAction("Hello", self) @@ -169,28 +177,28 @@ def contextMenuEvent(self, event): # if action == hello_action: # print("Hello") - def dragEnterEvent(self, e): + def dragEnterEvent(self, e: QtGui.QDragEnterEvent) -> None: """ - This method is called when a drag and drop event enters the view. It checks if the mime data format is "text/plain" - and accepts or ignores the event accordingly. + This method is called when a drag and drop event enters the view. It checks if the mime data format + is "text/plain" and accepts or ignores the event accordingly. """ if e.mimeData().hasFormat("text/plain"): e.accept() else: e.ignore() - def dropEvent(self, e): + def dropEvent(self, e: QtGui.QDropEvent) -> None: """ - This method is called when a drag and drop event is dropped onto the view. It retrieves the name of the dropped node - from the mime data and emits a signal to request the creation of the corresponding node. + This method is called when a drag and drop event is dropped onto the view. It retrieves the name of the + dropped node from the mime data and emits a signal to request the creation of the corresponding node. """ node = e.mimeData().item.class_name self.request_node.emit(node()) - def mousePressEvent(self, event): + def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: """ - This method is called when a mouse press event occurs in the view. It sets the cursor to a closed hand cursor and - enables panning if the middle mouse button is pressed. + This method is called when a mouse press event occurs in the view. It sets the cursor to a closed + hand cursor and enables panning if the middle mouse button is pressed. """ if event.button() == QtCore.Qt.MiddleButton: self._pan = True @@ -200,10 +208,10 @@ def mousePressEvent(self, event): return super().mousePressEvent(event) - def mouseReleaseEvent(self, event): + def mouseReleaseEvent(self, event: QtGui.QMouseEvent) -> None: """ - This method is called when a mouse release event occurs in the view. It sets the cursor back to the arrow cursor and - disables panning if the middle mouse button is released. + This method is called when a mouse release event occurs in the view. It sets the cursor back to the + arrow cursor and disables panning if the middle mouse button is released. """ if event.button() == QtCore.Qt.MiddleButton: self._pan = False @@ -211,7 +219,7 @@ def mouseReleaseEvent(self, event): return super().mouseReleaseEvent(event) - def mouseMoveEvent(self, event): + def mouseMoveEvent(self, event: QtGui.QMouseEvent) -> None: """ This method is called when a mouse move event occurs in the view. It pans the view if the middle mouse button is pressed and moves the mouse. diff --git a/node_editor/node.py b/node_editor/node.py index c5b55d6..6ffef5f 100644 --- a/node_editor/node.py +++ b/node_editor/node.py @@ -1,23 +1,31 @@ -from PySide6 import QtCore, QtGui, QtWidgets -from PySide6.QtCore import Qt +from __future__ import annotations + +from typing import List +from typing import Optional -from node_editor.pin import Pin from node_editor.gui.node_graphics import Node_Graphics -from node_editor.common import Node_Status +from node_editor.pin import Pin + +# from PySide6 import QtCore +# from PySide6 import QtGui +# from PySide6 import QtWidgets +# from PySide6.QtCore import Qt +# rom node_editor.common import Node_Status class Node(Node_Graphics): - def __init__(self): + def __init__(self) -> None: super().__init__() + self._pins: List[Pin] = [] # Override me - def init_widget(self): + def init_widget(self) -> None: pass - def compute(self): + def compute(self) -> None: raise NotImplementedError("compute is not implemented") - def execute(self): + def execute(self) -> None: # Get the values from the input pins self.execute_inputs() @@ -27,13 +35,13 @@ def execute(self): # execute nodes connected to output self.execute_outputs() - def execute_inputs(self): + def execute_inputs(self) -> None: pass - def execute_outputs(self): + def execute_outputs(self) -> None: pass - def delete(self): + def delete(self) -> None: """Deletes the connection. This function removes any connected pins by calling :any:`Port.remove_connection` for each pin @@ -51,18 +59,19 @@ def delete(self): self.scene().removeItem(self) - def get_pin(self, name): + def get_pin(self, name: str) -> Optional[Pin]: for pin in self._pins: if pin.name == name: return pin - def add_pin(self, name, is_output=False, execution=False): + def add_pin(self, name: str, is_output: bool = False, execution: bool = False) -> None: """ Adds a new pin to the node. Args: name (str): The name of the new pin. - is_output (bool, optional): True if the new pin is an output pin, False if it's an input pin. Default is False. + is_output (bool, optional): True if the new pin is an output pin, False if it's an input pin. Default is + False. flags (int, optional): A set of flags to apply to the new pin. Default is 0. ptr (Any, optional): A pointer to associate with the new pin. Default is None. @@ -78,13 +87,14 @@ def add_pin(self, name, is_output=False, execution=False): self._pins.append(pin) - def select_connections(self, value): + def select_connections(self, value: bool) -> None: """ Sets the highlighting of all connected pins to the specified value. - This method takes a boolean value `value` as input and sets the `_do_highlight` attribute of all connected pins to - this value. If a pin is not connected, this method does nothing for that pin. After setting the `_do_highlight` - attribute for all connected pins, the `update_path` method is called for each connection. + This method takes a boolean value `value` as input and sets the `_do_highlight` attribute of all + connected pins to this value. If a pin is not connected, this method does nothing for that pin. + After setting the `_do_highlight` attribute for all connected pins, the `update_path` method is + called for each connection. Args: value: A boolean value indicating whether to highlight the connected pins or not. diff --git a/node_editor/pin.py b/node_editor/pin.py index 3e6eb3d..51982b6 100644 --- a/node_editor/pin.py +++ b/node_editor/pin.py @@ -1,27 +1,33 @@ +from __future__ import annotations + +from typing import Any +from typing import Optional + from node_editor.gui.pin_graphics import Pin_Graphics class Pin(Pin_Graphics): - def __init__(self, parent, scene): + def __init__(self, parent: Any, scene: Any) -> None: super().__init__(parent, scene) - self.name = None - self.node = None - self.connection = None + self.name: Optional[str] = None + self.node: Optional[Any] = None + self.connection: Optional[Any] = None + self.execution: bool = False - def set_execution(self, execution): + def set_execution(self, execution: bool) -> None: self.execution = execution super().set_execution(execution) - def set_name(self, name): + def set_name(self, name: str) -> None: self.name = name super().set_name(name) - def clear_connection(self): + def clear_connection(self) -> None: if self.connection: self.connection.delete() - def can_connect_to(self, pin): + def can_connect_to(self, pin: Optional[Pin]) -> bool: if not pin: return False if pin.node == self.node: @@ -29,26 +35,27 @@ def can_connect_to(self, pin): return self.is_output != pin.is_output - def is_connected(self): + def is_connected(self) -> bool: return bool(self.connection) - def get_data(self): + def get_data(self) -> Any: + pass # Get a list of nodes in the order to be computed. Forward evaluation by default. - def get_node_compute_order(node, forward=False): - # Create a set to keep track of visited nodes - visited = set() - # Create a stack to keep track of nodes to visit - stack = [node] - # Create a list to store the evaluation order - order = [] + # def get_node_compute_order(node, forward=False): + # Create a set to keep track of visited nodes + # visited = set() + # Create a stack to keep track of nodes to visit + # stack = [node] + # Create a list to store the evaluation order + # order = [] # Get the next nodes that this node is dependent on - def get_next_input_node(node): - pass + # def get_next_input_node(node): + # pass # Get the next nodes that is affected by the input node. - def get_next_output_node(node): - pass + # def get_next_output_node(node): + # pass # if pin isn't connected, return it current data diff --git a/pre-commit_check.bat b/pre-commit_check.bat new file mode 100644 index 0000000..e69de29 diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..f97a60c --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,5 @@ +pre-commit +coverage +pytest +pytest-qt +types-requests From e8c6ad415b95f81e761d379a9294a0c52c2843c2 Mon Sep 17 00:00:00 2001 From: Bryan Date: Mon, 23 Sep 2024 18:26:41 -0700 Subject: [PATCH 75/88] static typing --- Example_Project/Add_node.py | 10 +++++++--- Example_Project/Button_node.py | 8 +++++--- Example_Project/Print_node.py | 10 +++++++--- Example_Project/Scaler_node.py | 4 ++-- main.py | 27 +++++++++++++------------- mypy.ini | 2 +- node_editor/gui/connection_graphics.py | 12 ++++++++---- node_editor/gui/node_editor.py | 8 ++++---- node_editor/gui/node_graphics.py | 25 +++++++++++++++++++----- node_editor/gui/node_list.py | 12 +++++------- node_editor/gui/node_widget.py | 17 +++++++++++----- node_editor/gui/view.py | 10 +++++----- node_editor/node.py | 3 ++- node_editor/pin.py | 2 +- pre-commit_check.bat | 0 pre-commit_check.ps1 | 3 +++ 16 files changed, 96 insertions(+), 57 deletions(-) delete mode 100644 pre-commit_check.bat create mode 100644 pre-commit_check.ps1 diff --git a/Example_Project/Add_node.py b/Example_Project/Add_node.py index abb1bf1..dcee04f 100644 --- a/Example_Project/Add_node.py +++ b/Example_Project/Add_node.py @@ -1,5 +1,6 @@ from __future__ import annotations +from typing import Optional from typing import Tuple from node_editor.node import Node @@ -21,9 +22,12 @@ def __init__(self) -> None: self.add_pin(name="output", is_output=True) self.build() - def set_color(self, title_color: Tuple[int, int, int]) -> None: - # Assuming set_color is defined in the parent class - super().set_color(title_color=title_color) + def set_color( + self, + title_color: Tuple[int, int, int], + background_color: Optional[Tuple[int, int, int]] = None, + ) -> None: + super().set_color(title_color, background_color) def add_pin(self, name: str, is_output: bool, execution: bool = False) -> None: # Assuming add_pin is defined in the parent class diff --git a/Example_Project/Button_node.py b/Example_Project/Button_node.py index 68fbdb0..23b501d 100644 --- a/Example_Project/Button_node.py +++ b/Example_Project/Button_node.py @@ -1,10 +1,12 @@ +from __future__ import annotations + from PySide6 import QtWidgets from node_editor.node import Node class Button_Node(Node): - def __init__(self): + def __init__(self) -> None: super().__init__() self.title_text = "Button" @@ -15,7 +17,7 @@ def __init__(self): self.build() - def init_widget(self): + def init_widget(self) -> None: self.widget = QtWidgets.QWidget() layout = QtWidgets.QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) @@ -31,6 +33,6 @@ def init_widget(self): super().init_widget() - def btn_cmd(self): + def btn_cmd(self) -> None: print("btn command") self.execute() diff --git a/Example_Project/Print_node.py b/Example_Project/Print_node.py index b9b0332..3476c37 100644 --- a/Example_Project/Print_node.py +++ b/Example_Project/Print_node.py @@ -1,5 +1,6 @@ from __future__ import annotations +from typing import Optional from typing import Tuple from node_editor.node import Node @@ -18,9 +19,12 @@ def __init__(self) -> None: self.add_pin(name="input", is_output=False) self.build() - def set_color(self, title_color: Tuple[int, int, int]) -> None: - # Assuming set_color is defined in the parent class - super().set_color(title_color=title_color) + def set_color( + self, + title_color: Tuple[int, int, int], + background_color: Optional[Tuple[int, int, int]] = None, + ) -> None: + super().set_color(title_color, background_color) def add_pin(self, name: str, is_output: bool, execution: bool = False) -> None: # Assuming add_pin is defined in the parent class diff --git a/Example_Project/Scaler_node.py b/Example_Project/Scaler_node.py index 2417e51..0a93802 100644 --- a/Example_Project/Scaler_node.py +++ b/Example_Project/Scaler_node.py @@ -7,7 +7,7 @@ class Scaler_Node(Node): - def __init__(self): + def __init__(self) -> None: super().__init__() self.title_text = "Scaler" @@ -18,7 +18,7 @@ def __init__(self): self.build() - def init_widget(self): + def init_widget(self) -> None: self.widget = QtWidgets.QWidget() self.widget.setFixedWidth(100) layout = QtWidgets.QVBoxLayout() diff --git a/main.py b/main.py index dac12e3..50ed969 100644 --- a/main.py +++ b/main.py @@ -1,14 +1,3 @@ -""" -A simple Node Editor application that allows the user to create, modify and connect nodes of various types. - -The application consists of a main window that contains a splitter with a Node List and a Node Widget. The Node List -shows a list of available node types, while the Node Widget is where the user can create, edit and connect nodes. - -This application uses PySide6 as a GUI toolkit. - -Author: Bryan Howard -Repo: https://github.com/bhowiebkr/simple-node-editor -""" from __future__ import annotations import importlib @@ -31,6 +20,18 @@ logging.basicConfig(level=logging.DEBUG) +""" +A simple Node Editor application that allows the user to create, modify and connect nodes of various types. + +The application consists of a main window that contains a splitter with a Node List and a Node Widget. The Node List +shows a list of available node types, while the Node Widget is where the user can create, edit and connect nodes. + +This application uses PySide6 as a GUI toolkit. + +Author: Bryan Howard +Repo: https://github.com/bhowiebkr/simple-node-editor +""" + class NodeEditor(QtWidgets.QMainWindow): # type: ignore OnProjectPathUpdate = QtCore.Signal(Path) @@ -115,8 +116,8 @@ def load_project(self, project_path: Optional[Path] = None) -> None: if not file.stem.endswith("_node"): print("file:", file.stem) continue - spec = importlib.util.spec_from_file_location(file.stem, file) - module = importlib.util.module_from_spec(spec) + spec = importlib.util.spec_from_file_location(file.stem, file) # type: ignore + module = importlib.util.module_from_spec(spec) # type: ignore spec.loader.exec_module(module) for name, obj in inspect.getmembers(module): diff --git a/mypy.ini b/mypy.ini index 2721f97..37c9065 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,4 +1,4 @@ [mypy] python_version = 3.8 ignore_missing_imports = True -strict = True \ No newline at end of file +strict = True diff --git a/node_editor/gui/connection_graphics.py b/node_editor/gui/connection_graphics.py index 1564c36..5cdd030 100644 --- a/node_editor/gui/connection_graphics.py +++ b/node_editor/gui/connection_graphics.py @@ -1,5 +1,6 @@ from __future__ import annotations +from typing import cast from typing import Optional from typing import Tuple @@ -8,6 +9,7 @@ from PySide6 import QtWidgets from node_editor.node import Node +from node_editor.pin import Pin class Connection_Graphics(QtWidgets.QGraphicsPathItem): # type: ignore @@ -46,8 +48,8 @@ def __init__(self, parent: Optional[QtWidgets.QGraphicsItem] = None) -> None: self.start_pos: QtCore.QPointF = QtCore.QPointF() self.end_pos: QtCore.QPointF = QtCore.QPointF() - self.start_pin: Optional[NodePort] = None - self.end_pin: Optional[NodePort] = None + self.start_pin: Optional[Pin] + self.end_pin: Optional[Pin] self._do_highlight: bool = False @@ -99,10 +101,12 @@ def paint( def delete(self) -> None: pass - def nodes(self) -> Tuple[Node, Node]: + def nodes(self) -> Tuple[Optional[Node], Optional[Node]]: # Implement the logic to return the connected nodes if self.start_pin and self.end_pin: - return (self.start_pin.node, self.end_pin.node) + start_node = cast(Optional[Node], self.start_pin.node) if self.start_pin else None + end_node = cast(Optional[Node], self.end_pin.node) if self.end_pin else None + return (start_node, end_node) raise ValueError("Both start_pin and end_pin must be set") def update_start_and_end_pos(self) -> None: diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index 82535d9..8ff5a54 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -13,7 +13,7 @@ from node_editor.pin import Pin -class NodeEditor(QtWidgets.QWidget): +class NodeEditor(QtWidgets.QWidget): # type: ignore """ The main class of the node editor. This class handles the logic for creating, connecting, and deleting nodes and connections. @@ -40,7 +40,7 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: self.setGeometry(100, 100, 800, 600) self.connection: Optional[Connection] = None self.port: Optional[Pin] = None - self.scene: Optional[QGraphicsScene] = None + self.scene: QGraphicsScene self._last_selected: Optional[Node] = None def install(self, scene: QGraphicsScene) -> None: @@ -140,7 +140,7 @@ def eventFilter(self, watched: QtCore.QObject, event: QtCore.QEvent) -> bool: item = self.item_at(event.scenePos()) # connecting a port - if isinstance(item, Pin): + if isinstance(item, Pin) and self.port: if self.port.can_connect_to(item): # print("Making connection") @@ -167,4 +167,4 @@ def eventFilter(self, watched: QtCore.QObject, event: QtCore.QEvent) -> bool: self.port = None return True - return super().eventFilter(watched, event) + return bool(super().eventFilter(watched, event)) diff --git a/node_editor/gui/node_graphics.py b/node_editor/gui/node_graphics.py index c7404fa..968ce83 100644 --- a/node_editor/gui/node_graphics.py +++ b/node_editor/gui/node_graphics.py @@ -1,7 +1,9 @@ from __future__ import annotations +import uuid from typing import List from typing import Optional +from typing import Tuple from PySide6 import QtCore from PySide6 import QtGui @@ -9,6 +11,7 @@ from PySide6.QtCore import Qt from node_editor.common import Node_Status +from node_editor.pin import Pin class Node_Graphics(QtWidgets.QGraphicsItem): # type: ignore @@ -31,7 +34,7 @@ def __init__(self) -> None: self._width = 20 # The Width of the node self._height = 20 # the height of the node self._pins: List[Pin] = [] # A list of pins - self.uuid: Optional[str] = None # An identifier to used when saving and loading the scene + self.uuid: uuid.UUID # An identifier to used when saving and loading the scene self.node_color = QtGui.QColor(20, 20, 20, 200) @@ -43,7 +46,7 @@ def __init__(self) -> None: self.horizontal_margin = 15 # horizontal margin self.vertical_margin = 15 # vertical margin - def get_status_color(self): + def get_status_color(self) -> QtGui.QColor: if self.status == Node_Status.CLEAN: return QtGui.QColor(0, 255, 0) elif self.status == Node_Status.DIRTY: @@ -51,14 +54,26 @@ def get_status_color(self): elif self.status == Node_Status.ERROR: return QtGui.QColor(255, 0, 0) - def boundingRect(self): + def boundingRect(self) -> QtCore.QRectF: return self.size - def set_color(self, title_color=(123, 33, 177), background_color=(20, 20, 20, 200)): + def set_color( + self, title_color: Tuple[int, int, int], background_color: Optional[Tuple[int, int, int]] = None + ) -> None: + + # default title_color (123, 33, 177) + + if background_color is None: + background_color = (20, 20, 20) self.title_color = QtGui.QColor(title_color[0], title_color[1], title_color[2]) self.node_color = QtGui.QColor(background_color[0], background_color[1], background_color[2]) - def paint(self, painter, option=None, widget=None): + def paint( + self, + painter: QtGui.QPainter, + option: QtWidgets.QStyleOptionGraphicsItem = None, + widget: QtWidgets.QWidget = None, + ) -> None: """ Paints the node on the given painter. diff --git a/node_editor/gui/node_list.py b/node_editor/gui/node_list.py index f584427..c94d0f3 100644 --- a/node_editor/gui/node_list.py +++ b/node_editor/gui/node_list.py @@ -2,7 +2,6 @@ from types import ModuleType from typing import Dict -from typing import List from typing import Optional from typing import Union @@ -26,19 +25,18 @@ def __init__(self, module: str, class_: str): self.class_: str = class_ -class NodeList(QtWidgets.QListWidget): # type: ignore - module: str - class_: str +# class NodeList(QtWidgets.QListWidget): # type: ignore +# module: str +# class_: str -class NodeList(QtWidgets.QListWidget): - def __init__(self, parent=None): +class NodeList(QtWidgets.QListWidget): # type: ignore + def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: super().__init__(parent) self.setDragEnabled(True) # enable dragging def update_project(self, imports: Dict[str, Dict[str, Union[type, ModuleType]]]) -> None: - print("imports:", imports, type(imports)) # make an item for each custom class for name, data in imports.items(): name = name.replace("_Node", "") diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index d382937..414e8d2 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -2,7 +2,9 @@ import json import uuid +from typing import Any from typing import Dict +from typing import List from typing import Optional from PySide6 import QtGui @@ -113,7 +115,7 @@ def save_project(self, json_path: str) -> None: # TODO possibly an ordered dict so things stay in order (better for git changes, and manual editing) # Maybe connections will need a uuid for each so they can be sorted and kept in order. - scene: Dict[str, list] = {"nodes": [], "connections": []} + scene: Dict[str, List[Any]] = {"nodes": [], "connections": []} # Need the nodes, and connections of ports to nodes for item in self.scene.items(): @@ -121,10 +123,15 @@ def save_project(self, json_path: str) -> None: if isinstance(item, Connection): # print(f"Name: {item}") nodes = item.nodes() - start_id = str(nodes[0].uuid) - end_id = str(nodes[1].uuid) - start_pin = item.start_pin.name() - end_pin = item.end_pin.name() + print(f"length of nodes: {len(nodes)}") + + if isinstance(nodes[0], Node): + start_id = str(nodes[0].uuid) + if isinstance(nodes[1], Node): + end_id = str(nodes[1].uuid) + if isinstance(item, Pin): + start_pin = item.start_pin.name() + end_pin = item.end_pin.name() # print(f"Node ids {start_id, end_id}") # print(f"connected ports {item.start_pin.name(), item.end_pin.name()}") diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index fc159af..de10edd 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -10,7 +10,7 @@ from node_editor.node import Node -class View(QtWidgets.QGraphicsView): +class View(QtWidgets.QGraphicsView): # type: ignore """ View class for node editor. """ @@ -151,7 +151,7 @@ def drawBackground(self, painter: QtGui.QPainter, rect: QtCore.QRectF) -> None: y += self._grid_size_course painter.drawLines(gridLines) - return super().drawBackground(painter, rect) + super().drawBackground(painter, rect) def contextMenuEvent(self, event: QtGui.QContextMenuEvent) -> None: """ @@ -206,7 +206,7 @@ def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: self._pan_start_y = event.y() self.setCursor(QtCore.Qt.ClosedHandCursor) - return super().mousePressEvent(event) + super().mousePressEvent(event) def mouseReleaseEvent(self, event: QtGui.QMouseEvent) -> None: """ @@ -217,7 +217,7 @@ def mouseReleaseEvent(self, event: QtGui.QMouseEvent) -> None: self._pan = False self.setCursor(QtCore.Qt.ArrowCursor) - return super().mouseReleaseEvent(event) + super().mouseReleaseEvent(event) def mouseMoveEvent(self, event: QtGui.QMouseEvent) -> None: """ @@ -232,4 +232,4 @@ def mouseMoveEvent(self, event: QtGui.QMouseEvent) -> None: self._pan_start_x = event.x() self._pan_start_y = event.y() - return super().mouseMoveEvent(event) + super().mouseMoveEvent(event) diff --git a/node_editor/node.py b/node_editor/node.py index 6ffef5f..ceae71d 100644 --- a/node_editor/node.py +++ b/node_editor/node.py @@ -63,8 +63,9 @@ def get_pin(self, name: str) -> Optional[Pin]: for pin in self._pins: if pin.name == name: return pin + return None - def add_pin(self, name: str, is_output: bool = False, execution: bool = False) -> None: + def add_pin(self, name: str, is_output: bool, execution: bool = False) -> None: """ Adds a new pin to the node. diff --git a/node_editor/pin.py b/node_editor/pin.py index 51982b6..4cb1345 100644 --- a/node_editor/pin.py +++ b/node_editor/pin.py @@ -10,7 +10,7 @@ class Pin(Pin_Graphics): def __init__(self, parent: Any, scene: Any) -> None: super().__init__(parent, scene) - self.name: Optional[str] = None + self.name: str = "" self.node: Optional[Any] = None self.connection: Optional[Any] = None self.execution: bool = False diff --git a/pre-commit_check.bat b/pre-commit_check.bat deleted file mode 100644 index e69de29..0000000 diff --git a/pre-commit_check.ps1 b/pre-commit_check.ps1 new file mode 100644 index 0000000..58a5cd2 --- /dev/null +++ b/pre-commit_check.ps1 @@ -0,0 +1,3 @@ +clear-history +clear +pre-commit run --all-files From aa39cf9876c9c453d337ab2e44a18c0e093d7973 Mon Sep 17 00:00:00 2001 From: Bryan Date: Mon, 23 Sep 2024 19:19:13 -0700 Subject: [PATCH 76/88] enabling the widgets on custom nodes --- node_editor/gui/node_graphics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node_editor/gui/node_graphics.py b/node_editor/gui/node_graphics.py index 968ce83..4e5cfcd 100644 --- a/node_editor/gui/node_graphics.py +++ b/node_editor/gui/node_graphics.py @@ -127,7 +127,7 @@ def build(self) -> None: None. """ # configure the widget side of things. We need to get the size of the widget beforebuilding the rest of the node - # self.init_widget() + self.init_widget() self.widget.setStyleSheet("background-color: " + self.node_color.name() + ";") self.title_path = QtGui.QPainterPath() # reset self.type_path = QtGui.QPainterPath() # The path for the type From 624715cc7e809f66f8384c053f5bc12b6d0a091d Mon Sep 17 00:00:00 2001 From: Bryan Date: Mon, 23 Sep 2024 19:19:54 -0700 Subject: [PATCH 77/88] fixing custom list widget items, datatypes for module/class to Any --- node_editor/gui/node_list.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/node_editor/gui/node_list.py b/node_editor/gui/node_list.py index c94d0f3..05624cc 100644 --- a/node_editor/gui/node_list.py +++ b/node_editor/gui/node_list.py @@ -1,6 +1,7 @@ from __future__ import annotations from types import ModuleType +from typing import Any from typing import Dict from typing import Optional from typing import Union @@ -11,8 +12,8 @@ class CustomQListWidgetItem(QtWidgets.QListWidgetItem): # type: ignore - module: str - class_name: str + module: Any + class_name: Any class CustomQMimeData(QtCore.QMimeData): # type: ignore @@ -21,8 +22,8 @@ class CustomQMimeData(QtCore.QMimeData): # type: ignore class ImportData: def __init__(self, module: str, class_: str): - self.module: str = module - self.class_: str = class_ + self.module: Any = module + self.class_: Any = class_ # class NodeList(QtWidgets.QListWidget): # type: ignore @@ -41,7 +42,7 @@ def update_project(self, imports: Dict[str, Dict[str, Union[type, ModuleType]]]) for name, data in imports.items(): name = name.replace("_Node", "") - item = QtWidgets.QListWidgetItem(name) + item = CustomQListWidgetItem(name) item.module = data["module"] item.class_name = data["class"] @@ -49,6 +50,7 @@ def update_project(self, imports: Dict[str, Dict[str, Union[type, ModuleType]]]) def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: item = self.itemAt(event.pos()) + if isinstance(item, CustomQListWidgetItem) and item.text(): name = item.text() @@ -64,4 +66,6 @@ def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: drag.setPixmap(pixmap) drag.exec_() + print("Inside drag event from node list") + super().mousePressEvent(event) From 4aa01c48e76961be7c761c34ad59d2ffb87118d0 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 11:55:20 -0700 Subject: [PATCH 78/88] helper method to get items by type (Node, Connection, etc) --- node_editor/gui/view.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index de10edd..b1c4612 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -1,5 +1,7 @@ from __future__ import annotations +from typing import Any +from typing import List from typing import Optional from PySide6 import QtCore @@ -158,25 +160,12 @@ def contextMenuEvent(self, event: QtGui.QContextMenuEvent) -> None: This method is called when a context menu event is triggered in the view. It finds the item at the event position and shows a context menu if the item is a Node. """ - # cursor = QtGui.QCursor() - # origin = self.mapFromGlobal(cursor.pos()) - # pos = self.mapFromGlobal(cursor.pos()) item = self.itemAt(event.pos()) if item: if isinstance(item, Node): print("Found Node", item) - # menu = QtWidgets.QMenu(self) - - # hello_action = QtWidgets.QAction("Hello", self) - - # menu.addAction(hello_action) - # action = menu.exec_(self.mapToGlobal(pos)) - - # if action == hello_action: - # print("Hello") - def dragEnterEvent(self, e: QtGui.QDragEnterEvent) -> None: """ This method is called when a drag and drop event enters the view. It checks if the mime data format @@ -233,3 +222,11 @@ def mouseMoveEvent(self, event: QtGui.QMouseEvent) -> None: self._pan_start_y = event.y() super().mouseMoveEvent(event) + + def get_items_by_type(self, item_class: type) -> List[Any]: + items = [] + for item in self.scene().items(): + print(f"current item: {item}, class: {item_class}") + if isinstance(item, item_class): + items.append(item) + return items From 13e0a469730f3adc55645c542a2302715d800660 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 11:55:40 -0700 Subject: [PATCH 79/88] ignore project folders --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 1b9bd8d..5fdb523 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,6 @@ temp #vscode settings settings.json + + +*_Project From a4acc73da4444842515d82ec9a6798fdaa0f26f0 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 11:56:10 -0700 Subject: [PATCH 80/88] start imp of exec of graphs --- main.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 50ed969..20ebe1d 100644 --- a/main.py +++ b/main.py @@ -15,8 +15,11 @@ from PySide6 import QtWidgets from PySide6.QtCore import QByteArray # Or from PySide2.QtCore import QByteArray +from node_editor.compute_graph import compute_dag_nodes +from node_editor.connection import Connection from node_editor.gui.node_list import NodeList from node_editor.gui.node_widget import NodeWidget +from node_editor.node import Node logging.basicConfig(level=logging.DEBUG) @@ -74,6 +77,9 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: self.node_list: NodeList = NodeList(self) left_widget = QtWidgets.QWidget() self.splitter: QtWidgets.QSplitter = QtWidgets.QSplitter() + execute_button = QtWidgets.QPushButton("Execute Graph") + execute_button.setFixedHeight(40) + execute_button.clicked.connect(self.execute_graph) self.node_widget: NodeWidget = NodeWidget(self) # Add Widgets to layouts @@ -81,6 +87,7 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: self.splitter.addWidget(self.node_widget) left_widget.setLayout(left_layout) left_layout.addWidget(self.node_list) + left_layout.addWidget(execute_button) main_layout.addWidget(self.splitter) # Load the example project @@ -94,6 +101,17 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: s = settings.value("splitterSize") self.splitter.restoreState(s) + def execute_graph(self) -> None: + print("Executing Graph:") + + # Get a list of the nodes in the view + nodes = self.node_widget.view.get_items_by_type(Node) + edges = self.node_widget.view.get_items_by_type(Connection) + print(nodes) + compute_dag_nodes(nodes, edges) + + # sort them + def save_project(self) -> None: file_dialog = QtWidgets.QFileDialog() file_dialog.setAcceptMode(QtWidgets.QFileDialog.AcceptSave) @@ -152,9 +170,6 @@ def closeEvent(self, event: QtGui.QCloseEvent) -> None: None. """ - # debugging lets save the scene: - # self.node_widget.save_project("C:/Users/Howard/simple-node-editor/Example_Project/test.json") - self.settings = QtCore.QSettings("node-editor", "NodeEditor") self.settings.setValue("geometry", self.saveGeometry()) self.settings.setValue("splitterSize", self.splitter.saveState()) From daa2482e8a165b05d1a1621b8fc6093d5623a032 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 11:56:44 -0700 Subject: [PATCH 81/88] using index instead of hash --- Example_Project/test.json | 62 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/Example_Project/test.json b/Example_Project/test.json index 534fa91..c49432e 100644 --- a/Example_Project/test.json +++ b/Example_Project/test.json @@ -2,63 +2,63 @@ "nodes": [ { "type": "Scaler_Node", - "x": 4733, - "y": 5122, - "uuid": "fb254b28-ef69-4fc1-8619-ed4fd0581689" + "x": 4658, + "y": 5076, + "index": "44880" }, { - "type": "Print_Node", - "x": 5178, - "y": 4946, - "uuid": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4" + "type": "Scaler_Node", + "x": 4643, + "y": 4950, + "index": "15703" }, { - "type": "Scaler_Node", - "x": 4740, - "y": 5013, - "uuid": "99788e6a-af8c-4b31-bdc3-b7c275743bb2" + "type": "Print_Node", + "x": 5140, + "y": 4866, + "index": "14585" }, { "type": "Button_Node", - "x": 4734, - "y": 4894, - "uuid": "32fa39d4-d90b-46ea-bcec-bbb52f12e217" + "x": 4606, + "y": 4838, + "index": "28477" }, { "type": "Add_Node", - "x": 4974, - "y": 4947, - "uuid": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b" + "x": 4903, + "y": 4898, + "index": "76247" } ], "connections": [ { - "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "end_id": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4", - "start_pin": "output", - "end_pin": "input" - }, - { - "start_id": "fb254b28-ef69-4fc1-8619-ed4fd0581689", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_id": "44880", + "end_id": "76247", "start_pin": "value", "end_pin": "input B" }, { - "start_id": "99788e6a-af8c-4b31-bdc3-b7c275743bb2", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_id": "15703", + "end_id": "76247", "start_pin": "value", "end_pin": "input A" }, { - "start_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", - "end_id": "4d4c8ab7-4047-4d3c-a00d-afec8d2d2ab4", + "start_id": "76247", + "end_id": "14585", + "start_pin": "output", + "end_pin": "input" + }, + { + "start_id": "76247", + "end_id": "14585", "start_pin": "Ex Out", "end_pin": "Ex In" }, { - "start_id": "32fa39d4-d90b-46ea-bcec-bbb52f12e217", - "end_id": "0a3b1313-e73c-4f3a-b878-7a7a8a76518b", + "start_id": "28477", + "end_id": "76247", "start_pin": "Ex Out", "end_pin": "Ex In" } From 8e8a854a3ce726b516fff3303d179797cc37103d Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 11:57:11 -0700 Subject: [PATCH 82/88] start of computing DAG graphs --- node_editor/compute_graph.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 node_editor/compute_graph.py diff --git a/node_editor/compute_graph.py b/node_editor/compute_graph.py new file mode 100644 index 0000000..82f75d6 --- /dev/null +++ b/node_editor/compute_graph.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +from typing import Any +from typing import List + +from node_editor.connection import Connection +from node_editor.node import Node + + +def compute_dag_nodes(nodes: List[Node], edges: List[Connection]) -> None: + print("Compute DAG Nodes") + + num_nodes = len(nodes) + num_connections = len(edges) + + print(f"Number of nodes: {num_nodes}, Number of connections: {num_connections}") + + # Get the edges + + # Adjacency List + adj: List[Any] = [[] for _ in range(num_nodes)] + print(adj) + + for node in nodes: + print(node) From e551e53870e0594f8b9d5b60307fe4efddc57a58 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 11:58:01 -0700 Subject: [PATCH 83/88] replacing hashes with indexes for nodes. Should keep thing more simple when sorting graphs --- node_editor/gui/node_graphics.py | 9 +++++-- node_editor/gui/node_widget.py | 46 +++++++++++++++++--------------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/node_editor/gui/node_graphics.py b/node_editor/gui/node_graphics.py index 4e5cfcd..dc0958c 100644 --- a/node_editor/gui/node_graphics.py +++ b/node_editor/gui/node_graphics.py @@ -1,6 +1,5 @@ from __future__ import annotations -import uuid from typing import List from typing import Optional from typing import Tuple @@ -34,7 +33,7 @@ def __init__(self) -> None: self._width = 20 # The Width of the node self._height = 20 # the height of the node self._pins: List[Pin] = [] # A list of pins - self.uuid: uuid.UUID # An identifier to used when saving and loading the scene + self.index: int # An identifier to used when saving and loading the scene self.node_color = QtGui.QColor(20, 20, 20, 200) @@ -158,6 +157,9 @@ def build(self) -> None: if dim > total_width: total_width = dim + # Add the width for the pins + total_width += self.horizontal_margin # Increased width for spacing + # Add both the title and type height together for the total height # total_height = sum([title_dim["h"], title_type_dim["h"]]) + self.widget.size().height() total_height = bg_height + self.widget.size().height() @@ -218,6 +220,9 @@ def build(self) -> None: f"{self.type_text}", ) + # Position the widget in the center + self.widget.move(int(-self.widget.size().width() / 2), int(-self.widget.size().height() / 2)) + # Position the pins. Execution pins stay on the same row if pin_dim: # y = (-total_height / 2) + title_dim["h"] + title_type_dim["h"] + 5 diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index 414e8d2..2a414e0 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -1,7 +1,7 @@ from __future__ import annotations import json -import uuid +import random from typing import Any from typing import Dict from typing import List @@ -49,7 +49,7 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: """ super().__init__(parent) - self.node_lookup: Dict[uuid.UUID, Node] = ( + self.node_lookup: Dict[int, Node] = ( {} ) # A dictionary of nodes, by uuids for faster looking up. Refactor this in the future main_layout = QtWidgets.QVBoxLayout() @@ -68,7 +68,7 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: self.view.request_node.connect(self.create_node) def create_node(self, node: Node) -> None: - node.uuid = uuid.uuid4() + node.index = random.randint(1, 99999) self.scene.addItem(node) pos = self.view.mapFromGlobal(QtGui.QCursor.pos()) node.setPos(self.view.mapToScene(pos)) @@ -85,23 +85,27 @@ def load_scene(self, json_path: str, imports: Dict[str, Dict[str, Node]]) -> Non # Add the nodes if data: for node in data["nodes"]: - info = imports[node["type"]] + try: + info = imports[node["type"]] + except KeyError: + continue node_item = info["class"]() - node_item.uuid = node["uuid"] + node_item.index = node["index"] self.scene.addItem(node_item) node_item.setPos(node["x"], node["y"]) - self.node_lookup[node["uuid"]] = node_item + self.node_lookup[node["index"]] = node_item # Add the connections for c in data["connections"]: connection = Connection(None) self.scene.addItem(connection) - start_pin = self.node_lookup[c["start_id"]].get_pin(c["start_pin"]) - end_pin = self.node_lookup[c["end_id"]].get_pin(c["end_pin"]) - - print("start_pin", start_pin) + try: + start_pin = self.node_lookup[c["start_id"]].get_pin(c["start_pin"]) + end_pin = self.node_lookup[c["end_id"]].get_pin(c["end_pin"]) + except KeyError: # Node might be missing so we skip it + continue if start_pin: connection.set_start_pin(start_pin) @@ -114,7 +118,7 @@ def save_project(self, json_path: str) -> None: # from collections import OrderedDict # TODO possibly an ordered dict so things stay in order (better for git changes, and manual editing) - # Maybe connections will need a uuid for each so they can be sorted and kept in order. + # Maybe connections will need an index for each so they can be sorted and kept in order. scene: Dict[str, List[Any]] = {"nodes": [], "connections": []} # Need the nodes, and connections of ports to nodes @@ -123,15 +127,13 @@ def save_project(self, json_path: str) -> None: if isinstance(item, Connection): # print(f"Name: {item}") nodes = item.nodes() - print(f"length of nodes: {len(nodes)}") - - if isinstance(nodes[0], Node): - start_id = str(nodes[0].uuid) - if isinstance(nodes[1], Node): - end_id = str(nodes[1].uuid) - if isinstance(item, Pin): - start_pin = item.start_pin.name() - end_pin = item.end_pin.name() + if nodes[0]: + start_id = str(nodes[0].index) + else: + continue + end_id = str(nodes[1].index) # type: ignore + start_pin = item.start_pin.name # type: ignore + end_pin = item.end_pin.name # type: ignore # print(f"Node ids {start_id, end_id}") # print(f"connected ports {item.start_pin.name(), item.end_pin.name()}") @@ -158,9 +160,9 @@ def save_project(self, json_path: str) -> None: obj_type = type(item).__name__ # print(f"node type: {obj_type}") - node_id = str(item.uuid) + node_id = str(item.index) - node = {"type": obj_type, "x": x, "y": y, "uuid": node_id} + node = {"type": obj_type, "x": x, "y": y, "index": node_id} scene["nodes"].append(node) # Write the items_info dictionary to a JSON file From ab458333c8177faaf30263750596d1f44638a027 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 15:38:50 -0700 Subject: [PATCH 84/88] node id's are in order, not random, start at 0 --- Example_Project/test.json | 50 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/Example_Project/test.json b/Example_Project/test.json index c49432e..5f4aee2 100644 --- a/Example_Project/test.json +++ b/Example_Project/test.json @@ -2,63 +2,63 @@ "nodes": [ { "type": "Scaler_Node", - "x": 4658, - "y": 5076, - "index": "44880" + "x": 4765, + "y": 5098, + "index": "4" }, { "type": "Scaler_Node", - "x": 4643, - "y": 4950, - "index": "15703" + "x": 4752, + "y": 5000, + "index": "3" }, { "type": "Print_Node", - "x": 5140, - "y": 4866, - "index": "14585" + "x": 5121, + "y": 4905, + "index": "2" }, { "type": "Button_Node", - "x": 4606, - "y": 4838, - "index": "28477" + "x": 4777, + "y": 4894, + "index": "1" }, { "type": "Add_Node", - "x": 4903, - "y": 4898, - "index": "76247" + "x": 4971, + "y": 4955, + "index": "0" } ], "connections": [ { - "start_id": "44880", - "end_id": "76247", + "start_id": "4", + "end_id": "0", "start_pin": "value", "end_pin": "input B" }, { - "start_id": "15703", - "end_id": "76247", + "start_id": "3", + "end_id": "0", "start_pin": "value", "end_pin": "input A" }, { - "start_id": "76247", - "end_id": "14585", + "start_id": "0", + "end_id": "2", "start_pin": "output", "end_pin": "input" }, { - "start_id": "76247", - "end_id": "14585", + "start_id": "0", + "end_id": "2", "start_pin": "Ex Out", "end_pin": "Ex In" }, { - "start_id": "28477", - "end_id": "76247", + "start_id": "1", + "end_id": "0", "start_pin": "Ex Out", "end_pin": "Ex In" } From b4b5cfc5ec6f6f7a9c31872ffb382e2f165a221a Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 15:40:09 -0700 Subject: [PATCH 85/88] added index to request node creation signal --- node_editor/gui/view.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index b1c4612..c30666d 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -27,7 +27,7 @@ class View(QtWidgets.QGraphicsView): # type: ignore _mouse_wheel_zoom_rate: float = 0.0015 - request_node = QtCore.Signal(object) + request_node = QtCore.Signal(object, int) def __init__(self, parent: QtWidgets.QWidget) -> None: super().__init__(parent) @@ -182,7 +182,8 @@ def dropEvent(self, e: QtGui.QDropEvent) -> None: dropped node from the mime data and emits a signal to request the creation of the corresponding node. """ node = e.mimeData().item.class_name - self.request_node.emit(node()) + next_index = self.get_total_nodes() + self.request_node.emit(node(), next_index) def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: """ @@ -230,3 +231,6 @@ def get_items_by_type(self, item_class: type) -> List[Any]: if isinstance(item, item_class): items.append(item) return items + + def get_total_nodes(self) -> int: + return len(self.get_items_by_type(Node)) From 9e82a0a1aae4479ac7ac6c180c4a48f08bfcbcfb Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 15:40:54 -0700 Subject: [PATCH 86/88] node index are the next of the total nodes --- node_editor/gui/node_widget.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index 2a414e0..e73d5ce 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -1,7 +1,6 @@ from __future__ import annotations import json -import random from typing import Any from typing import Dict from typing import List @@ -67,8 +66,8 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None) -> None: self.view.request_node.connect(self.create_node) - def create_node(self, node: Node) -> None: - node.index = random.randint(1, 99999) + def create_node(self, node: Node, index: int) -> None: + node.index = index self.scene.addItem(node) pos = self.view.mapFromGlobal(QtGui.QCursor.pos()) node.setPos(self.view.mapToScene(pos)) From 5bf98f81e88b39b7424a8049e3dc53453feb05b8 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 15:41:28 -0700 Subject: [PATCH 87/88] topological sorting order functions --- node_editor/compute_graph.py | 61 ++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/node_editor/compute_graph.py b/node_editor/compute_graph.py index 82f75d6..a4a482c 100644 --- a/node_editor/compute_graph.py +++ b/node_editor/compute_graph.py @@ -1,25 +1,66 @@ from __future__ import annotations -from typing import Any from typing import List from node_editor.connection import Connection from node_editor.node import Node -def compute_dag_nodes(nodes: List[Node], edges: List[Connection]) -> None: - print("Compute DAG Nodes") +def topologicalSortUtil(v: int, adj: List[List[int]], visited: List[bool], stack: List[int]) -> None: + # Mark the current node as visited + visited[v] = True - num_nodes = len(nodes) - num_connections = len(edges) + # Recur for all adjacent vertices + for i in adj[v]: + if not visited[i]: + topologicalSortUtil(i, adj, visited, stack) + + # Push current vertex to stack which stores the result + stack.append(v) + + +# Function to perform Topological Sort +def topologicalSort(adj: List[List[int]], num_nodes: int) -> List[int]: + # Stack to store the result + stack: List[int] = [] + + visited = [False] * num_nodes + + # Call the recursive helper function to store + # Topological Sort starting from all vertices one by + # one + for i in range(num_nodes): + if not visited[i]: + topologicalSortUtil(i, adj, visited, stack) + + # Print contents of stack + print("Topological sorting of the graph:", end=" ") - print(f"Number of nodes: {num_nodes}, Number of connections: {num_connections}") + topological_order = [] + while stack: + # print(stack.pop(), end=" ") + topological_order.append(stack.pop()) + return topological_order + + +def compute_dag_nodes(nodes: List[Node], connections: List[Connection]) -> None: + print("Compute DAG Nodes") + + num_nodes = len(nodes) # Get the edges + edges = [] + for connection in connections: + edges.append([int(node.index) for node in connection.nodes() if node is not None]) # Adjacency List - adj: List[Any] = [[] for _ in range(num_nodes)] - print(adj) + adjacency: List[List[int]] = [[] for _ in range(num_nodes)] + + for edge in edges: + adjacency[edge[0]].append(edge[1]) + + print("adjacency:\n\n", adjacency) + + topological_order = topologicalSort(adjacency, num_nodes) - for node in nodes: - print(node) + print(topological_order) From c9fd5d6b5196ecf3ed74eb284b7703fcc3790608 Mon Sep 17 00:00:00 2001 From: Bryan Date: Thu, 26 Sep 2024 17:10:18 -0700 Subject: [PATCH 88/88] moved the deletion of nodes to be in the scene object. When deleting nodes, the remaining nodes indexes get reordered --- main.py | 8 +++----- node_editor/gui/node_editor.py | 7 +++++-- node_editor/gui/node_widget.py | 30 ++++++++++++++++++++++++++++++ node_editor/gui/view.py | 15 +-------------- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/main.py b/main.py index 20ebe1d..b23ac46 100644 --- a/main.py +++ b/main.py @@ -105,12 +105,10 @@ def execute_graph(self) -> None: print("Executing Graph:") # Get a list of the nodes in the view - nodes = self.node_widget.view.get_items_by_type(Node) - edges = self.node_widget.view.get_items_by_type(Connection) - print(nodes) - compute_dag_nodes(nodes, edges) - + nodes = self.node_widget.scene.get_items_by_type(Node) + edges = self.node_widget.scene.get_items_by_type(Connection) # sort them + compute_dag_nodes(nodes, edges) def save_project(self) -> None: file_dialog = QtWidgets.QFileDialog() diff --git a/node_editor/gui/node_editor.py b/node_editor/gui/node_editor.py index 8ff5a54..9963d04 100644 --- a/node_editor/gui/node_editor.py +++ b/node_editor/gui/node_editor.py @@ -98,6 +98,7 @@ def eventFilter(self, watched: QtCore.QObject, event: QtCore.QEvent) -> bool: return True if isinstance(item, Connection): + print("selected a Connection") self.connection = Connection(None) self.connection.start_pos = item.start_pos self.scene.addItem(self.connection) @@ -124,8 +125,10 @@ def eventFilter(self, watched: QtCore.QObject, event: QtCore.QEvent) -> bool: elif event.type() == QtCore.QEvent.KeyPress: if event.key() == QtCore.Qt.Key_Delete: for item in self.scene.selectedItems(): - if isinstance(item, (Connection, Node)): - item.delete() + if isinstance(item, Connection): + self.scene.delete_connection(item) + elif isinstance(item, Node): + self.scene.delete_node_and_reorder(item) return True diff --git a/node_editor/gui/node_widget.py b/node_editor/gui/node_widget.py index e73d5ce..6390aef 100644 --- a/node_editor/gui/node_widget.py +++ b/node_editor/gui/node_widget.py @@ -28,6 +28,36 @@ def dropEvent(self, e: QtGui.QDropEvent) -> None: def dragMoveEvent(self, e: QtGui.QDragMoveEvent) -> None: e.acceptProposedAction() + def get_items_by_type(self, item_class: type) -> List[Any]: + items = [] + for item in self.items(): + print(f"current item: {item}, class: {item_class}") + if isinstance(item, item_class): + items.append(item) + return items + + def get_total_nodes(self) -> int: + return len(self.get_items_by_type(Node)) + + # TODO Scene should delete the node + # TODO Scene should reorder Node indexes after Node delete + + def delete_node_and_reorder(self, node_to_delete: Node) -> None: + # Delete the node + node_to_delete.delete() + + # Make a mapping of the new indexes for the nodes + nodes = self.get_items_by_type(Node) + new_index_mapping = {node.index: new_index for new_index, node in enumerate(nodes)} + + # Reindex the nodes + for node in nodes: + node.index = new_index_mapping[str(node.index)] + + def delete_connection(self, connection_to_delete: Connection) -> None: + # We an safly delete a connection without having to do anything extra + connection_to_delete.delete() + class NodeWidget(QtWidgets.QWidget): # type: ignore """ diff --git a/node_editor/gui/view.py b/node_editor/gui/view.py index c30666d..2a41e04 100644 --- a/node_editor/gui/view.py +++ b/node_editor/gui/view.py @@ -1,7 +1,5 @@ from __future__ import annotations -from typing import Any -from typing import List from typing import Optional from PySide6 import QtCore @@ -182,7 +180,7 @@ def dropEvent(self, e: QtGui.QDropEvent) -> None: dropped node from the mime data and emits a signal to request the creation of the corresponding node. """ node = e.mimeData().item.class_name - next_index = self.get_total_nodes() + next_index = self.scene().get_total_nodes() self.request_node.emit(node(), next_index) def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: @@ -223,14 +221,3 @@ def mouseMoveEvent(self, event: QtGui.QMouseEvent) -> None: self._pan_start_y = event.y() super().mouseMoveEvent(event) - - def get_items_by_type(self, item_class: type) -> List[Any]: - items = [] - for item in self.scene().items(): - print(f"current item: {item}, class: {item_class}") - if isinstance(item, item_class): - items.append(item) - return items - - def get_total_nodes(self) -> int: - return len(self.get_items_by_type(Node))