Ejemplo n.º 1
0
class SelectionRectangle(QGraphicsItem):

    def __init__(self, parent = None):
        super().__init__(parent)

        self.setZValue(10000)

        self.mRectangle = QRectF()

    def setRectangle(self, rectangle):
        self.prepareGeometryChange()
        self.mRectangle = rectangle

    def boundingRect(self):
        return self.mRectangle.adjusted(-1, -1, 2, 2)

    def paint(self, painter, option, widget = None):
        if (self.mRectangle.isNull()):
            return
        # Draw a shadow
        black = QColor(Qt.black)
        black.setAlpha(128)
        pen = QPen(black, 2, Qt.DotLine)
        pen.setCosmetic(True)
        painter.setPen(pen)
        painter.drawRect(self.mRectangle.translated(1, 1))
        # Draw a rectangle in the highlight color
        highlight = QApplication.palette().highlight().color()
        pen.setColor(highlight)
        highlight.setAlpha(32)
        painter.setPen(pen)
        painter.setBrush(highlight)
        painter.drawRect(self.mRectangle)
Ejemplo n.º 2
0
class SelectionRectangle(QGraphicsItem):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setZValue(10000)

        self.mRectangle = QRectF()

    def setRectangle(self, rectangle):
        self.prepareGeometryChange()
        self.mRectangle = rectangle

    def boundingRect(self):
        return self.mRectangle.adjusted(-1, -1, 2, 2)

    def paint(self, painter, option, widget=None):
        if (self.mRectangle.isNull()):
            return
        # Draw a shadow
        black = QColor(Qt.black)
        black.setAlpha(128)
        pen = QPen(black, 2, Qt.DotLine)
        pen.setCosmetic(True)
        painter.setPen(pen)
        painter.drawRect(self.mRectangle.translated(1, 1))
        # Draw a rectangle in the highlight color
        highlight = QApplication.palette().highlight().color()
        pen.setColor(highlight)
        highlight.setAlpha(32)
        painter.setPen(pen)
        painter.setBrush(highlight)
        painter.drawRect(self.mRectangle)
Ejemplo n.º 3
0
 def fitItemInView(self):  #, scale=True
     try:
         logger.info("GraphicsView.fitItemInView called")
         print("GraphicsView.fitItemInView called")
         if self.graphicsItem is not None:
             rect = QRectF(self.graphicsItem.pixMap.rect())
             print(
                 "GraphicsView.fitItemInView called rect ={}".format(rect))
             if not rect.isNull():
                 self.setSceneRect(rect)
                 unity = self.transform().mapRect(QRectF(0, 0, 1, 1))
                 print("GraphicsView.fitItemInView called unity ={}".format(
                     unity))
                 self.scale(1 / unity.width(), 1 / unity.height())
                 viewrect = self.viewport().rect()
                 print("GraphicsView.fitItemInView called viewrect ={}".
                       format(viewrect))
                 scenerect = self.transform().mapRect(rect)
                 print("GraphicsView.fitItemInView called scenerect ={}".
                       format(scenerect))
                 factor = min(viewrect.width() / scenerect.width(),
                              viewrect.height() / scenerect.height())
                 self.scale(factor, factor)
                 print(
                     "GraphicsView.fitItemInView factor={}".format(factor))
                 print(
                     "****************************************************")
                 self._zoom = 0
     except Exception as e:
         print('Error in GraphicsView.fitItemInView: ' + str(e))
Ejemplo n.º 4
0
 def fitInView(self, scale=True):
     rect = QRectF(self.graphicsItem.pixMap.rect())
     if not rect.isNull():
         self.setSceneRect(rect)
         unity = self.transform().mapRect(QRectF(0, 0, 1, 1))
         self.scale(1 / unity.width(), 1 / unity.height())
         viewrect = self.viewport().rect()
         scenerect = self.transform().mapRect(rect)
         factor = min(viewrect.width() / scenerect.width(),
                      viewrect.height() / scenerect.height())
         self.scale(factor, factor)
         self._zoom = 0
