Ejemplo n.º 1
0
    def wheelEvent(self, event):
        modifiers = QApplication.queryKeyboardModifiers()
        if modifiers == Qt.ControlModifier:
            if event.angleDelta().y() > 0:
                self.appdata.project.maps[
                    self.name]["bg-size"] *= INCREASE_FACTOR
            else:
                self.appdata.project.maps[
                    self.name]["bg-size"] *= DECREASE_FACTOR

            self.mapChanged.emit("dummy")
            self.update()

        if event.angleDelta().y() > 0:
            self.zoom_in()
        else:
            self.zoom_out()
Ejemplo n.º 2
0
 def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent):
     modifiers = QApplication.queryKeyboardModifiers()
     if modifiers == Qt.ControlModifier:
         if self.drag:
             point = event.pos()
             move_x = self.drag_start.x() - point.x()
             move_y = self.drag_start.y() - point.y()
             self.drag_start = point
             for key, val in self.appdata.project.maps[
                     self.name]["boxes"].items():
                 self.appdata.project.maps[self.name]["boxes"][key] = (
                     val[0] - move_x, val[1] - move_y)
             self.mapChanged.emit("dummy")
             self.update()
     else:
         if self.drag:
             self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
             self.translate(1, 1)
         super(MapView, self).mouseMoveEvent(event)
Ejemplo n.º 3
0
    def paintEvent(self, event):
        """
        Override Qt method.
        Painting the scroll flag area

        There is two cases:
            - The scroll bar is moving, in which case paint all flags.
            - The scroll bar is not moving, only paint flags corresponding
              to visible lines.
        """
        # The area in which the slider handle of the scrollbar may move.
        groove_rect = self.get_scrollbar_groove_rect()
        # The scrollbar's scale factor ratio between pixel span height and
        # value span height
        scale_factor = groove_rect.height() / self.get_scrollbar_value_height()
        # The vertical offset of the scroll flag area relative to the
        # top of the text editor.
        offset = groove_rect.y()

        # Note that we calculate the pixel metrics required to draw the flags
        # here instead of using the convenience methods of the ScrollFlagArea
        # for performance reason.
        rect_x = ceil(self.FLAGS_DX / 2)
        rect_w = self.WIDTH - self.FLAGS_DX
        rect_h = self.FLAGS_DY

        # Fill the whole painting area
        painter = QPainter(self)
        painter.fillRect(event.rect(), self.editor.sideareas_color)

        editor = self.editor

        # Define compute_flag_ypos to position the flags:
        # Paint flags for the entire document
        last_line = editor.document().lastBlock().firstLineNumber()
        # The 0.5 offset is used to align the flags with the center of
        # their corresponding text edit block before scaling.
        first_y_pos = self.value_to_position(0.5, scale_factor,
                                             offset) - self.FLAGS_DY / 2
        last_y_pos = self.value_to_position(last_line + 0.5, scale_factor,
                                            offset) - self.FLAGS_DY / 2

        def compute_flag_ypos(block):
            line_number = block.firstLineNumber()
            if editor.verticalScrollBar().maximum() == 0:
                geometry = editor.blockBoundingGeometry(block)
                pos = geometry.y() + geometry.height() / 2 + self.FLAGS_DY / 2
            elif last_line != 0:
                frac = line_number / last_line
                pos = first_y_pos + frac * (last_y_pos - first_y_pos)
            else:
                pos = first_y_pos
            return ceil(pos)

        # All the lists of block numbers for flags
        dict_flag_lists = {
            "occurrence": editor.occurrences,
            "found_results": editor.found_results
        }
        dict_flag_lists.update(self._dict_flag_list)

        for flag_type in dict_flag_lists:
            painter.setBrush(self._facecolors[flag_type])
            painter.setPen(self._edgecolors[flag_type])
            for block_number in dict_flag_lists[flag_type]:
                # Find the block
                block = editor.document().findBlockByNumber(block_number)
                if not block.isValid():
                    continue
                # paint if everything else is fine
                rect_y = compute_flag_ypos(block)
                painter.drawRect(rect_x, rect_y, rect_w, rect_h)

        # Paint the slider range
        if not self._unit_testing:
            alt = QApplication.queryKeyboardModifiers() & Qt.AltModifier
        else:
            alt = self._alt_key_is_down

        if self.slider:
            cursor_pos = self.mapFromGlobal(QCursor().pos())
            is_over_self = self.rect().contains(cursor_pos)
            is_over_editor = editor.rect().contains(
                editor.mapFromGlobal(QCursor().pos()))
            # We use QRect.contains instead of QWidget.underMouse method to
            # determined if the cursor is over the editor or the flag scrollbar
            # because the later gives a wrong result when a mouse button
            # is pressed.
            if is_over_self or (alt and is_over_editor):
                painter.setPen(self._slider_range_color)
                painter.setBrush(self._slider_range_brush)
                x, y, width, height = self.make_slider_range(
                    cursor_pos, scale_factor, offset, groove_rect)
                painter.drawRect(x, y, width, height)
                self._range_indicator_is_visible = True
            else:
                self._range_indicator_is_visible = False
