def _RemoveFromScene(self): if not self.scene().selectedItems(): logger.debug("no items to delete") return edgeIdRemove: typing.Set[str] = set() nodeIdRemove: typing.Set[str] = set() for item in self.scene().selectedItems(): if isinstance(item, JGraphicNode): nodeIdRemove.add(item.nodeId) for socket in item.socketManager.socketList: edgeIdRemove |= set(socket.edgeList) elif isinstance(item, JGraphicEdge): edgeIdRemove.add(item.edgeId) else: logger.debug( f"unknown item selected in delete type {type(item)}") logger.debug(f"nodes marked for removal {nodeIdRemove}") logger.debug(f"edges marked for removal {edgeIdRemove}") self._sceneManager.undoStack.beginMacro("remove item") # * first always remove edges, easier to implement undo stack! self._RemoveEdgesFromScene(edgeIdRemove) self._RemoveNodesFromScene(nodeIdRemove) self._sceneManager.undoStack.endMacro()
def mousePressEvent(self, event: QtGui.QMouseEvent): # * pan view if event.button() == QtCore.Qt.RightButton: self._currentState = JCONSTANTS.GRVIEW.OP_MODE_PAN_VIEW self.prevPos = event.pos() self.setCursor(QtCore.Qt.ClosedHandCursor) self.setInteractive(False) # * Rubber band selection elif (event.button() == QtCore.Qt.LeftButton and event.modifiers() == QtCore.Qt.NoModifier and self.scene().itemAt(self.mapToScene(event.pos()), QtGui.QTransform()) is None): self._currentState = JCONSTANTS.GRVIEW.OP_MODE_SELECTION self._InitRubberband(event.pos()) self.setInteractive(False) # * start edge drag elif (event.button() == QtCore.Qt.LeftButton and self._currentState == JCONSTANTS.GRVIEW.OP_MODE_DEFAULT and isinstance( self.scene().itemAt(self.mapToScene(event.pos()), QtGui.QTransform()), JGraphicSocket, )): self._currentState = JCONSTANTS.GRVIEW.OP_MODE_EDGE_DRAG self._StartEdgeDrag(self.scene().itemAt( self.mapToScene(event.pos()), QtGui.QTransform())) # * end edge drag elif (event.button() == QtCore.Qt.LeftButton and self._currentState == JCONSTANTS.GRVIEW.OP_MODE_EDGE_DRAG): self._EndEdgeDrag(self.scene().itemAt(self.mapToScene(event.pos()), QtGui.QTransform())) # * debug elif event.button() == QtCore.Qt.MidButton: logger.debug("items in scene") for item in self.scene().items(): if isinstance(item, (JGraphicEdge, JGraphicNode, JGraphicSocket)): logger.debug(item) super().mousePressEvent(event)
def _RemoveNodeFromScene(self, nodeId: str): node_ = list( filter( lambda node: isinstance(node, JGraphicNode) and node.nodeId == nodeId, self.scene().items(), )) assert len(node_) == 1, logger.error( f"error fetching node {nodeId} for removal") node__ = node_[0] assert isinstance(node__, JGraphicNode) self.scene().removeItem(node__) logger.debug(f"remove node {nodeId}") self._sceneManager.undoStack.beginMacro("remove node") self._sceneManager.undoStack.push( NodeRemoveCommand(graphicScene=self._sceneManager.graphicsScene, node=node__)) self._sceneManager.undoStack.endMacro()
def _RemoveEdgeFromScene(self, edgeId: str): edge_ = list( filter( lambda edge: isinstance(edge, JGraphicEdge) and edge.edgeId == edgeId, self.scene().items(), )) assert len(edge_) == 1, logger.error( f"error fetching node {edgeId} for removal") edge__ = edge_[0] assert isinstance(edge__, JGraphicEdge) edge__.DisconnectFromSockets() logger.debug(f"remove edge {edgeId}") self.scene().removeItem(edge__) self._sceneManager.undoStack.beginMacro("remove edge") self._sceneManager.undoStack.push( EdgeRemoveCommand(graphicScene=self._sceneManager.graphicsScene, edge=edge__)) self._sceneManager.undoStack.endMacro()
def SaveToFile(self): logger.debug("saving to file") with open("graph.json", "w") as file: json.dump(obj=self.Serialize(), fp=file)
def LoadFromFile(self) -> Dict: logger.debug("loading from file") with open("graph.json", "r") as file: data = json.load(file) return data