Ejemplo n.º 5
0
 def fitPage(self):
     if not self.empty:
         rect = QRectF(self._pageLayer.pixmap().rect())
         if not rect.isNull():
             self.setSceneRect(rect)
             unity = self.transform().mapRect(QRectF(0, 0, 1, 1))
             self.scale(1 / unity.width(), 1 / unity.height())
             viewrect = self.viewport().rect()
             scenerect = self.transform().mapRect(rect)
             factor = min(viewrect.width() / scenerect.width(),
                          viewrect.height() / scenerect.height())
             self.scale(factor, factor)
             self._zoom = 0
Ejemplo n.º 6
0
 def fitInView(self, scale=True):
     # 图片自适应函数,缩放模式开启
     rect = QRectF(self._photo.pixmap().rect())  # 绘制图元大小的矩形
     if not rect.isNull():
         self.setSceneRect(rect)  # 这个矩形限定了场景的范围
         if self.hasPhoto():
             unity = self.transform().mapRect(QRectF(0, 0, 1, 1))
             self.scale(1 / unity.width(), 1 / unity.height())
             viewrect = self.viewport().rect()
             scenerect = self.transform().mapRect(rect)
             factor = min(viewrect.width() / scenerect.width(),
                          viewrect.height() / scenerect.height())
             self.scale(factor, factor)
         self._zoom = 0
Ejemplo n.º 7
0
    def fitInView(self, scale=True):
        rect = QRectF(self.photo.pixmap().rect())
        if not rect.isNull():
            self.setSceneRect(rect)
            if not self.empty:
                unity = self.transform().mapRect(QRectF(0, 0, 1, 1))
                self.scale(1 / unity.width(), 1 / unity.height())

                view_rect = self.viewport().rect()
                scene_rect = self.transform().mapRect(rect)
                self.scale_factor = min(
                    view_rect.width() / scene_rect.width(),
                    view_rect.height() / scene_rect.height())
                self.scale(self.scale_factor, self.scale_factor)

            self.zoom = 0
Ejemplo n.º 8
0
 def fitInView(self, scale=True):
     rect = QRectF(self._photo.pixmap().rect())
     if not rect.isNull():
         self.setSceneRect(rect)
         if self.hasPhoto():
             unity = self.transform().mapRect( QRectF(0, 0, 1, 1))
             self.scale(1 / unity.width(), 1 / unity.height())
             viewrect = self.viewport().rect()
             scenerect = self.transform().mapRect(rect)
             factor = min(viewrect.width() / scenerect.width(),
                          viewrect.height() / scenerect.height())
             self.scale(factor, factor)
             self.scale_factor =  factor
         self._zoom = 0
     else:
         print 'RECT IS NULL'
Ejemplo n.º 9
0
    def fitInView(self, scale=True, **kwargs):
        rect = QRectF(self._image.pixmap().rect())

        if not rect.isNull():
            self.setSceneRect(rect)

            if self.has_image():
                unity = self.transform().mapRect(QRectF(0, 0, 1, 1))

                self.scale(1 / unity.width(), 1 / unity.height())

                view_rect = self.viewport().rect()

                scene_rect = self.transform().mapRect(rect)

                factor = min(view_rect.width() / scene_rect.width(),
                             view_rect.height() / scene_rect.height())

                self.scale(factor, factor)

                # Reset the view holder to None
                self.view_holder = None

            self._zoom = 0