Ejemplo n.º 4
0
    def paintEvent(self, event):
        """
        Override Qt method.
        Painting the scroll flag area
        """
        make_flag = self.make_flag_qrect

        # Fill the whole painting area
        painter = QPainter(self)
        painter.fillRect(event.rect(), self.editor.sideareas_color)

        # Paint warnings and todos
        block = self.editor.document().firstBlock()
        for line_number in range(self.editor.document().blockCount() + 1):
            data = block.userData()
            if data:
                if data.code_analysis:
                    # Paint the warnings
                    color = self.editor.warning_color
                    for source, code, severity, message in data.code_analysis:
                        error = severity == DiagnosticSeverity.ERROR
                        if error:
                            color = self.editor.error_color
                            break
                    self.set_painter(painter, color)
                    painter.drawRect(make_flag(line_number))
                if data.todo:
                    # Paint the todos
                    self.set_painter(painter, self.editor.todo_color)
                    painter.drawRect(make_flag(line_number))
                if data.breakpoint:
                    # Paint the breakpoints
                    self.set_painter(painter, self.editor.breakpoint_color)
                    painter.drawRect(make_flag(line_number))
            block = block.next()

        # Paint the occurrences
        if self.editor.occurrences:
            self.set_painter(painter, self.editor.occurrence_color)
            for line_number in self.editor.occurrences:
                painter.drawRect(make_flag(line_number))

        # Paint the found results
        if self.editor.found_results:
            self.set_painter(painter, self.editor.found_results_color)
            for line_number in self.editor.found_results:
                painter.drawRect(make_flag(line_number))

        # Paint the slider range
        if not self._unit_testing:
            alt = QApplication.queryKeyboardModifiers() & Qt.AltModifier
        else:
            alt = self._alt_key_is_down
        cursor_pos = self.mapFromGlobal(QCursor().pos())
        is_over_self = self.rect().contains(cursor_pos)
        is_over_editor = self.editor.rect().contains(
            self.editor.mapFromGlobal(QCursor().pos()))
        # We use QRect.contains instead of QWidget.underMouse method to
        # determined if the cursor is over the editor or the flag scrollbar
        # because the later gives a wrong result when a mouse button
        # is pressed.
        if ((is_over_self or (alt and is_over_editor)) and self.slider):
            pen_color = QColor(Qt.gray)
            pen_color.setAlphaF(.85)
            painter.setPen(pen_color)
            brush_color = QColor(Qt.gray)
            brush_color.setAlphaF(.5)
            painter.setBrush(QBrush(brush_color))
            painter.drawRect(self.make_slider_range(cursor_pos))
            self._range_indicator_is_visible = True
        else:
            self._range_indicator_is_visible = False
