Ejemplo n.º 1
0
    def _draw_heartbeat(self, painter):
        """
        Draws the heartbeat of the progress reporter so it doesn't look like
        the UI has frozen when progress is not updated in a while.

        :param painter: Painter object that will be used to render.
        """
        # The heartbeat beats one per second. At the halfway point it is at it's
        # max amplitude.
        half_update = self._UPDATES_PER_SECOND / 2.0
        amplitude = (math.fabs(self._heartbeat - half_update) /
                     half_update) * 6

        # Progress reporting starts at -90, which is (0, 1) in Cartesian coordinates.
        angle = self._spin_angle - 90
        y = math.sin(math.radians(angle))
        x = math.cos(math.radians(angle))

        pen = QtGui.QPen(QtGui.QColor("#424141"))
        brush = QtGui.QBrush(QtGui.QColor("#424141"))
        pen.setWidth(1)
        painter.setPen(pen)
        painter.setBrush(brush)

        # Draws the ellipse around the head of the arc.
        painter.drawEllipse(
            QtCore.QRectF(
                x * 40 + 40 - amplitude / 2,
                y * 40 + 40 - amplitude / 2,
                amplitude,
                amplitude,
            ))
Ejemplo n.º 2
0
    def _draw_opened_circle(self, painter, start_angle, span_angle):
        """
        Draws an arc around the SG logo.

        :param painter: Painter object we will draw with.
        :param start_angle: Angle at which we will start drawing the arc.
        :param span_angle: Degrees the arc covers.
        """
        # show the spinner
        painter.translate((painter.device().width() / 2) - 40,
                          (painter.device().height() / 2) - 40)

        pen = QtGui.QPen(QtGui.QColor("#424141"))
        pen.setWidth(3)
        painter.setPen(pen)
        painter.drawPixmap(QtCore.QPoint(8, 24), self._sg_icon)

        r = QtCore.QRectF(0.0, 0.0, 80.0, 80.0)
        # drawArc accepts 1/16th on angles.
        painter.drawArc(r, start_angle * 16, span_angle * 16)
    def paintEvent(self, event):
        """
        Render the UI.
        """
        if self._mode == self.MODE_OFF:
            return

        painter = QtGui.QPainter()
        painter.begin(self)
        try:
            # set up semi transparent backdrop
            painter.setRenderHint(QtGui.QPainter.Antialiasing)
            overlay_color = QtGui.QColor("#1B1B1B")
            painter.setBrush(QtGui.QBrush(overlay_color))
            painter.setPen(QtGui.QPen(overlay_color))
            painter.drawRect(0, 0,
                             painter.device().width(),
                             painter.device().height())

            # now draw different things depending on mode
            if self._mode == self.MODE_SPIN:

                # show the spinner
                painter.translate((painter.device().width() / 2) - 40,
                                  (painter.device().height() / 2) - 40)

                pen = QtGui.QPen(QtGui.QColor("#424141"))
                pen.setWidth(3)
                painter.setPen(pen)
                painter.drawPixmap(QtCore.QPoint(8, 24), self._sg_icon)

                r = QtCore.QRectF(0.0, 0.0, 80.0, 80.0)
                start_angle = (0 + self._spin_angle) * 4 * 16
                span_angle = 340 * 16

                painter.drawArc(r, start_angle, span_angle)

            elif self._mode == self.MODE_INFO_TEXT:
                # show text in the middle
                pen = QtGui.QPen(QtGui.QColor("#888888"))
                painter.setPen(pen)
                text_rect = QtCore.QRect(0, 0,
                                         painter.device().width(),
                                         painter.device().height())
                text_flags = QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter | QtCore.Qt.TextWordWrap
                painter.drawText(text_rect, text_flags, self._message)

            elif self._mode == self.MODE_ERROR:
                # show error text in the center
                pen = QtGui.QPen(QtGui.QColor("#C8534A"))
                painter.setPen(pen)
                text_rect = QtCore.QRect(0, 0,
                                         painter.device().width(),
                                         painter.device().height())
                text_flags = QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter | QtCore.Qt.TextWordWrap
                painter.drawText(text_rect, text_flags, self._message)

            elif self._mode == self.MODE_INFO_PIXMAP:
                # draw image
                painter.translate((painter.device().width() / 2) -
                                  (self._message_pixmap.width() / 2),
                                  (painter.device().height() / 2) -
                                  (self._message_pixmap.height() / 2))

                painter.drawPixmap(QtCore.QPoint(0, 0), self._message_pixmap)

        finally:
            painter.end()