Skip to content
Snippets Groups Projects
port_button.py 3.36 KiB
Newer Older
  • Learn to ignore specific revisions
  • Oscar Gustafsson's avatar
    Oscar Gustafsson committed
    """
    B-ASIC port button module.
    """
    
    from qtpy.QtCore import QMimeData, Qt, Signal
    from qtpy.QtGui import QDrag
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
    from qtpy.QtWidgets import QMenu, QPushButton
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
        """
        A button corresponding to a port.
    
        Parameters
        ----------
        name
        operation
        port
        window
        parent
        """
    
    
        connectionRequested = Signal(QPushButton)
        moved = Signal()
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
    
    
        def __init__(self, name, operation, port, window, parent=None):
    
            super().__init__(name, parent=operation)
    
            self.pressed = False
            self._window = window
            self.port = port
            self.operation = operation
            self.clicked = 0
            self._m_drag = False
            self._m_press = False
    
            self.setAcceptDrops(True)
            self.setCursor(Qt.ArrowCursor)
    
    
            self.setStyleSheet("background-color: white")
    
            self.connectionRequested.connect(self._window._connect_callback)
    
    
        def contextMenuEvent(self, event):
            menu = QMenu()
            menu.addAction("Connect", lambda: self.connectionRequested.emit(self))
            menu.exec_(self.cursor().pos())
    
        def mousePressEvent(self, event):
    
            if event.button() == Qt.MouseButton.LeftButton:
    
                self._window.mouse_pressed = True
    
            super().mousePressEvent(event)
    
            if (
                event.button() == Qt.MouseButton.LeftButton
                and self._window.mouse_pressed
            ):
                self._window.mouse_pressed = False
                if self._window.mouse_dragging:
                    self._window.mouse_dragging = False
    
            super().mouseReleaseEvent(event)
    
        def mouseMoveEvent(self, event):
            if self._window.mouse_pressed:
                self._window.mouse_draggin = True
                self._window.starting_port = self
                data = QMimeData()
                drag = QDrag(self)
                drag.setMimeData(data)
                drag.exec()
            super().mouseMoveEvent(event)
    
        def dragEnterEvent(self, event):
            event.acceptProposedAction()
            self.update()
            super().dragEnterEvent(event)
    
        def dragLeaveEvent(self, event):
            self.update()
            super().dragLeaveEvent(event)
    
        def dragMoveEvent(self, event):
            event.acceptProposedAction()
            super().dragMoveEvent(event)
    
        def dropEvent(self, event):
            event.acceptProposedAction()
            if self != self._window.starting_port:
                self.select_port(Qt.KeyboardModifier.ControlModifier)
                self._window._connect_callback()
            self.update()
            super().dropEvent(event)
    
    
        def _toggle_port(self, pressed=False):
            self.pressed = not pressed
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
            self.setStyleSheet(
    
    Oscar Gustafsson's avatar
    Oscar Gustafsson committed
                f"background-color: {'white' if not self.pressed else 'grey'}"
            )
    
            if modifiers != Qt.KeyboardModifier.ControlModifier:
    
                for port in self._window.pressed_ports:
                    port._toggle_port(port.pressed)
    
                self._toggle_port(self.pressed)
                self._window.pressed_ports = [self]
    
            else:
                self._toggle_port(self.pressed)
                if self in self._window.pressed_ports:
                    self._window.pressed_ports.remove(self)
                else:
                    self._window.pressed_ports.append(self)
    
            for signal in self._window.signalList:
                signal.update()