示例#1
0
    def _paintLabel(self, label, xpos, ypos, painter):
        """  """

        fm = QFontMetrics(self._font)
        frect = fm.boundingRect(label)

        if self._orientation == Qt.Horizontal:
            pos = xpos
            lenght = frect.width() / 2 + frect.width() / 10
        else:
            pos = ypos
            lenght = (frect.height() / 2) - fm.descent()

        if pos > self._scaleLenght() - lenght:
            pos = self._scaleLenght() - lenght
        elif pos <= 0:
            pos = 0

        if self._orientation == Qt.Horizontal:
            if pos >= lenght:
                pos = pos - lenght
            painter.drawText( QPoint(pos, ypos), label )
        else:
            if pos == 0:
                pos = lenght*2
            else:
                pos = pos + lenght
            painter.drawText( QPoint(xpos+2, pos), label )
示例#2
0
 def sizeHint(self):
     fm = QFontMetrics(self.font())
     # FIXME: 暂时不是太懂应该怎样正确的计算 w 和 h
     # 计算 h 的一个原则是让高度正好能够显示一行
     h = max(fm.height() + fm.ascent() - fm.descent(), 14)
     w = self.width() - 4
     opt = QStyleOptionFrame()
     opt.initFrom(self)
     return self.style().sizeFromContents(
         QStyle.CT_LineEdit,
         opt,
         QSize(w, h).expandedTo(QApplication.globalStrut()),
         self
     )
示例#3
0
    def _paintHorizontal(self, painter):
        """ Paint horizontal scale """
        if self._show_labels:
            fm = QFontMetrics(self._font)
            fheight = fm.height() - fm.descent()
        else:
            fheight = 0

        if self._flip:
            y0 = fheight
            y1 = y0+3
            y11 = y0+5
            y12 = y0-1
        else:
            y0 = self.geometry().height() - fheight
            y1 = y0-3
            y11 = y0-5
            y12 = self.geometry().height()

        x0 = 0
        x1 = self._scaleLenght()
        lbls = self._labels.replace(' ', '').split(',')

        if self._show_lines:
            # base line
            painter.drawLine(x0, y0, x1, y0)

            # cent lines
            for i in range(0, self._scaleLenght() + 1):
                pos = self._calcPos(self._scale_cent * i)
                painter.drawLine(pos, y0, pos, y1)

            for lbl in lbls:
                pos = self._calcPos(int(lbl))
                painter.drawLine(pos, y0, pos, y11)

        # labels
        if self._show_labels:
            for lbl in lbls:
                pos = self._calcPos(int(lbl))
                self._paintLabel(lbl, pos, y12, painter)

            # draw units label
            x = self._scaleLenght()+1
            pen = painter.pen()
            pen.setColor(pen.color().lighter(120))
            painter.setPen(pen)
            painter.drawText( QPoint(x, y12), self._units )
示例#4
0
    def paintEvent(self, event):
        sineTable = (0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38)

        metrics = QFontMetrics(self.font())
        x = (self.width() - metrics.width(self.text)) / 2
        y = (self.height() + metrics.ascent() - metrics.descent()) / 2
        color = QColor()

        painter = QPainter(self)

        for i, ch in enumerate(self.text):
            index = (self.step + i) % 16
            color.setHsv((15 - index) * 16, 255, 191)
            painter.setPen(color)
            painter.drawText(x, y - ((sineTable[index] * metrics.height()) / 400), ch)
            x += metrics.width(ch)
示例#5
0
    def paintEvent(self, event):
        """This method draws a left sidebar

        :param event: QEvent
        """

        bottom = self.editor.viewport().height()
        font_metrics = QFontMetrics(self.editor.document().defaultFont())
        current_line = self.editor.document().findBlock(
            self.editor.textCursor().position()).blockNumber() + 1
        painter = QPainter(self)
        painter.fillRect(1, 1, self.width(),
                         self.height() - 2, QColor("#e8e8e8"))
        block = self.editor.firstVisibleBlock()
        vpoffset = self.editor.contentOffset()
        line = block.blockNumber()
        painter.setFont(self.editor.document().defaultFont())

        while block.isValid():
            line += 1
            pos = self.editor.blockBoundingGeometry(block).topLeft() + vpoffset
            if pos.y() > bottom:
                break

            # Text bold
            font = painter.font()
            if current_line == line:
                font.setBold(True)
            else:
                font.setBold(False)
            painter.setFont(font)

            if block.isVisible():
                painter.setPen(QColor("#9A9A9A"))
                fm_ascent = font_metrics.ascent()
                fm_descent = font_metrics.descent()
                painter.drawText(self.width() -
                                 font_metrics.width(str(line)) - 3,
                                 pos.y() + fm_ascent + fm_descent, str(line))

            block = block.next()
        painter.end()
        QFrame.paintEvent(self, event)