Ejemplo n.º 5
0
    def paintEvent(self, event):
        """
        Override Qt method.
        Painting the scroll flag area

        There is two cases:
            - The scroll bar is moving, in which case paint all flags.
            - The scroll bar is not moving, only paint flags corresponding
              to visible lines.
        """
        # The area in which the slider handle of the scrollbar may move.
        groove_rect = self.get_scrollbar_groove_rect()
        # The scrollbar's scale factor ratio between pixel span height and
        # value span height
        scale_factor = groove_rect.height() / self.get_scrollbar_value_height()
        # The vertical offset of the scroll flag area relative to the
        # top of the text editor.
        offset = groove_rect.y()

        # Note that we calculate the pixel metrics required to draw the flags
        # here instead of using the convenience methods of the ScrollFlagArea
        # for performance reason.

        rect_x = ceil(self.FLAGS_DX / 2)
        rect_w = self.WIDTH - self.FLAGS_DX
        rect_h = self.FLAGS_DY

        # Fill the whole painting area
        painter = QPainter(self)
        painter.fillRect(event.rect(), self.editor.sideareas_color)

        editor = self.editor
        # Check if the slider is visible
        paint_local = not bool(self.slider)

        # Define compute_flag_ypos to position the flags:
        if not paint_local:
            # Paint flags for the entire document
            last_line = editor.document().lastBlock().firstLineNumber()
            # The 0.5 offset is used to align the flags with the center of
            # their corresponding text edit block before scaling.
            first_y_pos = self.value_to_position(
                0.5, scale_factor, offset) - self.FLAGS_DY / 2
            last_y_pos = self.value_to_position(
                last_line + 0.5, scale_factor, offset) - self.FLAGS_DY / 2

            def compute_flag_ypos(block):
                line_number = block.firstLineNumber()
                frac = line_number / last_line
                pos = first_y_pos + frac * (last_y_pos - first_y_pos)
                return ceil(pos)

        else:
            # Only paint flags for visible lines
            visible_lines = [val[1] for val in editor.visible_blocks]
            if not visible_lines:
                # Nothing to do
                return
            min_line = min(visible_lines)
            max_line = max(visible_lines)

            def compute_flag_ypos(block):
                # When the vertical scrollbar is not visible, the flags are
                # vertically aligned with the center of their corresponding
                # text block with no scaling.
                top = editor.blockBoundingGeometry(block).translated(
                    editor.contentOffset()).top()
                bottom = top + editor.blockBoundingRect(block).height()
                middle = (top + bottom)/2

                return ceil(middle-self.FLAGS_DY/2)

        def should_paint_block(block):
            """Check if the block should be painted."""
            if not block.isValid():
                return False
            # Don't paint local flags outside of the window
            if paint_local and not (
                    min_line <= block.blockNumber() + 1 <= max_line):
                return False
            return True

        # Paint all the code analysis flags
        for block, data in self._code_analysis_list:
            if not should_paint_block(block):
                continue
            # Paint the warnings
            for source, code, severity, message in data.code_analysis:
                error = severity == DiagnosticSeverity.ERROR
                if error:
                    painter.setBrush(self._facecolors['error'])
                    painter.setPen(self._edgecolors['error'])
                    break
            else:
                painter.setBrush(self._facecolors['warning'])
                painter.setPen(self._edgecolors['warning'])

            rect_y = compute_flag_ypos(block)
            painter.drawRect(rect_x, rect_y, rect_w, rect_h)

        # Paint all the todo flags
        for block, data in self._todo_list:
            if not should_paint_block(block):
                continue
            # Paint the todos
            rect_y = compute_flag_ypos(block)
            painter.setBrush(self._facecolors['todo'])
            painter.setPen(self._edgecolors['todo'])
            painter.drawRect(rect_x, rect_y, rect_w, rect_h)

        # Paint all the breakpoints flags
        for block, data in self._breakpoint_list:
            if not should_paint_block(block):
                continue
            # Paint the breakpoints
            rect_y = compute_flag_ypos(block)
            painter.setBrush(self._facecolors['breakpoint'])
            painter.setPen(self._edgecolors['breakpoint'])
            painter.drawRect(rect_x, rect_y, rect_w, rect_h)

        # Paint the occurrences of selected word flags
        if editor.occurrences:
            painter.setBrush(self._facecolors['occurrence'])
            painter.setPen(self._edgecolors['occurrence'])
            for line_number in editor.occurrences:
                if paint_local and not (
                        min_line <= line_number + 1 <= max_line):
                    continue
                block = editor.document().findBlockByNumber(line_number)
                rect_y = compute_flag_ypos(block)
                painter.drawRect(rect_x, rect_y, rect_w, rect_h)

        # Paint the found results flags
        if editor.found_results:
            painter.setBrush(self._facecolors['found_results'])
            painter.setPen(self._edgecolors['found_results'])
            for line_number in editor.found_results:
                if paint_local and not (
                        min_line <= line_number + 1 <= max_line):
                    continue
                block = editor.document().findBlockByNumber(line_number)
                rect_y = compute_flag_ypos(block)
                painter.drawRect(rect_x, rect_y, rect_w, rect_h)

        # Paint the slider range
        if not self._unit_testing:
            alt = QApplication.queryKeyboardModifiers() & Qt.AltModifier
        else:
            alt = self._alt_key_is_down

        if self.slider:
            cursor_pos = self.mapFromGlobal(QCursor().pos())
            is_over_self = self.rect().contains(cursor_pos)
            is_over_editor = editor.rect().contains(
                editor.mapFromGlobal(QCursor().pos()))
            # We use QRect.contains instead of QWidget.underMouse method to
            # determined if the cursor is over the editor or the flag scrollbar
            # because the later gives a wrong result when a mouse button
            # is pressed.
            if is_over_self or (alt and is_over_editor):
                painter.setPen(self._slider_range_color)
                painter.setBrush(self._slider_range_brush)
                x, y, width, height = self.make_slider_range(
                    cursor_pos, scale_factor, offset, groove_rect)
                painter.drawRect(x, y, width, height)
                self._range_indicator_is_visible = True
            else:
                self._range_indicator_is_visible = False
