示例#1
0
    def drawGrid(self, painter, rect, gridColor):
        tileWidth = self.map().tileWidth()
        tileHeight = self.map().tileHeight()
        if (tileWidth <= 0 or tileHeight <= 0):
            return
        startX = max(0, int(rect.x() / tileWidth) * tileWidth)
        startY = max(0, int(rect.y() / tileHeight) * tileHeight)
        endX = min(math.ceil(rect.right()), self.map().width() * tileWidth + 1)
        endY = min(math.ceil(rect.bottom()),
                   self.map().height() * tileHeight + 1)
        gridColor.setAlpha(128)
        gridPen = QPen(gridColor)
        gridPen.setCosmetic(True)
        _x = QVector()
        _x.append(2)
        _x.append(2)
        gridPen.setDashPattern(_x)
        if (startY < endY):
            gridPen.setDashOffset(startY)
            painter.setPen(gridPen)
            for x in range(startX, endX, tileWidth):
                painter.drawLine(x, startY, x, endY - 1)

        if (startX < endX):
            gridPen.setDashOffset(startX)
            painter.setPen(gridPen)
            for y in range(startY, endY, tileHeight):
                painter.drawLine(startX, y, endX - 1, y)
示例#2
0
    def drawForeground(self, painter, rect):
        if self._tiling is None:
            return

        if self._showTileOutlines:
            tile_nos = self._tiling.intersected(rect)

            for tileId in tile_nos:
                ## draw tile outlines
                # Dashed black line
                pen = QPen()
                pen.setWidth(0)
                pen.setDashPattern([5, 5])
                painter.setPen(pen)
                painter.drawRect(self._tiling.imageRects[tileId])

                # Dashed white line
                # (offset to occupy the spaces in the dashed black line)
                pen = QPen()
                pen.setWidth(0)
                pen.setDashPattern([5, 5])
                pen.setDashOffset(5)
                pen.setColor(QColor(Qt.white))
                painter.setPen(pen)
                painter.drawRect(self._tiling.imageRects[tileId])
示例#3
0
    def drawGrid(self, painter, rect, gridColor):
        tileWidth = self.map().tileWidth()
        tileHeight = self.map().tileHeight()
        if (tileWidth <= 0 or tileHeight <= 0):
            return
        startX = max(0,  int(rect.x() / tileWidth) * tileWidth)
        startY = max(0,  int(rect.y() / tileHeight) * tileHeight)
        endX = min(math.ceil(rect.right()), self.map().width() * tileWidth + 1)
        endY = min(math.ceil(rect.bottom()), self.map().height() * tileHeight + 1)
        gridColor.setAlpha(128)
        gridPen = QPen(gridColor)
        gridPen.setCosmetic(True)
        _x = QVector()
        _x.append(2)
        _x.append(2)
        gridPen.setDashPattern(_x)
        if (startY < endY):
            gridPen.setDashOffset(startY)
            painter.setPen(gridPen)
            for x in range(startX, endX, tileWidth):
                painter.drawLine(x, startY, x, endY - 1)

        if (startX < endX):
            gridPen.setDashOffset(startX)
            painter.setPen(gridPen)
            for y in range(startY, endY, tileHeight):
                painter.drawLine(startX, y, endX - 1, y)
示例#4
0
 def drawLine(self, startPos, endPos):
     pen = QPen()
     pen.setDashOffset(1)
     pen.setWidth(2)
     painter = QPainter(self.canvas)
     painter.setPen(pen)
     painter.drawLine(QPoint(startPos.x, startPos.y),
                      QPoint(endPos.x, endPos.y))