示例#6
0
 def paintEvent(self, e):
     super().paintEvent(e)
     if not self._results:
         return
     painter = QPainter(self.viewport())
     option = self.viewOptions()
     painter.setRenderHint(QPainter.Antialiasing)
     fm = QFontMetrics(option.font)
     for row, result in self._results.items():
         index, state = result
         rect = self.rectForIndex(index)
         if state is None:
             text = '⇵'
         elif state is True:
             text = '👋'
         else:
             text = '🙁'
         x = rect.width() - 20 + rect.x()
         # 让字垂直居中
         y = (rect.height() + fm.ascent() - fm.descent()) / 2 + rect.y()
         topleft = QPoint(x, y)
         painter.drawText(topleft, text)
示例#7
0
 def paintEvent(self, e):
     super().paintEvent(e)
     if not self._results:
         return
     painter = QPainter(self.viewport())
     option = self.viewOptions()
     painter.setRenderHint(QPainter.Antialiasing)
     fm = QFontMetrics(option.font)
     for row, result in self._results.items():
         index, state = result
         rect = self.rectForIndex(index)
         if state is None:
             text = '😶'
         elif state is True:
             text = '👋'
         else:
             text = '🙁'
         x = rect.width() - 20 + rect.x()
         # 让字垂直居中
         y = (rect.height() + fm.ascent() - fm.descent()) / 2 + rect.y()
         topleft = QPoint(x, y)
         painter.drawText(topleft, text)
示例#8
0
 def paintEvent(self, event):
     painter = QPainter(self)
     painter.setRenderHint(QPainter.Antialiasing)
     # 背景白色
     painter.fillRect(event.rect(), QBrush(Qt.white))
     # 绘制边缘虚线框
     painter.setPen(Qt.DashLine)
     painter.setBrush(Qt.NoBrush)
     painter.drawRect(self.rect())
     # 随机画条线
     for _ in range(3):
         painter.setPen(QPen(QTCOLORLIST[qrand() % 5], 1, Qt.SolidLine))
         painter.setBrush(Qt.NoBrush)
         painter.drawLine(QPoint(0,
                                 qrand() % self.height()),
                          QPoint(self.width(),
                                 qrand() % self.height()))
         painter.drawLine(QPoint(qrand() % self.width(), 0),
                          QPoint(qrand() % self.width(), self.height()))
     # 绘制噪点
     painter.setPen(Qt.DotLine)
     painter.setBrush(Qt.NoBrush)
     for _ in range(self.width()):  # 绘制噪点
         painter.drawPoint(
             QPointF(qrand() % self.width(),
                     qrand() % self.height()))
     # super(WidgetCode, self).paintEvent(event)  # 绘制文字
     # 绘制跳动文字
     metrics = QFontMetrics(self.font())
     x = (self.width() - metrics.width(self.text())) / 2
     y = (self.height() + metrics.ascent() - metrics.descent()) / 2
     for i, ch in enumerate(self.text()):
         index = (self.step + i) % 16
         painter.setPen(TCOLORLIST[qrand() % 6])
         painter.drawText(x,
                          y - ((SINETABLE[index] * metrics.height()) / 400),
                          ch)
         x += metrics.width(ch)