Ejemplo n.º 10
0
    def drawMapObject(self, painter, object, color):
        painter.save()
        bounds = object.bounds()
        rect = QRectF(bounds)
        painter.translate(rect.topLeft())
        rect.moveTopLeft(QPointF(0, 0))
        cell = object.cell()
        if (not cell.isEmpty()):
            CellRenderer(painter).render(cell, QPointF(), object.size(), CellRenderer.BottomLeft)
            if (self.testFlag(RenderFlag.ShowTileObjectOutlines)):
                tile = cell.tile
                imgSize = tile.size()
                tileOffset = tile.offset()
                rect = QRectF(QPointF(tileOffset.x(), tileOffset.y() - imgSize.height()), QSizeF(imgSize))
                pen = QPen(Qt.SolidLine)
                pen.setCosmetic(True)
                painter.setPen(pen)
                painter.drawRect(rect)
                pen.setStyle(Qt.DotLine)
                pen.setColor(color)
                painter.setPen(pen)
                painter.drawRect(rect)
        else:
            lineWidth = self.objectLineWidth()
            scale = self.painterScale()
            if lineWidth == 0:
                x = 1
            else:
                x = lineWidth
            shadowDist = x / scale
            shadowOffset = QPointF(shadowDist * 0.5, shadowDist * 0.5)
            linePen = QPen(color, lineWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)
            #linePen.setCosmetic(True)
            shadowPen = QPen(linePen)
            shadowPen.setColor(Qt.black)
            brushColor = QColor(color)
            fillBrush = QBrush(brushColor)
            painter.setRenderHint(QPainter.Antialiasing)
            # Trying to draw an ellipse with 0-width is causing a hang in
            # CoreGraphics when drawing the path requested by the
            # QCoreGraphicsPaintEngine. Draw them as rectangle instead.
            shape = object.shape()
            if (shape == MapObject.Ellipse and ((rect.width() == 0.0) ^ (rect.height() == 0.0))):
                shape = MapObject.Rectangle
            x = shape
            if x==MapObject.Rectangle:
                if (rect.isNull()):
                    rect = QRectF(QPointF(-10, -10), QSizeF(20, 20))
                # Draw the shadow
                painter.setPen(shadowPen)
                painter.drawRect(rect.translated(shadowOffset))
                painter.setPen(linePen)
                painter.setBrush(fillBrush)
                painter.drawRect(rect)
            elif x==MapObject.Polyline:
                screenPolygon = self.pixelToScreenCoords_(object.polygon())
                thickShadowPen = QPen(shadowPen)
                thickLinePen = QPen(linePen)
                thickShadowPen.setWidthF(thickShadowPen.widthF() * 4)
                thickLinePen.setWidthF(thickLinePen.widthF() * 4)
            
                painter.setPen(shadowPen)
                painter.drawPolyline(screenPolygon.translated(shadowOffset))
                painter.setPen(thickShadowPen)
                painter.drawPoint(screenPolygon.first() + shadowOffset)
            
                painter.setPen(linePen)
                painter.setBrush(fillBrush)
                painter.drawPolyline(screenPolygon)
                painter.setPen(thickLinePen)
                painter.drawPoint(screenPolygon.first())
            
            elif x==MapObject.Polygon:
                screenPolygon = self.pixelToScreenCoords_(object.polygon())
                thickShadowPen = QPen(shadowPen)
                thickLinePen = QPen(linePen)
                thickShadowPen.setWidthF(thickShadowPen.widthF() * 4)
                thickLinePen.setWidthF(thickLinePen.widthF() * 4)
                
                painter.setPen(shadowPen)
                painter.drawPolygon(screenPolygon.translated(shadowOffset))
                painter.setPen(thickShadowPen)
                painter.drawPoint(screenPolygon.first() + shadowOffset)
                
                painter.setPen(linePen)
                painter.setBrush(fillBrush)
                painter.drawPolygon(screenPolygon)
                
                painter.setPen(thickLinePen)
                painter.drawPoint(screenPolygon.first())
                
            elif x==MapObject.Ellipse:
                if (rect.isNull()):
                    rect = QRectF(QPointF(-10, -10), QSizeF(20, 20))
                # Draw the shadow
                painter.setPen(shadowPen)
                painter.drawEllipse(rect.translated(shadowOffset))
                painter.setPen(linePen)
                painter.setBrush(fillBrush)
                painter.drawEllipse(rect)

        painter.restore()