Ejemplo n.º 6
0
    def paintEvent(self, event):
        """
        Override Qt method.
        Painting the scroll flag area
        """
        make_flag = self.make_flag_qrect

        # Fill the whole painting area
        painter = QPainter(self)
        painter.fillRect(event.rect(), self.editor.sideareas_color)

        # Paint warnings and todos
        block = self.editor.document().firstBlock()
        for line_number in range(self.editor.document().blockCount()+1):
            data = block.userData()
            if data:
                if data.code_analysis:
                    # Paint the warnings
                    color = self.editor.warning_color
                    for source, code, severity, message in data.code_analysis:
                        error = severity == DiagnosticSeverity.ERROR
                        if error:
                            color = self.editor.error_color
                            break
                    self.set_painter(painter, color)
                    painter.drawRect(make_flag(line_number))
                if data.todo:
                    # Paint the todos
                    self.set_painter(painter, self.editor.todo_color)
                    painter.drawRect(make_flag(line_number))
                if data.breakpoint:
                    # Paint the breakpoints
                    self.set_painter(painter, self.editor.breakpoint_color)
                    painter.drawRect(make_flag(line_number))
            block = block.next()

        # Paint the occurrences
        if self.editor.occurrences:
            self.set_painter(painter, self.editor.occurrence_color)
            for line_number in self.editor.occurrences:
                painter.drawRect(make_flag(line_number))

        # Paint the found results
        if self.editor.found_results:
            self.set_painter(painter, self.editor.found_results_color)
            for line_number in self.editor.found_results:
                painter.drawRect(make_flag(line_number))

        # Paint the slider range
        if not self._unit_testing:
            alt = QApplication.queryKeyboardModifiers() & Qt.AltModifier
        else:
            alt = self._alt_key_is_down
        cursor_pos = self.mapFromGlobal(QCursor().pos())
        is_over_self = self.rect().contains(cursor_pos)
        is_over_editor = self.editor.rect().contains(
                self.editor.mapFromGlobal(QCursor().pos()))
        # We use QRect.contains instead of QWidget.underMouse method to
        # determined if the cursor is over the editor or the flag scrollbar
        # because the later gives a wrong result when a mouse button
        # is pressed.
        if ((is_over_self or (alt and is_over_editor)) and self.slider):
            pen_color = QColor(Qt.gray)
            pen_color.setAlphaF(.85)
            painter.setPen(pen_color)
            brush_color = QColor(Qt.gray)
            brush_color.setAlphaF(.5)
            painter.setBrush(QBrush(brush_color))
            painter.drawRect(self.make_slider_range(cursor_pos))
            self._range_indicator_is_visible = True
        else:
            self._range_indicator_is_visible = False