示例#9
0
    def paintEvent(self, event):
        page_bottom = self.edit.viewport().height()
        font_metrics = QFontMetrics(self.edit.document().defaultFont())
        current_block = self.edit.document().findBlock(
            self.edit.textCursor().position())
        pattern = self.pat if self.edit.lang == "python" else self.patNotPython

        painter = QPainter(self)
        background = resources.CUSTOM_SCHEME.get('sidebar-background',
            resources.COLOR_SCHEME['sidebar-background'])
        foreground = resources.CUSTOM_SCHEME.get('sidebar-foreground',
            resources.COLOR_SCHEME['sidebar-foreground'])
        pep8color = resources.CUSTOM_SCHEME.get('pep8-underline',
            resources.COLOR_SCHEME['pep8-underline'])
        errorcolor = resources.CUSTOM_SCHEME.get('error-underline',
            resources.COLOR_SCHEME['error-underline'])
        migrationcolor = resources.CUSTOM_SCHEME.get('migration-underline',
            resources.COLOR_SCHEME['migration-underline'])
        painter.fillRect(self.rect(), QColor(background))

        block = self.edit.firstVisibleBlock()
        viewport_offset = self.edit.contentOffset()
        line_count = block.blockNumber()
        painter.setFont(self.edit.document().defaultFont())
        while block.isValid():
            line_count += 1
            # The top left position of the block in the document
            position = self.edit.blockBoundingGeometry(block).topLeft() + \
                viewport_offset
            # Check if the position of the block is outside of the visible area
            if position.y() > page_bottom:
                break

            # Set the Painter Pen depending on special lines
            error = False
            if settings.CHECK_STYLE and \
               ((line_count - 1) in self._pep8Lines):
                painter.setPen(QColor(pep8color))
                font = painter.font()
                font.setItalic(True)
                font.setUnderline(True)
                painter.setFont(font)
                error = True
            elif settings.FIND_ERRORS and \
                 ((line_count - 1) in self._errorsLines):
                painter.setPen(QColor(errorcolor))
                font = painter.font()
                font.setItalic(True)
                font.setUnderline(True)
                painter.setFont(font)
                error = True
            elif settings.SHOW_MIGRATION_TIPS and \
                 ((line_count - 1) in self._migrationLines):
                painter.setPen(QColor(migrationcolor))
                font = painter.font()
                font.setItalic(True)
                font.setUnderline(True)
                painter.setFont(font)
                error = True
            else:
                painter.setPen(QColor(foreground))

            # We want the line number for the selected line to be bold.
            bold = False
            if block == current_block:
                bold = True
                font = painter.font()
                font.setBold(True)
                painter.setFont(font)

            # Draw the line number right justified at the y position of the
            # line. 3 is a magic padding number. drawText(x, y, text).
            if block.isVisible():
                painter.drawText(self.width() - self.foldArea -
                    font_metrics.width(str(line_count)) - 3,
                    round(position.y()) + font_metrics.ascent() +
                    font_metrics.descent() - 1,
                    str(line_count))

            # Remove the bold style if it was set previously.
            if bold:
                font = painter.font()
                font.setBold(False)
                painter.setFont(font)
            if error:
                font = painter.font()
                font.setItalic(False)
                font.setUnderline(False)
                painter.setFont(font)

            block = block.next()

        self.highest_line = line_count

        #Code Folding
        xofs = self.width() - self.foldArea
        painter.fillRect(xofs, 0, self.foldArea, self.height(),
                QColor(resources.CUSTOM_SCHEME.get('fold-area',
                resources.COLOR_SCHEME['fold-area'])))
        if self.foldArea != self.rightArrowIcon.width():
            polygon = QPolygonF()

            self.rightArrowIcon = QPixmap(self.foldArea, self.foldArea)
            self.rightArrowIcon.fill(Qt.transparent)
            self.downArrowIcon = QPixmap(self.foldArea, self.foldArea)
            self.downArrowIcon.fill(Qt.transparent)

            polygon.append(QPointF(self.foldArea * 0.4, self.foldArea * 0.25))
            polygon.append(QPointF(self.foldArea * 0.4, self.foldArea * 0.75))
            polygon.append(QPointF(self.foldArea * 0.8, self.foldArea * 0.5))
            iconPainter = QPainter(self.rightArrowIcon)
            iconPainter.setRenderHint(QPainter.Antialiasing)
            iconPainter.setPen(Qt.NoPen)
            iconPainter.setBrush(QColor(
                resources.CUSTOM_SCHEME.get('fold-arrow',
                resources.COLOR_SCHEME['fold-arrow'])))
            iconPainter.drawPolygon(polygon)

            polygon.clear()
            polygon.append(QPointF(self.foldArea * 0.25, self.foldArea * 0.4))
            polygon.append(QPointF(self.foldArea * 0.75, self.foldArea * 0.4))
            polygon.append(QPointF(self.foldArea * 0.5, self.foldArea * 0.8))
            iconPainter = QPainter(self.downArrowIcon)
            iconPainter.setRenderHint(QPainter.Antialiasing)
            iconPainter.setPen(Qt.NoPen)
            iconPainter.setBrush(QColor(
                resources.CUSTOM_SCHEME.get('fold-arrow',
                resources.COLOR_SCHEME['fold-arrow'])))
            iconPainter.drawPolygon(polygon)

        block = self.edit.firstVisibleBlock()
        while block.isValid():
            position = self.edit.blockBoundingGeometry(
                block).topLeft() + viewport_offset
            #Check if the position of the block is outside of the visible area
            if position.y() > page_bottom:
                break

            if pattern.match(block.text()) and block.isVisible():
                if block.blockNumber() in self._foldedBlocks:
                    painter.drawPixmap(xofs, round(position.y()),
                        self.rightArrowIcon)
                else:
                    painter.drawPixmap(xofs, round(position.y()),
                        self.downArrowIcon)
            #Add Bookmarks and Breakpoint
            elif block.blockNumber() in self._breakpoints:
                linear_gradient = QLinearGradient(
                    xofs, round(position.y()),
                    xofs + self.foldArea, round(position.y()) + self.foldArea)
                linear_gradient.setColorAt(0, QColor(255, 11, 11))
                linear_gradient.setColorAt(1, QColor(147, 9, 9))
                painter.setRenderHints(QPainter.Antialiasing, True)
                painter.setPen(Qt.NoPen)
                painter.setBrush(QBrush(linear_gradient))
                painter.drawEllipse(
                    xofs + 1,
                    round(position.y()) + 6,
                    self.foldArea - 1, self.foldArea - 1)
            elif block.blockNumber() in self._bookmarks:
                linear_gradient = QLinearGradient(
                    xofs, round(position.y()),
                    xofs + self.foldArea, round(position.y()) + self.foldArea)
                linear_gradient.setColorAt(0, QColor(13, 62, 243))
                linear_gradient.setColorAt(1, QColor(5, 27, 106))
                painter.setRenderHints(QPainter.Antialiasing, True)
                painter.setPen(Qt.NoPen)
                painter.setBrush(QBrush(linear_gradient))
                painter.drawRoundedRect(
                    xofs + 1,
                    round(position.y()) + 6,
                    self.foldArea - 2, self.foldArea - 1,
                    3, 3)

            block = block.next()# block = next(block)

        painter.end()
        super(SidebarWidget, self).paintEvent(event)