示例#5
0
文件: canvas.py 项目: cspang1/jide
    def drawForeground(self, painter, rect):
        """Draw the gridlines overlaying the canvas

        :param painter: QPainter object to paint with
        :type painter:  QPainter
        :param rect:    Exposed rectangle to paint over
        :type rect:     QRectF
        """
        pen = QPen(Qt.darkCyan)
        pen.setWidth(0)
        painter.setPen(pen)
        thin_lines = []
        thick_lines = []
        for longitude in range(self.subject.width + 1):
            line = QLineF(longitude, 0, longitude, self.subject.height)
            if longitude % 8 == 0:
                thick_lines.append(line)
            thin_lines.append(line)
        for latitude in range(self.subject.height + 1):
            line = QLineF(0, latitude, self.subject.width, latitude)
            if latitude % 8 == 0:
                thick_lines.append(line)
            thin_lines.append(line)
        pen = QPen(Qt.darkCyan)
        pen.setWidth(1)
        pen.setCosmetic(True)
        painter.setPen(pen)
        painter.drawLines(thin_lines)
        pen.setColor(Qt.white)
        painter.setPen(pen)
        painter.drawLines(thick_lines)
        if self.overlay.selecting:
            pen = QPen(Qt.white)
            pen.setJoinStyle(Qt.MiterJoin)
            pen.setWidth(3)
            pen.setCosmetic(True)
            painter.setPen(pen)
            painter.drawRect(
                QRectF(
                    self.overlay.start_scene_pos, self.overlay.cur_scene_pos
                )
            )
            pen.setColor(Qt.black)
            pen.setStyle(Qt.DotLine)
            pen.setDashOffset(self.overlay.ants_offset)
            painter.setPen(pen)
            painter.drawRect(
                QRectF(
                    self.overlay.start_scene_pos, self.overlay.cur_scene_pos
                )
            )
 def paint(self, painter, arg2, arg3):
     horizontal = [
         QLineF(self.mBoundingRect.topRight(), self.mBoundingRect.topLeft()), 
         QLineF(self.mBoundingRect.bottomRight(), self.mBoundingRect.bottomLeft())]
     
     vertical = [
         QLineF(self.mBoundingRect.bottomLeft(), self.mBoundingRect.topLeft()), 
         QLineF(self.mBoundingRect.bottomRight(), self.mBoundingRect.topRight())]
     
     dashPen = QPen(Qt.DashLine)
     dashPen.setCosmetic(True)
     dashPen.setDashOffset(max(0.0, self.x()))
     painter.setPen(dashPen)
     painter.drawLines(horizontal)
     dashPen.setDashOffset(max(0.0, self.y()))
     painter.setPen(dashPen)
     painter.drawLines(vertical)
示例#7
0
    def paint(self, painter, option, widget=None):
        """
        Paint a single line of the slice intersection marker.
        """
        width = self._parent._width
        height = self._parent._height
        thickness = self._parent.PEN_THICKNESS

        # Our pen thickness is consistent across zoom levels because the pen is "cosmetic"
        # However, that doesn't ensure a consistent-size dash pattern.
        # Determine the inverse scaling factor from scene to view to set a consistent dash pattern at all scales.
        view = self.scene().views()[0]
        inverted_transform, has_inverse = view.transform().inverted()
        dash_length = old_div(4, inverted_transform.m11())
        dash_length = max(0.5, dash_length)

        # Draw the line with two pens to get a black-and-white dashed line.
        # pen_white = QPen( Qt.white, thickness )
        pen_white = QPen(self._parent._cropColor, thickness)
        pen_white.setDashPattern([dash_length, dash_length])
        pen_white.setCosmetic(True)

        pen_black = QPen(Qt.black, thickness)
        pen_black.setDashPattern([dash_length, dash_length])
        pen_black.setCosmetic(True)
        pen_black.setDashOffset(dash_length)

        with painter_context(painter):
            t = painter.transform()
            painter.setTransform(self.scene().data2scene * t)

            # Draw the line with two pens to get a black-and-white dashed line.
            for pen in [pen_white, pen_black]:
                painter.setPen(pen)

                if self._direction == "horizontal":
                    painter.drawLine(QPointF(0.0, self.position), QPointF(width, self.position))
                else:
                    painter.drawLine(QPointF(self.position, 0.0), QPointF(self.position, height))
    def paint(self, painter, arg2, arg3):
        horizontal = [
            QLineF(self.mBoundingRect.topRight(),
                   self.mBoundingRect.topLeft()),
            QLineF(self.mBoundingRect.bottomRight(),
                   self.mBoundingRect.bottomLeft())
        ]

        vertical = [
            QLineF(self.mBoundingRect.bottomLeft(),
                   self.mBoundingRect.topLeft()),
            QLineF(self.mBoundingRect.bottomRight(),
                   self.mBoundingRect.topRight())
        ]

        dashPen = QPen(Qt.DashLine)
        dashPen.setCosmetic(True)
        dashPen.setDashOffset(max(0.0, self.x()))
        painter.setPen(dashPen)
        painter.drawLines(horizontal)
        dashPen.setDashOffset(max(0.0, self.y()))
        painter.setPen(dashPen)
        painter.drawLines(vertical)
