Newer
Older

Felix Goding
committed
"""@package docstring
Drag button class.
This class creates a dragbutton which can be clicked, dragged and dropped.
"""
import os.path

Adam Jakobsson
committed
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtCore import Qt, QSize

Felix Goding
committed
from PyQt5.QtGui import QIcon
from utils import decorate_class, handle_error

Felix Goding
committed

Felix Goding
committed
class DragButton(QPushButton):
def __init__(self, name, operation, operation_path_name, window, parent = None):
self.name = name

Felix Goding
committed
self.operation = operation
self.operation_path_name = operation_path_name
self.clicked = 0
self.pressed = False
super(DragButton, self).__init__(self._window)

Felix Goding
committed
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:

Felix Goding
committed
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)

Felix Goding
committed
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)

Felix Goding
committed
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

Felix Goding
committed
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()