示例#10
0
    def paintEvent(self, event):
        page_bottom = self.edit.viewport().height()
        font_metrics = QFontMetrics(self.edit.document().defaultFont())
        current_block = self.edit.document().findBlock(
            self.edit.textCursor().position())
        pattern = self.pat if self.edit.lang == "python" else self.patNotPython

        painter = QPainter(self)
        background = resources.CUSTOM_SCHEME.get(
            'sidebar-background', resources.COLOR_SCHEME['sidebar-background'])
        foreground = resources.CUSTOM_SCHEME.get(
            'sidebar-foreground', resources.COLOR_SCHEME['sidebar-foreground'])
        background_selected = resources.CUSTOM_SCHEME.get(
            'sidebar-selected-background',
            resources.COLOR_SCHEME['sidebar-selected-background'])
        foreground_selected = resources.CUSTOM_SCHEME.get(
            'sidebar-selected-foreground',
            resources.COLOR_SCHEME['sidebar-selected-foreground'])
        painter.fillRect(self.rect(), QColor(background))

        block = self.edit.firstVisibleBlock()
        viewport_offset = self.edit.contentOffset()
        line_count = block.blockNumber()
        painter.setFont(self.edit.document().defaultFont())

        xofs = self.width() - self.foldArea
        painter.fillRect(
            xofs, 0, self.foldArea, self.height(),
            QColor(
                resources.CUSTOM_SCHEME.get(
                    'fold-area', resources.COLOR_SCHEME['fold-area'])))

        while block.isValid():
            line_count += 1
            # The top left position of the block in the document
            position = self.edit.blockBoundingGeometry(block).topLeft() + \
                viewport_offset
            # Check if the position of the block is outside of the visible area
            if position.y() > page_bottom:
                break

            # Set the Painter Pen depending on special lines
            painter.setPen(QColor(foreground))
            error = False
            checkers = self._neditable.sorted_checkers
            for items in checkers:
                checker, color, _ = items
                if (line_count - 1) in checker.checks:
                    painter.setPen(QColor(color))
                    font = painter.font()
                    font.setItalic(True)
                    font.setUnderline(True)
                    painter.setFont(font)
                    error = True
                    break

            # We want the line number for the selected line to be bold.
            bold = False
            if block == current_block:
                painter.fillRect(
                    0,
                    round(position.y()) + font_metrics.descent(), self.width(),
                    font_metrics.ascent() + font_metrics.descent(),
                    QColor(background_selected))

                bold = True
                font = painter.font()
                font.setBold(True)
                if not error:
                    painter.setPen(QColor(foreground_selected))
                painter.setFont(font)

            # Draw the line number right justified at the y position of the
            # line. 3 is a magic padding number. drawText(x, y, text).
            if block.isVisible():
                painter.drawText(
                    self.width() - self.foldArea -
                    font_metrics.width(str(line_count)) - 3,
                    round(position.y()) + font_metrics.ascent() +
                    font_metrics.descent() - 1, str(line_count))

            # Remove the bold style if it was set previously.
            if bold:
                font = painter.font()
                font.setBold(False)
                painter.setFont(font)
            if error:
                font = painter.font()
                font.setItalic(False)
                font.setUnderline(False)
                painter.setFont(font)

            block = block.next()

        self.highest_line = line_count

        #Code Folding
        if self.foldArea != self.rightArrowIcon.width():
            polygon = QPolygonF()

            self.rightArrowIcon = QPixmap(self.foldArea, self.foldArea)
            self.rightArrowIcon.fill(Qt.transparent)
            self.downArrowIcon = QPixmap(self.foldArea, self.foldArea)
            self.downArrowIcon.fill(Qt.transparent)

            polygon.append(QPointF(self.foldArea * 0.4, self.foldArea * 0.25))
            polygon.append(QPointF(self.foldArea * 0.4, self.foldArea * 0.75))
            polygon.append(QPointF(self.foldArea * 0.8, self.foldArea * 0.5))
            iconPainter = QPainter(self.rightArrowIcon)
            iconPainter.setRenderHint(QPainter.Antialiasing)
            iconPainter.setPen(Qt.NoPen)
            iconPainter.setBrush(
                QColor(
                    resources.CUSTOM_SCHEME.get(
                        'fold-arrow', resources.COLOR_SCHEME['fold-arrow'])))
            iconPainter.drawPolygon(polygon)

            polygon.clear()
            polygon.append(QPointF(self.foldArea * 0.25, self.foldArea * 0.4))
            polygon.append(QPointF(self.foldArea * 0.75, self.foldArea * 0.4))
            polygon.append(QPointF(self.foldArea * 0.5, self.foldArea * 0.8))
            iconPainter = QPainter(self.downArrowIcon)
            iconPainter.setRenderHint(QPainter.Antialiasing)
            iconPainter.setPen(Qt.NoPen)
            iconPainter.setBrush(
                QColor(
                    resources.CUSTOM_SCHEME.get(
                        'fold-arrow', resources.COLOR_SCHEME['fold-arrow'])))
            iconPainter.drawPolygon(polygon)

            self.calculate_docstring_block_fold()

        block = self.edit.firstVisibleBlock()
        while block.isValid():
            position = self.edit.blockBoundingGeometry(
                block).topLeft() + viewport_offset
            #Check if the position of the block is outside of the visible area
            if position.y() > page_bottom:
                break

            if pattern.match(block.text()) and block.isVisible():
                can_fold = True
                if self.patComment.match(block.text()) and \
                   (block.blockNumber() in self._endDocstringBlocks):
                    can_fold = False

                if can_fold:
                    if block.blockNumber() in self.foldedBlocks:
                        painter.drawPixmap(xofs, round(position.y()),
                                           self.rightArrowIcon)
                    else:
                        painter.drawPixmap(xofs, round(position.y()),
                                           self.downArrowIcon)
            #Add Bookmarks and Breakpoint
            if block.blockNumber() in self.breakpoints:
                linear_gradient = QLinearGradient(
                    xofs, round(position.y()), xofs + self.foldArea,
                    round(position.y()) + self.foldArea)
                linear_gradient.setColorAt(0, QColor(255, 11, 11))
                linear_gradient.setColorAt(1, QColor(147, 9, 9))
                painter.setRenderHints(QPainter.Antialiasing, True)
                painter.setPen(Qt.NoPen)
                painter.setBrush(QBrush(linear_gradient))
                painter.drawEllipse(xofs + 1,
                                    round(position.y()) + 6, self.foldArea - 1,
                                    self.foldArea - 1)
            elif block.blockNumber() in self.bookmarks:
                linear_gradient = QLinearGradient(
                    xofs, round(position.y()), xofs + self.foldArea,
                    round(position.y()) + self.foldArea)
                linear_gradient.setColorAt(0, QColor(13, 62, 243))
                linear_gradient.setColorAt(1, QColor(5, 27, 106))
                painter.setRenderHints(QPainter.Antialiasing, True)
                painter.setPen(Qt.NoPen)
                painter.setBrush(QBrush(linear_gradient))
                painter.drawRoundedRect(xofs + 1,
                                        round(position.y()) + 6,
                                        self.foldArea - 2, self.foldArea - 1,
                                        3, 3)

            block = block.next()

        painter.end()
        super(SidebarWidget, self).paintEvent(event)