示例#9
0
    def drawPath(self, items, useRows):
        """Draws one flight path
		Args
		items -- squares.
		useRows:
			True -- go by rows
			False -- go by cols
		"""
        if useRows:
            way = "row"
            sortFirst = "col"
            oldSide = "left"
            newSide = "right"
            color = QColor(255, 10, 10)
        else:
            way = "col"
            sortFirst = "row"
            oldSide = "top"
            newSide = "bottom"
            color = QColor(10, 255, 10)

        # Pen for main lines
        pen = QPen(color)
        pen.setWidth(2)
        pen.setCosmetic(True)
        # Pen for turning lines
        pen2 = QPen(color)
        pen2.setWidth(2)
        pen2.setStyle(Qt.DashLine)
        pen2.setDashOffset(2)
        pen2.setCosmetic(True)

        # Sort selected items
        items.sort(key=lambda item: item.getRowCol()[sortFirst])
        items.sort(key=lambda item: item.getRowCol()[way])

        def addItem(item):
            self.addItem(item)
            if useRows:
                self.rowLines.append(item)
            else:
                self.colLines.append(item)

        # Draw lines
        newPos = True  # Shows if we're will be at new col/row at next iteration
        prevLine = None  # Previously drawn line
        isLastPointReversed = False  # Shows from which end draw turning line
        for i in range(len(items)):
            item = items[i]
            if newPos:
                side1 = item.getSides()[oldSide]
                newPos = False
            pos = item.getRowCol()[way]
            try:
                nextPos = items[i + 1].getRowCol()[way]
            except:
                nextPos = pos + 1
            if pos != nextPos:
                side2 = item.getSides()[newSide]
                lineF = QLineF(side1, side2)
                line = QGraphicsLineItem(lineF)
                line.setPen(pen)
                addItem(line)
                newPos = True
                if prevLine != None:
                    if isLastPointReversed:
                        start = prevLine.p2()
                        end = side2
                    else:
                        start = prevLine.p1()
                        end = side1
                    newLine = QGraphicsLineItem(QLineF(start, end))
                    newLine.setPen(pen2)
                    addItem(newLine)
                isLastPointReversed = not isLastPointReversed
                prevLine = lineF
