Skip to content
Snippets Groups Projects
drag_button.py 2.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • """@package docstring
    Drag button class.
    This class creates a dragbutton which can be clicked, dragged and dropped.
    """
    
    import os.path
    
    
    from PyQt5.QtWidgets import QPushButton
    from PyQt5.QtCore import Qt, QSize
    
    from utils import decorate_class, handle_error
    
    
    @decorate_class(handle_error)
    
    class DragButton(QPushButton):
        def __init__(self, name, operation, operation_path_name, window, parent = None):
            self.name = name
    
            self._window = window
    
            self.operation = operation
            self.operation_path_name = operation_path_name
            self.clicked = 0
            self.pressed = False
    
            super(DragButton, self).__init__(self._window)
    
    
        def mousePressEvent(self, event):
            self._mouse_press_pos = None
            self._mouse_move_pos = None
    
            if event.button() == Qt.LeftButton:
                self._mouse_press_pos = event.globalPos()
                self._mouse_move_pos = event.globalPos()
    
    
                for signal in self._window.signalList:
    
                    signal.update()
    
                self.clicked += 1
                if self.clicked == 1:
                    self.pressed = True
                    self.setStyleSheet("background-color: grey; border-style: solid;\
                    border-color: black; border-width: 2px; border-radius: 10px")
                    path_to_image = os.path.join('operation_icons', self.operation_path_name + '_grey.png')
                    self.setIcon(QIcon(path_to_image))
                    self.setIconSize(QSize(50, 50))
    
                    self._window.pressed_button.append(self)
    
    
                elif self.clicked == 2:
                    self.clicked = 0
                    self.pressed = False
                    self.setStyleSheet("background-color: white; border-style: solid;\
                    border-color: black; border-width: 2px; border-radius: 10px")
                    path_to_image = os.path.join('operation_icons', self.operation_path_name + '.png')
                    self.setIcon(QIcon(path_to_image))
                    self.setIconSize(QSize(50, 50))
    
                    self._window.pressed_button.remove(self)
    
    
            super(DragButton, self).mousePressEvent(event)
    
        def mouseMoveEvent(self, event):
            if event.buttons() == Qt.LeftButton:
                cur_pos = self.mapToGlobal(self.pos())
                global_pos = event.globalPos()
                diff = global_pos - self._mouse_move_pos
                new_pos = self.mapFromGlobal(cur_pos + diff)
                self.move(new_pos)
    
                self._mouse_move_pos = global_pos
    
    
            self._window.update()
    
            super(DragButton, self).mouseMoveEvent(event)
    
        def mouseReleaseEvent(self, event):
            if self._mouse_press_pos is not None:
                moved = event.globalPos() - self._mouse_press_pos
                if moved.manhattanLength() > 3:
                    event.ignore()
                    return
    
            super(DragButton, self).mouseReleaseEvent(event)
    
        def remove(self):
            self.deleteLater()