Ejemplo n.º 7
0
    def paintEvent(self, event):
        """
        Override Qt method.
        Painting the scroll flag area
        """
        # The area in which the slider handle of the scrollbar may move.
        groove_rect = self.get_scrollbar_groove_rect()
        # The scrollbar's scale factor ratio between pixel span height and
        # value span height
        scale_factor = groove_rect.height() / self.get_scrollbar_value_height()
        # The vertical offset of the scroll flag area relative to the
        # top of the text editor.
        offset = groove_rect.y()

        # Note that we calculate the pixel metrics required to draw the flags
        # here instead of using the convenience methods of the ScrollFlagArea
        # for performance reason.

        rect_x = ceil(self.FLAGS_DX / 2)
        rect_w = self.WIDTH - self.FLAGS_DX
        rect_h = self.FLAGS_DY

        # Fill the whole painting area
        painter = QPainter(self)
        painter.fillRect(event.rect(), self.editor.sideareas_color)

        # Paint warnings and todos
        block = self.editor.document().firstBlock()
        for line_number in range(self.editor.document().blockCount() + 1):
            data = block.userData()
            if data:
                if data.code_analysis:
                    # Paint the warnings
                    for source, code, severity, message in data.code_analysis:
                        error = severity == DiagnosticSeverity.ERROR
                        if error:
                            painter.setBrush(self._facecolors['error'])
                            painter.setPen(self._edgecolors['error'])
                            break
                    else:
                        painter.setBrush(self._facecolors['warning'])
                        painter.setPen(self._edgecolors['warning'])

                    rect_y = self.calcul_flag_ypos(line_number, scale_factor,
                                                   offset)
                    painter.drawRect(rect_x, rect_y, rect_w, rect_h)
                if data.todo:
                    # Paint the todos
                    rect_y = self.calcul_flag_ypos(line_number, scale_factor,
                                                   offset)
                    painter.setBrush(self._facecolors['todo'])
                    painter.setPen(self._edgecolors['todo'])
                    painter.drawRect(rect_x, rect_y, rect_w, rect_h)
                if data.breakpoint:
                    # Paint the breakpoints
                    rect_y = self.calcul_flag_ypos(line_number, scale_factor,
                                                   offset)
                    painter.setBrush(self._facecolors['breakpoint'])
                    painter.setPen(self._edgecolors['breakpoint'])
                    painter.drawRect(rect_x, rect_y, rect_w, rect_h)
            block = block.next()

        # Paint the occurrences
        if self.editor.occurrences:
            painter.setBrush(self._facecolors['occurrence'])
            painter.setPen(self._edgecolors['occurrence'])
            for line_number in self.editor.occurrences:
                rect_y = self.calcul_flag_ypos(line_number, scale_factor,
                                               offset)
                painter.drawRect(rect_x, rect_y, rect_w, rect_h)

        # Paint the found results
        if self.editor.found_results:
            painter.setBrush(self._facecolors['found_results'])
            painter.setPen(self._edgecolors['found_results'])
            for line_number in self.editor.found_results:
                rect_y = self.calcul_flag_ypos(line_number, scale_factor,
                                               offset)
                painter.drawRect(rect_x, rect_y, rect_w, rect_h)

        # Paint the slider range
        if not self._unit_testing:
            alt = QApplication.queryKeyboardModifiers() & Qt.AltModifier
        else:
            alt = self._alt_key_is_down

        if self.slider:
            cursor_pos = self.mapFromGlobal(QCursor().pos())
            is_over_self = self.rect().contains(cursor_pos)
            is_over_editor = self.editor.rect().contains(
                self.editor.mapFromGlobal(QCursor().pos()))
            # We use QRect.contains instead of QWidget.underMouse method to
            # determined if the cursor is over the editor or the flag scrollbar
            # because the later gives a wrong result when a mouse button
            # is pressed.
            if is_over_self or (alt and is_over_editor):
                painter.setPen(self._slider_range_color)
                painter.setBrush(self._slider_range_brush)
                x, y, width, height = self.make_slider_range(
                    cursor_pos, scale_factor, offset, groove_rect)
                painter.drawRect(x, y, width, height)
                self._range_indicator_is_visible = True
            else:
                self._range_indicator_is_visible = False