示例#10
0
class Manipulator(Tool):
    def __init__(self, canvas):
        super(Manipulator, self).__init__(canvas)

        self._name = 'Manipulator'
        self._load_icon(":/icons/ico_sel_move", ":/icons/ico_sel_move_hover")
        self._cursor = QPixmap(":/images/mover_cursor")

        self._pressMousePos = QPoint()
        self._lastMousePos = QPoint()
        self._curMousePos = QPoint()
        self._selectionRectangle = QRect()
        self._selectionRectColor = QColor(255, 255, 255, 50)
        self._selectionRectDashOffset = 0
        self._selectionImage = None
        self._cutOnSelection = True
        self._doEraseOnSelectionMove = False

        self._selectionBorderPen = QPen()
        self._selectionBorderPen.setWidth(0)
        self._selectionBorderPen.setStyle(Qt.DashLine)
        self._selectionBorderPen.setColor(Qt.white)

        self._selectionRectNodesPen = QPen()
        self._selectionRectNodesPen.setWidth(0)
        self._selectionRectNodesPen.setColor(Qt.white)

        self._state = ManipulatorState.Idle

    def draw_transformed(self, painter):

        if not self._selectionRectangle.isEmpty():
            painter.setPen(self._selectionBorderPen)
            painter.setOpacity(1.0)

            if self._selectionImage is None:

                painter.setCompositionMode(QPainter.CompositionMode_Difference)
                painter.fillRect(self._selectionRectangle, self._selectionRectColor)
                painter.drawRect(self._selectionRectangle)

            else:

                painter.setCompositionMode(QPainter.CompositionMode_SourceOver)
                painter.drawImage(self._selectionRectangle, self._selectionImage)

                painter.setCompositionMode(QPainter.CompositionMode_Difference)
                painter.drawRect(self._selectionRectangle)

            print('Selection Rect Draw')

    def draw_untransformed(self, painter):

        canvas = self._canvas

        x = canvas.mouse_state.global_pos.x() + 1
        y = canvas.mouse_state.global_pos.y() + 1

        if self._enablePointerDraw and self._state == ManipulatorState.Idle \
                or self._state == ManipulatorState.MovingSelection \
                or self._state == ManipulatorState.MovingPixels:
            painter.drawPixmap(x - self._cursor.width() / 2, y -
                               self._cursor.height() / 2, self._cursor)

    def update(self):
        self._animate_selection_border()

    def on_mouse_press(self):

        super(Manipulator, self).on_mouse_press()

        canvas = self._canvas

        button = canvas.mouse_state.pressed_button
        mouse_pos = canvas.mouse_state.canvas_pos

        self._lastMousePos.setX(mouse_pos.x())
        self._lastMousePos.setY(mouse_pos.y())
        self._curMousePos.setX(mouse_pos.x())
        self._curMousePos.setY(mouse_pos.y())
        self._pressMousePos.setX(mouse_pos.x())
        self._pressMousePos.setY(mouse_pos.y())

        if button == Qt.LeftButton:

            if self._selectionRectangle.isEmpty():

                self._state = ManipulatorState.MovingPixels

            else:

                if self._selectionRectangle.contains(
                        QPoint(round(mouse_pos.x()), round(mouse_pos.y()))):

                    self._state = ManipulatorState.MovingSelection

                else:

                    if self._selectionImage is not None:
                        self._paste_selection()

                    self._clear_selection()
                    self._state = ManipulatorState.Idle

        elif button == Qt.RightButton:

            if self._selectionImage is not None:
                self._paste_selection()

            self._clear_selection()
            self._state = ManipulatorState.Selecting

    def on_mouse_move(self):

        canvas = self._canvas

        mouse_pos = canvas.mouse_state.canvas_pos

        if self._state == ManipulatorState.MovingPixels:

            self._lastMousePos.setX(self._curMousePos.x())
            self._lastMousePos.setY(self._curMousePos.y())

            self._curMousePos.setX(mouse_pos.x())
            self._curMousePos.setY(mouse_pos.y())

            dx = self._curMousePos.x() - self._lastMousePos.x()
            dy = self._curMousePos.y() - self._lastMousePos.y()

            image = canvas.sprite_object.active_surface

            if image is not None:

                image_data = canvas.sprite_object.active_surface_pixel_data

                if image_data is None:
                    return

                quickpixler.movePixels(image_data, image.width(), image.height(), dx, dy)

                self._canvas.surfaceChanging.emit()

        elif self._state == ManipulatorState.Selecting:

            top_left = QPoint(min(mouse_pos.x(), self._pressMousePos.x()),
                              min(mouse_pos.y(), self._pressMousePos.y()))

            width = abs(mouse_pos.x() - self._pressMousePos.x())
            height = abs(mouse_pos.y() - self._pressMousePos.y())

            self._selectionRectangle.setRect(top_left.x(), top_left.y(),
                                             width, height)

        elif self._state == ManipulatorState.MovingSelection:

            self._lastMousePos.setX(self._curMousePos.x())
            self._lastMousePos.setY(self._curMousePos.y())

            self._curMousePos.setX(mouse_pos.x())
            self._curMousePos.setY(mouse_pos.y())

            dx = self._curMousePos.x() - self._lastMousePos.x()
            dy = self._curMousePos.y() - self._lastMousePos.y()

            self._move_selection(dx, dy)

        elif self._state == ManipulatorState.ScalingSelection:
            pass

    def on_mouse_release(self):

        super(Manipulator, self).on_mouse_press()

        if self._state == ManipulatorState.Selecting:
            if not self._selectionRectangle.isEmpty():
                self._copy_selection()

                if self._cutOnSelection:
                    self._doEraseOnSelectionMove = True

        elif self._state == ManipulatorState.MovingPixels:
            self._canvas.surfaceChanged.emit()

        self._state = ManipulatorState.Idle

    def on_key_press(self, key):

        if key == Qt.Key_Return:

            if not self._selectionRectangle.isEmpty() and self._selectionImage is not None:
                self._paste_selection()
                self._clear_selection()

    def _animate_selection_border(self):

        self._selectionRectDashOffset += 1.0

        if self._selectionRectDashOffset > 6.0:
            self._selectionRectDashOffset = 0.0

        self._selectionBorderPen.setDashOffset(self._selectionRectDashOffset)

    def _clear_selection(self):

        self._selectionRectangle = QRect()
        self._selectionImage = None

    def _normalize_selection_rect(self):

        sprite_bounding_rect = self._canvas.sprite_object.bounding_rect_i

        if self._selectionRectangle.left() < sprite_bounding_rect.left():
            self._selectionRectangle.setLeft(sprite_bounding_rect.left())

        if self._selectionRectangle.right() > sprite_bounding_rect.right():
            self._selectionRectangle.setRight(sprite_bounding_rect.right())

        if self._selectionRectangle.top() < sprite_bounding_rect.top():
            self._selectionRectangle.setTop(sprite_bounding_rect.top())

        if self._selectionRectangle.bottom() > sprite_bounding_rect.bottom():
            self._selectionRectangle.setBottom(sprite_bounding_rect.bottom())

    def _move_selection(self, dx, dy):

        if self._doEraseOnSelectionMove:

            self._erase_selection_below()
            self._doEraseOnSelectionMove = False

        if not self._selectionRectangle.isEmpty():
            self._selectionRectangle.translate(dx, dy)

    def _copy_selection(self):

        self._normalize_selection_rect()

        sprite_rect = self._canvas.map_global_rect_to_sprite_local_rect(self._selectionRectangle)

        self._selectionImage = self._canvas.sprite_object.active_surface.copy(sprite_rect)

    def _erase_selection_below(self):

        sprite_rect_to_erase = self._canvas.map_global_rect_to_sprite_local_rect(
            self._selectionRectangle)

        drawing.erase_area(self._canvas.sprite_object.active_surface,
                           sprite_rect_to_erase.left(),
                           sprite_rect_to_erase.top(),
                           sprite_rect_to_erase.width(),
                           sprite_rect_to_erase.height())

        self._canvas.surfaceChanged.emit()

    def _paste_selection(self):

        if self._selectionImage is None:
            return

        sprite_rect = self._canvas.map_global_rect_to_sprite_local_rect(self._selectionRectangle)

        painter = QPainter()
        painter.begin(self._canvas.sprite_object.active_surface)

        painter.drawImage(sprite_rect, self._selectionImage, QRect(0, 0,
                                                                   self._selectionImage.width(),
                                                                   self._selectionImage.height()))

        painter.end()

        self._canvas.surfaceChanged.emit()