示例#11
0
    def paintEvent(self, event):
        if self.p:
            if self.p.isNull():
                vid_info = "{}".format(self.parent.video)
                self.logger.warning(
                    "QPixmap self.p was NULL, replacing with 'Thumbnail N/A' image! Video: {}"
                    .format(vid_info))
                self.p = QPixmap(THUMBNAIL_NA_PATH)

            painter = QPainter(self)

            if read_config('Gui', 'keep_thumb_ar'):
                thumb = self.p.scaled(self.width(), self.height(),
                                      Qt.KeepAspectRatio,
                                      Qt.SmoothTransformation)
                painter.drawPixmap(0, 0, thumb)
            else:
                thumb = self
                painter.drawPixmap(thumb.rect(), thumb.p)

            # Overlay video duration on thumbnail
            font = QFont()
            font.fromString(
                read_config("Fonts",
                            "video_thumbnail_overlay_font",
                            literal_eval=False))

            pen = QPen(Qt.white)
            painter.setPen(pen)
            painter.setFont(font)

            duration_right_padding = read_config('GridView',
                                                 'duration_right_padding')
            duration_bottom_padding = read_config('GridView',
                                                  'duration_bottom_padding')

            point = QPoint(thumb.width() - duration_right_padding,
                           thumb.height() - duration_bottom_padding)
            metrics = QFontMetrics(font)
            duration_string = format(self.parent.video.duration)
            # Find out the width of the text
            text_width = metrics.width(duration_string)
            # Work out the max height the text can be
            text_height = metrics.descent() + metrics.ascent()
            # Add a padding of 8px (4px on left, 4px on right) for width
            rect_width = text_width + 8
            # Add a padding of 4px (2px on top, 2px on bottom) for height
            rect_height = text_height + 4
            # Create a rectangle
            # point starts at the bottom right so we need to use negative sizes
            # because we need to move closer to 0,0 again
            rect = QRect(point, QSize(-rect_width, -rect_height))
            painter.fillRect(rect, QBrush(QColor(0, 0, 0, 180)))
            painter.drawText(rect, Qt.AlignCenter, duration_string)

            # Overlay captions (if any) on thumbnail    # FIXME: Replace with something better like a small icon
            if self.parent.video.has_caption and read_config(
                    'GridView', 'show_has_captions'):
                pen = QPen(Qt.white)
                painter.setPen(pen)
                painter.setFont(font)

                captions_left_padding = read_config('GridView',
                                                    'captions_left_padding')
                captions_bottom_padding = read_config(
                    'GridView', 'captions_bottom_padding')

                point = QPoint(captions_left_padding,
                               thumb.height() - captions_bottom_padding)
                metrics = QFontMetrics(font)
                text_width = metrics.width("captions")
                text_height = metrics.descent() + metrics.ascent()
                rect_width = text_width + 8
                rect_height = text_height + 4

                rect = QRect(point, QSize(rect_width, -rect_height))
                painter.fillRect(rect, QBrush(QColor(0, 0, 0, 180)))
                painter.drawText(rect, Qt.AlignCenter, "captions")

            if self.parent.video.definition == "sd" and read_config(
                    'GridView', 'show_sd_warning'):
                pen = QPen(Qt.red)
                painter.setPen(pen)
                painter.setFont(font)

                sd_left_padding = 4
                sd_top_padding = 4

                point = QPoint(sd_left_padding, sd_top_padding)
                metrics = QFontMetrics(font)
                text_width = metrics.width("SD")
                text_height = metrics.descent() + metrics.ascent()
                rect_width = text_width + 4
                rect_height = text_height + 4

                rect = QRect(point, QSize(rect_width, rect_height))
                painter.fillRect(rect, QBrush(QColor(0, 0, 0, 180)))
                painter.drawText(rect, Qt.AlignCenter, "SD")

            self.add_overlay(painter, thumb)