Ejemplo n.º 11
0
class WImageView(QGraphicsView):
    """Display image with pan/zoom hability"""

    BG_BLACK = 0
    BG_WHITE = 1
    BG_NEUTRAL_GRAY = 2
    BG_TRANSPARENT = 3
    BG_CHECKER_BOARD = 4

    # Mouse button emit coordinates on image
    leftButtonPressed = Signal(float, float)
    rightButtonPressed = Signal(float, float)
    leftButtonReleased = Signal(float, float)
    rightButtonReleased = Signal(float, float)
    leftButtonDoubleClicked = Signal(float, float)
    rightButtonDoubleClicked = Signal(float, float)
    zoomChanged = Signal(float)

    def __init__(self, parent=None):
        """Initialise viewer"""
        def zoomToFit(dummy):
            self.setZoom(0.0)

        def zoom1x1(dummy):
            self.setZoom(1.0)

        def bgColorBlack(dummy):
            self.setBackgroundType(WImageView.BG_BLACK)

        def bgColorWhite(dummy):
            self.setBackgroundType(WImageView.BG_WHITE)

        def bgColorNGray(dummy):
            self.setBackgroundType(WImageView.BG_NEUTRAL_GRAY)

        def bgColorNone(dummy):
            self.setBackgroundType(WImageView.BG_TRANSPARENT)

        def bgColorCheckerBoard(dummy):
            self.setBackgroundType(WImageView.BG_CHECKER_BOARD)

        super(WImageView, self).__init__(parent)

        # Image is a QPixmap in a QGraphicsScene
        self.__gScene = QGraphicsScene()
        self.setScene(self.__gScene)

        # Handle for current image
        self.__bgImg = QPixmap()
        self.__imgBgHandle = self.__imgHandle = self.__gScene.addPixmap(
            self.__bgImg)
        self.__imgBgHandle.setFlag(QGraphicsItem.ItemIgnoresTransformations,
                                   True)

        self.__imgHandle = None
        self.__imgRectF = None

        self.__currentZoomFactor = 1.0

        # default properties
        self.__allowPan = True
        self.__allowZoom = True
        self.__allowMenu = True
        self.__backgroundType = None

        self.__mousePos = None

        self.__actionZoom1x1 = QAction(buildIcon("pktk:zoom_1x1"),
                                       i18n('Zoom 1:1'), self)
        self.__actionZoom1x1.triggered.connect(zoom1x1)
        self.__actionZoomToFit = QAction(buildIcon("pktk:zoom_fit"),
                                         i18n('Zoom to fit'), self)
        self.__actionZoomToFit.triggered.connect(zoomToFit)

        self.__actionBgBlack = QAction(buildIcon("pktk:color_black"),
                                       i18n('Black'), self)
        self.__actionBgBlack.triggered.connect(bgColorBlack)
        self.__actionBgBlack.setCheckable(True)
        self.__actionBgWhite = QAction(buildIcon("pktk:color_white"),
                                       i18n('White'), self)
        self.__actionBgWhite.triggered.connect(bgColorWhite)
        self.__actionBgWhite.setCheckable(True)
        self.__actionBgNGray = QAction(buildIcon("pktk:color_ngray"),
                                       i18n('Gray'), self)
        self.__actionBgNGray.triggered.connect(bgColorNGray)
        self.__actionBgNGray.setCheckable(True)
        self.__actionBgNone = QAction(buildIcon("pktk:color_none"),
                                      i18n('Default'), self)
        self.__actionBgNone.triggered.connect(bgColorNone)
        self.__actionBgNone.setCheckable(True)
        self.__actionBgCheckerBoard = QAction(
            buildIcon("pktk:color_checkerboard"), i18n('Checker board'), self)
        self.__actionBgCheckerBoard.triggered.connect(bgColorCheckerBoard)
        self.__actionBgCheckerBoard.setCheckable(True)

        self.__contextMenu = QMenu(i18n("Background"))
        self.__bgMenu = self.__contextMenu.addMenu(buildIcon("pktk:color"),
                                                   'Background')
        self.__contextMenu.addSeparator()
        self.__contextMenu.addAction(self.__actionZoom1x1)
        self.__contextMenu.addAction(self.__actionZoomToFit)

        self.__bgMenu.addAction(self.__actionBgCheckerBoard)
        self.__bgMenu.addSeparator()
        self.__bgMenu.addAction(self.__actionBgBlack)
        self.__bgMenu.addAction(self.__actionBgWhite)
        self.__bgMenu.addAction(self.__actionBgNGray)
        self.__bgMenu.addAction(self.__actionBgNone)

        menuGroup = QActionGroup(self)
        menuGroup.addAction(self.__actionBgCheckerBoard)
        menuGroup.addAction(self.__actionBgBlack)
        menuGroup.addAction(self.__actionBgWhite)
        menuGroup.addAction(self.__actionBgNGray)
        menuGroup.addAction(self.__actionBgNone)

        self.setContextMenuPolicy(Qt.DefaultContextMenu)

        # Set a default scrollbar configuration
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)

        self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
        self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)

        self.setBackgroundType(WImageView.BG_CHECKER_BOARD)

    def contextMenuEvent(self, event):
        self.__contextMenu.exec_(event.globalPos())

    @staticmethod
    def backgroundList():
        """return list of possible values"""
        return [
            WImageView.BG_BLACK, WImageView.BG_WHITE,
            WImageView.BG_NEUTRAL_GRAY, WImageView.BG_TRANSPARENT,
            WImageView.BG_CHECKER_BOARD
        ]

    def allowZoom(self):
        """Return True if user is allowed to zoom with mouse"""
        return self.__allowZoom

    def setAllowZoom(self, value=True):
        """define if user is allowed to zoom with mouse"""
        if not isinstance(value, bool):
            raise EInvalidType("Given `value` must be a <bool>")

        self.__allowZoom = value

    def allowPan(self):
        """Return True if user is allowed to pan with mouse"""
        return self.__allowPan

    def setAllowPan(self, value=True):
        """define if user is allowed to pan with mouse"""
        if not isinstance(value, bool):
            raise EInvalidType("Given `value` must be a <bool>")

        self.__allowPan = value

    def allowMenu(self):
        """Return True if user is allowed to display default context menu"""
        return self.__allowMenu

    def setAllowMenu(self, value=True):
        """define if user is allowed to display context menu"""
        if not isinstance(value, bool):
            raise EInvalidType("Given `value` must be a <bool>")

        self.__allowMenu = value

    def backgroundType(self):
        """Return current background definition"""
        return self.__backgroundType

    def setBackgroundType(self, value):
        """Set current background definition

        Can be:
            WImageView.BG_BLACK = 0
            WImageView.BG_WHITE = 1
            WImageView.BG_NEUTRAL_GRAY = 2
            WImageView.BG_TRANSPARENT = 3
            WImageView.BG_CHECKER_BOARD = 4
        """
        if not isinstance(value, int):
            raise EInvalidType("Given `value` must be a valid <int>")

        if not value in [
                WImageView.BG_BLACK, WImageView.BG_WHITE,
                WImageView.BG_NEUTRAL_GRAY, WImageView.BG_TRANSPARENT,
                WImageView.BG_CHECKER_BOARD
        ]:
            raise EInvalidValue("Given `value` is not valid")

        if self.__backgroundType != value:
            self.__backgroundType = value
            if self.__backgroundType == WImageView.BG_BLACK:
                self.__gScene.setBackgroundBrush(QBrush(Qt.black))
                self.__actionBgBlack.setChecked(True)
            elif self.__backgroundType == WImageView.BG_WHITE:
                self.__gScene.setBackgroundBrush(QBrush(Qt.white))
                self.__actionBgWhite.setChecked(True)
            elif self.__backgroundType == WImageView.BG_NEUTRAL_GRAY:
                self.__gScene.setBackgroundBrush(QBrush(QColor(128, 128, 128)))
                self.__actionBgNGray.setChecked(True)
            elif self.__backgroundType == WImageView.BG_TRANSPARENT:
                self.__gScene.setBackgroundBrush(
                    QBrush(Krita.activeWindow().qwindow().palette().color(
                        QPalette.Mid)))
                self.__actionBgNone.setChecked(True)
            elif self.__backgroundType == WImageView.BG_CHECKER_BOARD:
                self.__gScene.setBackgroundBrush(checkerBoardBrush(32))
                self.__actionBgCheckerBoard.setChecked(True)

    def zoom(self):
        """Return current zoom property

        returned value is a tuple (ratio, QRectF) or None if there's no image
        """
        return self.__currentZoomFactor

        if self.hasImage():
            if len(self.__zoomList) > 0:
                rect = self.__zoomList[-1]
            else:
                rect = self.sceneRect()

            imgRect = QRectF(self.__imgHandle.pixmap().rect())
            if rect.width() > 0:
                ratio = imgRect.width() / rect.width()
            else:
                ratio = 1.0

            return (ratio, rect)
        else:
            return None

    def setZoom(self, value=0.0):
        """Set current zoom value

        If value is a QRect() or QRectF(), set zoom to given bounds
        If value is a float, bounds are calculated automatically:
            0 = fit to view
        """
        if not self.hasImage():
            return

        viewportRect = self.viewport().rect()

        if isinstance(value, QRect):
            value = QRectF(value)

        if isinstance(value, QRectF):
            sceneRect = self.transform().mapRect(value)
            self.__currentZoomFactor = min(
                viewportRect.width() / sceneRect.width(),
                viewportRect.height() / sceneRect.height())
            self.scale(self.__currentZoomFactor, self.__currentZoomFactor)
            self.centerOn(
                value.left() + value.width() / 2,
                value.top() + value.height() / 2,
            )
        elif isinstance(value, float) or isinstance(value, int):
            if value == 0:
                # fit
                self.resetTransform()
                self.setSceneRect(self.__imgRectF)

                sceneRect = self.transform().mapRect(self.__imgRectF)
                self.__currentZoomFactor = min(
                    viewportRect.width() / sceneRect.width(),
                    viewportRect.height() / sceneRect.height())
                self.scale(self.__currentZoomFactor, self.__currentZoomFactor)
            elif value > 0:
                self.__currentZoomFactor = value
                self.resetTransform()
                self.scale(self.__currentZoomFactor, self.__currentZoomFactor)
            else:
                # ignore invalid given zoom
                return
        else:
            raise EInvalidType("Given `value` must be a <float> or <QRectF>")
        self.zoomChanged.emit(round(self.__currentZoomFactor * 100, 2))

    def hasImage(self):
        """Return if an image is set or not"""
        if self.__imgHandle is None:
            return False
        return True

    def clearImage(self):
        """Clear current image"""
        if self.hasImage():
            self.__gScene.removeItem(self.__imgHandle)
            self.__imgHandle = None
            self.__imgRectF = None
            self.__currentZoomFactor = 1.0

    def image(self, asPixmap=False):
        """Return current image as QImage or None if not image is defined
        """
        if self.hasImage():
            if asPixmap:
                return self.__imgHandle.pixmap()
            else:
                return self.__imgHandle.pixmap().toImage()
        return None

    def setImage(self, image, resetZoom=True):
        """Set current image

        Given image is a QImage or a QPixmap
        """
        if image is None:
            self.clearImage()
            return

        if not (isinstance(image, QImage) or isinstance(image, QPixmap)):
            raise EInvalidType(
                "Given `image` must be a <QImage> or a <QPixmap>")

        if isinstance(image, QImage):
            img = QPixmap.fromImage(image)
        else:
            img = image

        if self.hasImage():
            self.__imgHandle.setPixmap(img)
        else:
            self.__imgHandle = self.__gScene.addPixmap(img)

        self.__imgRectF = QRectF(img.rect())

        if self.__imgRectF.isNull():
            self.clearImage()
        elif resetZoom:
            # view image to fit
            self.setZoom(0.0)

    def resizeEvent(self, event):
        """When viewer is resized, keep current view rect"""
        self.resetTransform()
        self.scale(self.__currentZoomFactor, self.__currentZoomFactor)

    def mousePressEvent(self, event):
        """Start Pan or Zoom"""
        # memorize current mouse position on image
        self.__mousePos = self.mapToScene(event.pos())

        if self.hasImage():
            if event.button() == Qt.LeftButton:
                if self.__allowZoom and event.modifiers(
                ) == Qt.ControlModifier:
                    self.setDragMode(QGraphicsView.RubberBandDrag)
                elif self.__allowPan:
                    self.setDragMode(QGraphicsView.ScrollHandDrag)
                self.leftButtonPressed.emit(self.__mousePos.x(),
                                            self.__mousePos.y())

        QGraphicsView.mousePressEvent(self, event)

    def mouseReleaseEvent(self, event):
        """Stop Pan or Zoom"""
        QGraphicsView.mouseReleaseEvent(self, event)

        # memorize current mouse position on image
        self.__mousePos = self.mapToScene(event.pos())

        if self.hasImage():
            if event.button() == Qt.LeftButton:
                if self.__allowZoom and event.modifiers(
                ) == Qt.ControlModifier:
                    if self.__gScene.selectionArea().boundingRect().width(
                    ) > 0.0:
                        selectionRect = self.__gScene.selectionArea(
                        ).boundingRect().intersected(self.__imgRectF)

                        self.__gScene.setSelectionArea(
                            QPainterPath())  # Clear current selection area.
                        if selectionRect.isValid() and (
                                selectionRect != self.viewport().rect()):
                            self.setZoom(selectionRect)

                    self.setDragMode(QGraphicsView.NoDrag)
                elif self.__allowPan:
                    self.setDragMode(QGraphicsView.NoDrag)
                self.leftButtonReleased.emit(self.__mousePos.x(),
                                             self.__mousePos.y())

    def mouseDoubleClickEvent(self, event):
        """Reset zoom

        - left: default image size
        - right: fit image
        """
        # memorize current mouse position on image
        self.__mousePos = self.mapToScene(event.pos())

        if event.button() == Qt.LeftButton:
            if self.zoom() == 1:
                # scale 1:1 => zoom to fit
                self.setZoom(0.0)
            else:
                # scale is not 1:1 => scale to 1
                self.setZoom(1.0)
            self.leftButtonDoubleClicked.emit(self.__mousePos.x(),
                                              self.__mousePos.y())
        QGraphicsView.mouseDoubleClickEvent(self, event)

    def wheelEvent(self, event):
        """Zoom in/out"""
        # memorize current mouse position on image
        self.__mousePos = self.mapToScene(event.pos())

        if self.hasImage():
            if event.angleDelta().y() > 0:
                self.setZoom(self.__currentZoomFactor * 1.25)
            else:
                self.setZoom(self.__currentZoomFactor * 0.8)
