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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ main()
- [X] Parameters
- [X] Node Browser.
- [X] Node Parameters.
- [ ] Node Groups & Gizmos
- [X] Node Groups
- [ ] Parameter Promotion.
- [ ] Gizmos
- [ ] Graph Events or Signals
- [ ] Documentation

Expand Down
4 changes: 2 additions & 2 deletions example.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@

import os
from PySide6 import QtWidgets, QtGui
from radium.nodegraph import NodeGraphView
from radium.nodegraph import NodeGraphViewport
from radium.nodegraph import NodeGraphController
from radium.nodegraph import NodePrototype, PortPrototype

os.environ["QT_SCALE_FACTOR"] = "2"

app = QtWidgets.QApplication([])
view = NodeGraphView()
view = NodeGraphViewport()

controller = NodeGraphController()
controller.attachView(view)
Expand Down
23 changes: 11 additions & 12 deletions src/radium/demo/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,19 +57,17 @@ def __init__(self):

self.__current_filename = None
self.__recent_files: typing.List[str] = json.loads(
self.settings.value("recent_files", "[]")
self.settings.value("recent_files", "[]") # noqa
)

self.initMenuBar()
self.initNodes()

self.undo_stack.cleanChanged.connect(self.updateWindowTitle)
self.node_graph_controller.scene.parameterChanged.connect(
self.onParameterChanged
)
self.node_graph_controller.parameterChanged.connect(self.onParameterChanged)

self.node_graph_controller.scene.nodeEdited.connect(self.onNodeEdited)
self.node_graph_controller.scene.nodeSelected.connect(self.onNodeSelected)
self.node_graph_controller.nodeEdited.connect(self.onNodeEdited)
self.node_graph_controller.nodeSelected.connect(self.onNodeSelected)

def onParameterChanged(self, node, parameter, previous, value):
pass
Expand All @@ -91,7 +89,7 @@ def initNodes(self):
self.node_factory.registerPortType(
prototypes.PortType(
"image",
color=(0, 96, 0, 255),
color=(32, 96, 32, 255),
outline_color=(32, 32, 32, 255, 2),
)
)
Expand All @@ -112,6 +110,7 @@ def initNodes(self):
datatype="float",
)
},
color=(64, 64, 96, 255),
)
)
self.node_factory.registerNodeType(
Expand Down Expand Up @@ -262,7 +261,7 @@ def onResetAction(self):
return False

self.__current_filename = None
self.node_graph_controller.scene.clear()
self.node_graph_controller.reset()
self.undo_stack.clear()
self.updateWindowTitle()
return True
Expand Down Expand Up @@ -297,7 +296,7 @@ def onOpenAction(self, *args, filename=None):

self.__storeRecentFile(self.__current_filename)

self.node_graph_controller.scene.loadDict(data, self.node_factory)
self.node_graph_controller.rootScene().loadDict(data, self.node_factory)
self.updateWindowTitle()

def updateWindowTitle(self):
Expand Down Expand Up @@ -337,9 +336,9 @@ def onSaveAction(self, *_, save_as=False):
"last_save_directory", os.path.dirname(self.__current_filename)
)

data = self.node_graph_controller.scene.toDict()
data = self.node_graph_controller.rootScene().toDict()
with open(self.__current_filename, "w") as f:
json.dump(data, f)
json.dump(data, f, indent=2)

self.undo_stack.setClean()
self.__storeRecentFile(self.__current_filename)
Expand All @@ -350,7 +349,7 @@ def onDeleteAction(self):
"""
When the delete action has triggered delete the currently selected nodes.
"""
selection = self.node_graph_controller.scene.selectedNodes()
selection = self.node_graph_controller.activeScene().selectedNodes()
self.undo_stack.beginMacro("Delete Selected Nodes")
for node in selection:
self.node_graph_controller.removeItem(node)
Expand Down
34 changes: 32 additions & 2 deletions src/radium/nodegraph/factory/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,17 @@
import qtawesome

from PySide6 import QtCore, QtGui

from radium.nodegraph.graph.scene.scene import NodeGraphScene
from radium.nodegraph.factory.prototypes import (
NodeType,
PortType,
)

from radium.nodegraph.graph.scene.node_base import NodeDataDict
from radium.nodegraph.graph.scene.group import Group
from radium.nodegraph.graph.scene.node import Node
from radium.nodegraph.graph.scene.backdrop import Backdrop
from radium.nodegraph.graph.scene.port import PortDataDict, Port
from radium.nodegraph.factory.model import NodePrototypeModel
from radium.nodegraph.parameters.parameter import Parameter, ParameterDataDict
Expand All @@ -22,12 +26,31 @@
class NodeFactory(QtCore.QObject):
def __init__(self, parent=None):
super().__init__(parent)
self.__node_types = {}
self.__node_types = {
"Util/Group": NodeType(
name="Group", category="Util", node_class="group", color=(96, 96, 64)
),
"Util/Backdrop": NodeType(
name="Backdrop",
category="Util",
node_class="backdrop",
color=(127, 127, 255, 64),
),
}
self.__port_types = {}
self.__icon_cache = {}

self.__node_classes = {
"default": Node,
"group": Group,
"backdrop": Backdrop,
}

self.node_types_model = NodePrototypeModel()

for node_type in self.__node_types.values():
self.node_types_model.addPrototype(node_type)

def registerPortType(self, port_type: PortType, exists_ok=False):
if port_type.type_name in self.__port_types:
if not exists_ok:
Expand Down Expand Up @@ -57,6 +80,10 @@ def hasPortType(self, name: str) -> bool:
def getPortType(self, name):
return self.__port_types.get(name)

def createGroup(self, name: str = None):
name = name or "Group"
return Group(self, NodeGraphScene(), name)

def cloneNode(self, node: Node) -> Node:
data = node.toDict()
data["unique_id"] = uuid.uuid4().hex
Expand All @@ -66,14 +93,17 @@ def createNode(self, node_type_name: str, data: NodeDataDict = None):
node_type = self.getNodeType(node_type_name)

if node_type is None:
cls = Node

if "/" in node_type_name:
name = node_type_name[node_type_name.rindex("/") :]
else:
name = node_type_name
else:
name = node_type.name
cls = self.__node_classes[node_type.node_class]

instance = Node(self, node_type_name, name=name)
instance = cls(self, node_type_name, name=name)

if node_type is not None:
applyItemStyle(node_type, instance)
Expand Down
1 change: 1 addition & 0 deletions src/radium/nodegraph/factory/prototypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,4 @@ def type_name(self) -> str:
outputs: typing.Dict[str, str] = dataclasses.field(default_factory=dict)

icon: str = "fa5s.toolbox"
node_class: str = "default"
Loading