Skip to content
Snippets Groups Projects
arrow.py 2.56 KiB
Newer Older
  • Learn to ignore specific revisions
  • Oscar Gustafsson's avatar
    Oscar Gustafsson committed
    from qtpy.QtCore import QLineF, Qt
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
    from qtpy.QtGui import QPen
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
    from qtpy.QtWidgets import QGraphicsLineItem, QMenu
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
    
    
    class Arrow(QGraphicsLineItem):
        def __init__(self, source, destination, window, signal=None, parent=None):
    
            super().__init__(parent)
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
            if signal is None:
                signal = Signal(source.port, destination.port)
            self.signal = signal
    
            self.destination = destination
            self._window = window
            self.moveLine()
            self.source.moved.connect(self.moveLine)
            self.destination.moved.connect(self.moveLine)
    
        def contextMenuEvent(self, event):
            menu = QMenu()
            menu.addAction("Delete", self.remove)
            menu.exec_(self.cursor().pos())
    
        def remove(self):
            self.signal.remove_destination()
            self.signal.remove_source()
            self._window.scene.removeItem(self)
            if self in self._window.signalList:
                self._window.signalList.remove(self)
    
            if self in self._window.signalPortDict:
                for port1, port2 in self._window.signalPortDict[self]:
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
                    for (
                        operation,
                        operation_ports,
                    ) in self._window.portDict.items():
                        if (
                            port1 in operation_ports or port2 in operation_ports
                        ) and operation in self._window.opToSFG:
                            self._window.logger.info(
                                "Operation detected in existing SFG, removing SFG"
                                " with name:"
                                f" {self._window.opToSFG[operation].name}."
                            )
                            del self._window.sfg_dict[
                                self._window.opToSFG[operation].name
                            ]
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
                            self._window.opToSFG = {
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
                                op: self._window.opToSFG[op]
                                for op in self._window.opToSFG
                                if self._window.opToSFG[op]
                                is not self._window.opToSFG[operation]
                            }
    
    
            del self._window.signalPortDict[self]
    
        def moveLine(self):
            self.setPen(QPen(Qt.black, 3))
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
            self.setLine(
                QLineF(
                    self.source.operation.x() + self.source.x() + 14,
                    self.source.operation.y() + self.source.y() + 7.5,
                    self.destination.operation.x() + self.destination.x(),
                    self.destination.operation.y() + self.destination.y() + 7.5,
                )
            )