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 )
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 )
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 )
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)
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)
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)
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)
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)
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)
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)
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)