class NodeGraphScene(QtGui.QGraphicsScene): ''' ''' def __init__(self): super(NodeGraphScene, self).__init__() #Keep a dictionary of nodes. self.nodeDict = {} #Register a dispatcher object to talk with other widgets. self.dispatcher = Dispatcher(self) self.signalMapperParam = QtCore.QSignalMapper(self) self.signalMapperView = QtCore.QSignalMapper(self) self.signalMapperView.mapped[str].connect(self.dispatcher.initViewer) self.signalMapperParam.mapped[str].connect(self.dispatcher.swapParams) #SR = self.sceneRect() #SR.adjust(500, 500, 500, 500) #self.setSceneRect(SR) @QtCore.Slot(str) def sendUpdate(self, changedNode): self.dispatcher.updateQ(changedNode) def addNode(self, pos=(50, 50), name=NODE_DEFAULT_NAME): #Create node obj newNode = Node(name=name) newNode.setPos(pos[0], pos[1]) newNode.update() #Add to scene self.addItem(newNode) self.nodeDict[name] = weakref.ref(newNode) #Reigster params with dispatcher self.dispatcher.registerParams(name, newNode.params) #Connect switches with signalmapper self.signalMapperParam.setMapping(newNode.editSwitch.switchObj, unicode(name)) self.signalMapperView.setMapping(newNode.viewSwitch.switchObj, unicode(name)) newNode.editSwitch.switchObj.toggleSignal.connect(self.signalMapperParam.map) newNode.viewSwitch.switchObj.toggleSignal.connect(self.signalMapperView.map) #Connect paramchanged with DAG update newNode.nodeObj.paramChSignal.connect(self.sendUpdate) return newNode def addEdge(self, outPort, inPort): '''Connect two nodes with an edge.''' #TODO - make this not stupid if outPort in self.items() \ and inPort in self.items(): newEdge = Edge() self.addItem(newEdge) newEdge.outPort = weakref.ref(outPort) newEdge.inPort = weakref.ref(inPort) outPort.connectedEdges.append(weakref.ref(newEdge)) inPort.connectedEdges.append(weakref.ref(newEdge)) newEdge.adjust() return newEdge else: raise ValueError("Port not found.") def deleteNodes(self, nodeList=[]): self.detachNodes(nodeList) for node in nodeList: if node in self.items(): self.removeItem(node) del self.nodeDict[node.name] def detachNodes(self, nodeList=[]): for node in nodeList: if node in self.items(): for port in node.portIter(): if len(port.connectedEdges): for edge in port.connectedEdges: self.removeItem(edge()) port.connectedEdges = [] else: raise ValueError("Node not found: " + node) def clearScene(self): self.deleteNodes(self.nodeDict.items()) @QtCore.Slot() def editSelNodes(self): for node in self.selectedItems(): node.editSwitch.toggle() @QtCore.Slot() def viewSelNodes(self): for node in self.selectedItems(): node.viewSwitch.toggle() @QtCore.Slot() def extractNode(self): self.detachNodes(self.selectedItems()) @QtCore.Slot() def ignoreNode(self): for node in self.selectedItems(): node.toggleIgnored()
class NodeGraphScene(QtGui.QGraphicsScene): ''' ''' def __init__(self): super(NodeGraphScene, self).__init__() #Keep a dictionary of nodes. self.nodeDict = {} #Register a dispatcher object to talk with other widgets. self.dispatcher = Dispatcher(self) self.signalMapperParam = QtCore.QSignalMapper(self) self.signalMapperView = QtCore.QSignalMapper(self) self.signalMapperView.mapped[str].connect(self.dispatcher.initViewer) self.signalMapperParam.mapped[str].connect(self.dispatcher.swapParams) def adjustSceneRect(self): itemsRect = self.itemsBoundingRect() itemsRect.adjust(20, 20, 20, 20) return itemsRect #self.setSceneRect(itemsRect) @QtCore.Slot(str) def sendUpdate(self, changedNode): self.dispatcher.updateQ(changedNode) def addNode(self, pos=(50, 50), name=NODE_DEFAULT_NAME): #Create node obj newNode = Node(name=name) newNode.setPos(pos[0], pos[1]) newNode.update() #Add to scene self.addItem(newNode) self.nodeDict[name] = weakref.ref(newNode) #Reigster params with dispatcher self.dispatcher.registerParams(name, newNode.params) #Connect switches with signalmapper self.signalMapperParam.setMapping(newNode.editSwitch.switchObj, unicode(name)) self.signalMapperView.setMapping(newNode.viewSwitch.switchObj, unicode(name)) newNode.editSwitch.switchObj.toggleSignal.connect(self.signalMapperParam.map) newNode.viewSwitch.switchObj.toggleSignal.connect(self.signalMapperView.map) #Connect paramchanged with DAG update newNode.nodeObj.paramChSignal.connect(self.sendUpdate) #self.adjustSceneRect() return newNode def addEdge(self, outPort, inPort): '''Connect two nodes with an edge.''' #TODO - make this not stupid if outPort in self.items() \ and inPort in self.items(): newEdge = Edge() self.addItem(newEdge) newEdge.outPort = weakref.ref(outPort) newEdge.inPort = weakref.ref(inPort) outPort.connectedEdges.append(weakref.ref(newEdge)) inPort.connectedEdges.append(weakref.ref(newEdge)) newEdge.adjust() return newEdge else: raise ValueError("Port not found.") def deleteNodes(self, nodeList=[]): print nodeList self.detachNodes(nodeList) for node in nodeList: print node if node in self.nodeDict.keys(): self.removeItem(self.nodeDict[node]()) del self.nodeDict[node] def detachNodes(self, nodeList=[]): for node in nodeList: if node in self.nodeDict.keys(): for port in self.nodeDict[node]().portIter(): if len(port.connectedEdges): for edge in port.connectedEdges: self.removeItem(edge()) port.connectedEdges = [] else: raise ValueError("Node not found: " + node.name) def clearScene(self): self.deleteNodes(self.nodeDict.keys()) def loadFromJSON(self, jsonStr): #pp(json.loads(jsonStr)) loadedNodes = [] for name, node in json.loads(jsonStr).iteritems(): newNode = self.addNode(name=name, pos=node["pos"]) for port in node["ports"]: for edge in port["connected"]: try: outNode = self.nodeDict[edge["out"]["node"]] inNode = self.nodeDict[edge["in"]["node"]] outPort = outNode().port(edge["out"]["port"]) inPort = inNode().port(edge["in"]["port"]) except KeyError: print "Node not found, no edge created." continue self.addEdge(outPort, inPort) loadedNodes.append(newNode) return loadedNodes def asJSON(self, nodes=[]): if not nodes: nodes = self.nodeDict.keys() nodesDict = {} for node in nodes: nodesDict[node] = self.nodeDict[node]().asDict() return json.dumps(nodesDict, sort_keys=True, indent=4, separators=(',', ': ')) @QtCore.Slot() def editSelNodes(self): for node in self.selectedItems(): node.editSwitch.toggle() @QtCore.Slot() def viewSelNodes(self): for node in self.selectedItems(): node.viewSwitch.toggle() @QtCore.Slot() def extractNode(self): self.detachNodes(self.selectedItems()) @QtCore.Slot() def ignoreNode(self): for node in self.selectedItems(): node.toggleIgnored()