Ejemplo n.º 12
0
 def fitInView(self, scale=True):
     rect = QRectF(self._photo.pixmap().rect())
     if not rect.isNull():
         self.setSceneRect(rect)
Ejemplo n.º 13
0
    def drawMapObject(self, painter, object, color):
        painter.save()
        bounds = object.bounds()
        rect = QRectF(bounds)
        painter.translate(rect.topLeft())
        rect.moveTopLeft(QPointF(0, 0))
        cell = object.cell()
        if (not cell.isEmpty()):
            CellRenderer(painter).render(cell, QPointF(), object.size(),
                                         CellRenderer.BottomLeft)
            if (self.testFlag(RenderFlag.ShowTileObjectOutlines)):
                tile = cell.tile
                imgSize = tile.size()
                tileOffset = tile.offset()
                rect = QRectF(
                    QPointF(tileOffset.x(),
                            tileOffset.y() - imgSize.height()),
                    QSizeF(imgSize))
                pen = QPen(Qt.SolidLine)
                pen.setCosmetic(True)
                painter.setPen(pen)
                painter.drawRect(rect)
                pen.setStyle(Qt.DotLine)
                pen.setColor(color)
                painter.setPen(pen)
                painter.drawRect(rect)
        else:
            lineWidth = self.objectLineWidth()
            scale = self.painterScale()
            if lineWidth == 0:
                x = 1
            else:
                x = lineWidth
            shadowDist = x / scale
            shadowOffset = QPointF(shadowDist * 0.5, shadowDist * 0.5)
            linePen = QPen(color, lineWidth, Qt.SolidLine, Qt.RoundCap,
                           Qt.RoundJoin)
            #linePen.setCosmetic(True)
            shadowPen = QPen(linePen)
            shadowPen.setColor(Qt.black)
            brushColor = QColor(color)
            fillBrush = QBrush(brushColor)
            painter.setRenderHint(QPainter.Antialiasing)
            # Trying to draw an ellipse with 0-width is causing a hang in
            # CoreGraphics when drawing the path requested by the
            # QCoreGraphicsPaintEngine. Draw them as rectangle instead.
            shape = object.shape()
            if (shape == MapObject.Ellipse
                    and ((rect.width() == 0.0) ^ (rect.height() == 0.0))):
                shape = MapObject.Rectangle
            x = shape
            if x == MapObject.Rectangle:
                if (rect.isNull()):
                    rect = QRectF(QPointF(-10, -10), QSizeF(20, 20))
                # Draw the shadow
                painter.setPen(shadowPen)
                painter.drawRect(rect.translated(shadowOffset))
                painter.setPen(linePen)
                painter.setBrush(fillBrush)
                painter.drawRect(rect)
            elif x == MapObject.Polyline:
                screenPolygon = self.pixelToScreenCoords_(object.polygon())
                thickShadowPen = QPen(shadowPen)
                thickLinePen = QPen(linePen)
                thickShadowPen.setWidthF(thickShadowPen.widthF() * 4)
                thickLinePen.setWidthF(thickLinePen.widthF() * 4)

                painter.setPen(shadowPen)
                painter.drawPolyline(screenPolygon.translated(shadowOffset))
                painter.setPen(thickShadowPen)
                painter.drawPoint(screenPolygon.first() + shadowOffset)

                painter.setPen(linePen)
                painter.setBrush(fillBrush)
                painter.drawPolyline(screenPolygon)
                painter.setPen(thickLinePen)
                painter.drawPoint(screenPolygon.first())

            elif x == MapObject.Polygon:
                screenPolygon = self.pixelToScreenCoords_(object.polygon())
                thickShadowPen = QPen(shadowPen)
                thickLinePen = QPen(linePen)
                thickShadowPen.setWidthF(thickShadowPen.widthF() * 4)
                thickLinePen.setWidthF(thickLinePen.widthF() * 4)

                painter.setPen(shadowPen)
                painter.drawPolygon(screenPolygon.translated(shadowOffset))
                painter.setPen(thickShadowPen)
                painter.drawPoint(screenPolygon.first() + shadowOffset)

                painter.setPen(linePen)
                painter.setBrush(fillBrush)
                painter.drawPolygon(screenPolygon)

                painter.setPen(thickLinePen)
                painter.drawPoint(screenPolygon.first())

            elif x == MapObject.Ellipse:
                if (rect.isNull()):
                    rect = QRectF(QPointF(-10, -10), QSizeF(20, 20))
                # Draw the shadow
                painter.setPen(shadowPen)
                painter.drawEllipse(rect.translated(shadowOffset))
                painter.setPen(linePen)
                painter.setBrush(fillBrush)
                painter.drawEllipse(rect)

        painter.restore()