Exemple #1
0
class Piece(QWidget):
    def __init__(self, type, parent=None):
        super().__init__(parent)
        self.__type = type
        self.setFixedSize(100 * variables.SCALE, 91 * variables.SCALE)
        self.__section = 7
        self.main_label = QLabel(self)
        self._pixmap = None
        self._selected_pixmap = None
        self.__timer = None
        self.__selected = False
        self.setMouseTracking(True)
        self.__init_main_label()

    def __init_main_label(self):
        if "star_" in self.__type:
            self._pixmap = QPixmap(PATH + os.sep + "assets" + os.sep + "{}.png".format(self.__type[5:]))\
                .scaled(100*variables.SCALE, 91*variables.SCALE, Qt.KeepAspectRatio)
            self._selected_pixmap = QPixmap(PATH + os.sep + "assets" + os.sep +
                                            "{}_selected.png".format(self.__type[5:]))\
                .scaled(100*variables.SCALE, 91*variables.SCALE, Qt.KeepAspectRatio)
            self.__star_label = QLabel(self)
            self.__star_pixmap = QPixmap(PATH + os.sep + "assets" + os.sep + "tiny_star.png")\
                .scaled(variables.STAR_SIZE*variables.SCALE, variables.STAR_SIZE*variables.SCALE, Qt.KeepAspectRatio)
            self.__star_label.setPixmap(self.__star_pixmap)
            self.__star_label.move(
                (50 - variables.STAR_SIZE * variables.SCALE / 2) *
                variables.SCALE,
                (46 - variables.STAR_SIZE * variables.SCALE / 2) *
                variables.SCALE)
            self.__star_label.setMouseTracking(True)
        else:
            self._pixmap = QPixmap(PATH + os.sep + "assets" + os.sep + "{}.png".format(self.__type))\
                .scaled(100*variables.SCALE, 91*variables.SCALE, Qt.KeepAspectRatio)
            self._selected_pixmap = QPixmap(PATH + os.sep + "assets" + os.sep + "{}_selected.png".format(self.__type))\
                .scaled(100*variables.SCALE, 91*variables.SCALE, Qt.KeepAspectRatio)
        self.main_label.setPixmap(self._pixmap)
        self.main_label.setMask(self._pixmap.mask())
        self.setMask(self.main_label.mask())
        self.main_label.setFixedSize(100 * variables.SCALE,
                                     91 * variables.SCALE)
        self.main_label.show()
        self.main_label.setMouseTracking(True)

    @property
    def selected(self):
        return self.__selected

    @selected.setter
    def selected(self, value):
        self.__set_selected(value)

    def __set_selected(self, selected):
        self.__selected = selected
        if selected:
            self.main_label.setPixmap(self._selected_pixmap)
        else:
            self.main_label.setPixmap(self._pixmap)

    def leaveEvent(self, event):
        self.__section = 7

    def mousePressEvent(self, QMouseEvent):
        self.parent().pieceClickedSignal.emit(
            PieceClickedEvent(self.column, self.row, self.__section, self))
        QMouseEvent.accept()

    def mouseMoveEvent(self, event):
        v1 = event.y() - 45 * variables.SCALE
        v2 = event.x() - 46.3 * variables.SCALE
        u1 = 45 * variables.SCALE
        u2 = 75 * variables.SCALE

        numerator = abs(u1 * v1 + u2 * v2)
        denominator = math.sqrt(u1**2 + u2**2) * math.sqrt(v1**2 + v2**2)
        if denominator != 0:
            angle = math.degrees(math.acos(numerator / denominator))

            if (45 / 75) * event.x() + 15 * variables.SCALE >= event.y():
                if (-75 / 45) * event.x() + 128.33 * variables.SCALE < event.y(
                ):
                    angle = 180 - angle
            else:
                if (-75 / 45
                    ) * event.x() + 128.33 * variables.SCALE >= event.y():
                    angle = 360 - angle
                else:
                    angle += 180

            if 0 <= angle <= 60:
                self.section_entered(1)
            elif 60 < angle <= 120:
                self.section_entered(2)
            elif 120 < angle <= 180:
                self.section_entered(3)
            elif 180 < angle <= 240:
                self.section_entered(4)
            elif 240 < angle <= 300:
                self.section_entered(5)
            else:
                self.section_entered(6)
        else:
            # Mouse en el centro
            pass

    def section_entered(self, section):
        if self.__section != section:
            self.__section = section
            variables.GAME_INTERFACE.piece_section_entered(section, self)

    def animated_move(self, final_pos, on_move_end=None):
        if variables.ANIMATIONS:
            if self.__timer is None:
                self.__timer = MovePieceTimer(self, final_pos, self.parent(),
                                              on_move_end)
                self.__timer.start()
            else:
                if not sip.isdeleted(self.__timer):
                    self.__timer.deleteLater()
                self.__timer = MovePieceTimer(self, final_pos, self.parent(),
                                              on_move_end)
                self.__timer.start()
        else:
            self.move(*final_pos)