Exemplo n.º 1
0
class QMiniMapTargetSceneViewer(QGraphicsItem):
    """
    Widget to render minimized version of the target view's scene on the minimap.

    For performance, the scene is cached in a QImage and only updated when update_scene_drawing is called.
    """
    def __init__(self, target_view: QGraphicsView, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._view: QGraphicsView = target_view
        self._minimap_scene_rect: QRectF = QRectF()
        self._scene_img: QImage = QImage()

    def set_scene_rect(self, rect: QRectF):
        """
        Define the dimensions of the total minimap scene.
        """
        self.prepareGeometryChange()
        self._minimap_scene_rect = rect
        self.update_scene_drawing()
        self.update()

    def update_scene_drawing(self):
        """
        Render the target scene in an image to be used for minimap painting.
        """
        scene = self._view.scene()
        if scene is None:
            return

        dpr = self._view.devicePixelRatioF()
        self._scene_img = QImage(dpr * self._minimap_scene_rect.width(),
                                 dpr * self._minimap_scene_rect.height(),
                                 QImage.Format_ARGB32)
        self._scene_img.setDevicePixelRatio(dpr)
        self._scene_img.fill(Conf.palette_base)
        self._view.set_extra_render_pass(True)
        painter = QPainter(self._scene_img)
        painter.setRenderHints(QPainter.Antialiasing
                               | QPainter.SmoothPixmapTransform
                               | QPainter.HighQualityAntialiasing)
        scene.render(painter, target=self._minimap_scene_rect)
        self._view.set_extra_render_pass(False)
        self.update()

    def paint(self, painter, option, widget):  # pylint: disable=unused-argument
        """
        Paint the minimized scene image.
        """
        painter.drawImage(0, 0, self._scene_img)

    def boundingRect(self):
        return self._minimap_scene_rect
Exemplo n.º 2
0
class CanvasLabel(QtWidgets.QLabel):
    redraw = QtCore.Signal((QtCore.QObject,))

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setAttribute(QtCore.Qt.WA_NoSystemBackground)

        self.canvas_scale = QtCore.QSizeF(1, 1)

        self.setup_overlay()
        self.setBackgroundRole(QtGui.QPalette.Light)
        self.setScaledContents(True)

    def setPixmap(self, pixmap):
        super().setPixmap(pixmap)
        if self.pixmap().size() != self.overlay_image.size():
            self.setup_overlay()

    def setup_overlay(self):
        if self.pixmap():
            size = QtCore.QSize(self.pixmap().width(), self.pixmap().height())
        else:
            size = QtCore.QSize(self.size().width(), self.size().height())

        self.setup_overlay_image(size)

    def setup_overlay_image(self, size):
        self.overlay_image = QImage(size, QImage.Format_ARGB32)
        self.overlay_image.setDevicePixelRatio(self.devicePixelRatioF())
        self.overlay_image.fill(QtGui.QColor(0, 0, 0, 0))

    def paintEvent(self, event):
        image_rect = QtCore.QRectF(QtCore.QPointF(0, 0), QtCore.QSizeF(self.pixmap().size())*self.canvas_scale)

        self_rect = self.contentsRect()

        bg_texture = QtGui.QPixmap(':/textures/bg.png')
        bg_texture.setDevicePixelRatio(self.devicePixelRatioF())
        bg_brush = QtGui.QBrush(bg_texture)

        painter = QtGui.QPainter(self)
        painter.fillRect(self.contentsRect(), QtGui.QColor(0, 0, 0, 255))
        painter.fillRect(image_rect, bg_brush)
        painter.drawPixmap(image_rect, self.pixmap(), QtCore.QRectF(self.pixmap().rect()))
        #painter.drawImage(image_rect, self.overlay_image)
        self.redraw.emit(self)
        painter.end()
Exemplo n.º 3
0
class ImageLabel(QtWidgets.QLabel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setup_overlay()

    def resizeEvent(self, event):
        self.setup_overlay()

    def setup_overlay(self):
        size = None
        if self.pixmap():
            size = QtCore.QSize(self.pixmap().width(), self.pixmap().height())
        else:
            size = QtCore.QSize(self.size().width(), self.size().height())

        self.setup_overlay_image(size)

    def setup_overlay_image(self, size):
        self.overlay_image = QImage(size, QImage.Format_ARGB32_Premultiplied)
        self.overlay_image.setDevicePixelRatio(self.devicePixelRatioF())
        self.overlay_image.fill(QtGui.QColor(255, 0, 0, 128))

    def paintEvent(self, event):
        if self.pixmap():
            painter = QtGui.QPainter(self)
            self.drawFrame(painter)
            cr = self.contentsRect()
            painter.drawPixmap(cr, self.pixmap())

            painter.drawImage(cr, self.overlay_image)

            if self.window().show_grid:
                Grid.draw(self, self.window().grid_spacing)
        else:
            super().paintEvent(event)
Exemplo n.º 4
0
    def paint(self, painter, option, index):
        options = QStyleOptionViewItem(option)
        style = options.widget.style()
        style.drawControl(QStyle.CE_ItemViewItem, options, painter)
        painter.save()
        rectangle = option.rect

        if option.state & QStyle.State_Selected:
            pin = QImage(AssetsMapper.PINNED_SELECTED.value)
            painter.fillRect(rectangle,
                             QBrush(QColor(Color.ITEM_SELECTED.value)))
        else:
            pin = QImage(AssetsMapper.PINNED.value)

        rectangle.setX(10)
        pin.setDevicePixelRatio(2.0)
        font = painter.font()
        font.setPixelSize(Style.FONT_SIZE.value)
        painter.setFont(font)
        pin_rect = copy.copy(rectangle)
        pin_rect.setHeight(32)
        pin_rect.setWidth(32)
        yoffset = 42

        # Draw title
        title = index.data(ItemModel.TitleRole)
        pinned = index.data(ItemModel.PinRole)

        pin_point = rectangle.topLeft()
        pin_point.setY(pin_point.y() + 32)
        pin_rect.setTopLeft(pin_point)
        point = option.rect.topLeft()
        point.setY(point.y() - 40)
        rectangle.setTopLeft(point)
        pin_point.setY(pin_point.y() - 20)
        pin_rect.setTopLeft(pin_point)
        pin_rect.setHeight(16)
        pin_rect.setWidth(16)

        if pinned:
            painter.drawImage(pin_rect, pin)
            title = f'      {title}'

        painter.setPen(QColor(Color.TITLE.value))
        painter.drawText(rectangle, Qt.AlignVCenter, title)

        # Draw company
        company = index.data(ItemModel.CompanyRole)

        point = option.rect.topLeft()
        point.setY(point.y() + yoffset)
        rectangle.setTopLeft(point)
        font.setPixelSize(Style.FONT_SIZE.value)
        painter.setFont(font)
        painter.setPen(QColor(Color.COMPANY.value))
        painter.drawText(rectangle, Qt.AlignVCenter, company)

        # Draw location
        location = index.data(ItemModel.LocationRole)

        point = option.rect.topLeft()
        point.setY(point.y() + yoffset)
        rectangle.setTopLeft(point)
        font.setPixelSize(Style.FONT_SIZE.value - 2)
        painter.setFont(font)
        painter.setPen(QColor(Color.LOCATION.value))
        painter.drawText(rectangle, Qt.AlignVCenter, location)

        painter.restore()