def _plot(self, width, height, paint_device, plot_object = None, plot_method = None): if not plot_object: plot_object = self.controller if not plot_method: plot_method = plot_object.plot plot_object.setPlotWindow(width, height) canvas = DiPaintGLCanvas(paint_device) glpainter = DiPaintGLPainter(canvas) painter = QPainter() painter.begin(canvas.device()) glpainter.begin(painter) painter.setRenderHints(self.renderHints) painter.setClipRect(QRect(0, 0, width, height)) glpainter.Viewport(0, 0, width, height) value = plot_method(glpainter) transform = glpainter.transform glpainter.end() painter.end() return paint_device, value, transform
def updatecanvas(self, canvas): """ Update the canvas object for the legend background. """ if self._lastextent == canvas.extent(): return self._lastextent = canvas.extent() if QGis.QGIS_VERSION_INT > 20200: from qgis.core import QgsMapRendererParallelJob, QgsMapSettings settings = canvas.mapSettings() extent = settings.extent() settings.setOutputSize(self.size()) settings.setExtent(extent) #settings.setFlags(QgsMapSettings.Antialiasing | QgsMapSettings.DrawLabeling ) self.renderjob = QgsMapRendererParallelJob(settings) self.renderjob.finished.connect(self._renderimage) self.renderjob.start() else: if canvas.isDrawing(): return pixmap = QPixmap(self.size()) pixmap.fill(canvas.canvasColor()) painter = QPainter(pixmap) painter.setRenderHints(QPainter.Antialiasing) renderer = canvas.mapRenderer() renderer.render(painter) del painter self.canvasimage = pixmap.toImage() self.update()
def __drawActiveIblSetOverlay(self): """ Draws an overlay on :obj:`Inspector.Image_Label` Widget. """ painter = QPainter(self.Image_label.pixmap()) painter.setRenderHints(QPainter.Antialiasing) iblSetPath = self.__activeIblSet.path sectionsFileParser = self.__sectionsFileParsersCache.getContent(iblSetPath) if sectionsFileParser is None: raise foundations.exceptions.ExecutionError( "'{0}' Ibl Set file 'SectionsFileParser' instance not found!".format(iblSetPath)) for section in sectionsFileParser.sections: if section == "Sun": self.__drawLightLabel(painter, Light(name="Sun", color=[int(value) for value in sectionsFileParser.getValue( "SUNcolor", section).split(",")], uCoordinate=float(sectionsFileParser.getValue("SUNu", section)), vCoordinate=float(sectionsFileParser.getValue("SUNv", section)))) elif re.search(r"Light\d+", section): self.__drawLightLabel(painter, Light(name=sectionsFileParser.getValue( "LIGHTname", section) or self.__unnamedLightName, color=[int(value) for value in sectionsFileParser.getValue( "LIGHTcolor", section).split(",")], uCoordinate=float( sectionsFileParser.getValue("LIGHTu", section)), vCoordinate=float( sectionsFileParser.getValue("LIGHTv", section)))) painter.end()
def paintEvent(self, event): QWidget.paintEvent(self, event) if self.dataSource is None: return painter = QPainter(self) self.current_painter = painter painter.setRenderHints(QPainter.Antialiasing|QPainter.TextAntialiasing) painter.fillRect(self.rect(), Qt.white) self.dataSource.draw() del self.current_painter
def paintEvent(self, event): VideoWidget.paintEvent(self, event) if not self.is_connected: return qp = QPainter(self) qp.setRenderHints(QPainter.Antialiasing) #painter.begin(self) qp.setPen(QtGui.QColor(255, 255, 0)) self.drawCenterGrid(qp)
def createOnlineIcon(self,color): dim = QRect(0,0,32,32) img = QImage(dim.size(),QImage.Format_ARGB32) p = QPainter(img) p.setCompositionMode(QPainter.CompositionMode_Source) p.fillRect(dim,Qt.transparent) p.setCompositionMode(QPainter.CompositionMode_SourceOver) p.setRenderHints(QPainter.Antialiasing) p.setPen(Qt.black) p.setBrush(color) p.drawEllipse(dim.adjusted(1,1,-2,-2)) return img
def printer(canvas, printer): """ The main print routine. """ theScene = visible_bounding_rect(canvas.items()) theScene.adjust(-10, -10, 10, 10) painter = QPainter(printer) painter.setRenderHints(QPainter.SmoothPixmapTransform | QPainter.HighQualityAntialiasing | QPainter.TextAntialiasing) canvas.render(painter, QRectF(), theScene) painter.end()
def createOnlineIcon(self, color): dim = QRect(0, 0, 32, 32) img = QImage(dim.size(), QImage.Format_ARGB32) p = QPainter(img) p.setCompositionMode(QPainter.CompositionMode_Source) p.fillRect(dim, Qt.transparent) p.setCompositionMode(QPainter.CompositionMode_SourceOver) p.setRenderHints(QPainter.Antialiasing) p.setPen(Qt.black) p.setBrush(color) p.drawEllipse(dim.adjusted(1, 1, -2, -2)) return img
def export_scene(canvas, width, height, dpi, exportFileName): """ This function exports the scene to a file. """ # need this to make sure we take away focus from # any currently selected legend items canvas.clearFocus() with HiddenStitchManager(canvas): # NOTE: We seem to need the 1px buffer region to avoid # the image being cut off margin = 10 theScene = visible_bounding_rect(canvas.items()) theScene.adjust(-margin, -margin, margin, margin) # check if user requested an svg file svg = True if QFileInfo(exportFileName).completeSuffix() == "svg" \ else False if svg: generator = QSvgGenerator() generator.setFileName(exportFileName) generator.setSize(QSize(width, height)) generator.setViewBox(QRect(0, 0, width, height)) generator.setTitle("sconcho generated SVG image") generator.setDescription("this svg image was exported from " "a sconcho project") generator.setResolution(dpi) else: generator = QImage(width+2*margin, height+2*margin, QImage.Format_ARGB32_Premultiplied) generator.fill(1) inchesToMeter = 39.3700787 generator.setDotsPerMeterX(dpi*inchesToMeter) generator.setDotsPerMeterY(dpi*inchesToMeter) painter = QPainter(generator) painter.setRenderHints(QPainter.SmoothPixmapTransform | QPainter.HighQualityAntialiasing | QPainter.TextAntialiasing ) painter.setBackgroundMode(Qt.TransparentMode ) canvas.render(painter, QRectF(), theScene ) painter.end() if not svg: generator.save(exportFileName)
def paintEvent(self, event): #print("paint") qp = QPainter(self) qp.setRenderHints(QPainter.Antialiasing) if self.allHoles: self.drawBoard(qp, self.allHoles) else: # fill background grey qp.setPen(QtCore.Qt.gray) qp.setBrush(QtCore.Qt.gray) qp.drawRect(0, 0, self.width(), self.height()) # draw text qp.setPen(QtCore.Qt.white) qp.drawText(QRectF(0, 0, self.width(), self.height()), QtCore.Qt.AlignCenter, "Please load drill file")
def export_scene(canvas, width, height, dpi, exportFileName): """ This function exports the scene to a file. """ # need this to make sure we take away focus from # any currently selected legend items canvas.clearFocus() with HiddenStitchManager(canvas): # NOTE: We seem to need the 1px buffer region to avoid # the image being cut off margin = 10 theScene = visible_bounding_rect(canvas.items()) theScene.adjust(-margin, -margin, margin, margin) # check if user requested an svg file svg = True if QFileInfo(exportFileName).completeSuffix() == "svg" \ else False if svg: generator = QSvgGenerator() generator.setFileName(exportFileName) generator.setSize(QSize(width, height)) generator.setViewBox(QRect(0, 0, width, height)) generator.setTitle("sconcho generated SVG image") generator.setDescription("this svg image was exported from " "a sconcho project") generator.setResolution(dpi) else: generator = QImage(width + 2 * margin, height + 2 * margin, QImage.Format_ARGB32_Premultiplied) generator.fill(1) inchesToMeter = 39.3700787 generator.setDotsPerMeterX(dpi * inchesToMeter) generator.setDotsPerMeterY(dpi * inchesToMeter) painter = QPainter(generator) painter.setRenderHints(QPainter.SmoothPixmapTransform | QPainter.HighQualityAntialiasing | QPainter.TextAntialiasing) painter.setBackgroundMode(Qt.TransparentMode) canvas.render(painter, QRectF(), theScene) painter.end() if not svg: generator.save(exportFileName)
def updatecanvas(self, canvas): """ Update the canvas object for the legend background. """ if canvas.isDrawing() or self._lastextent == canvas.extent(): return self._lastextent = canvas.extent() pixmap = QPixmap(self.size()) pixmap.fill(canvas.canvasColor()) painter = QPainter(pixmap) painter.setRenderHints(QPainter.Antialiasing) renderer = canvas.mapRenderer() renderer.render(painter) del painter self.pixmap = pixmap self.update()
def paintEvent(self, event): def _drawitem(pixmap, text, itempostion): painter.drawPixmap(itempostion, pixmap) textrect = QRectF(pixmap.width() + 40, itempostion.y(), framerect.width() - pixmap.width() - 40, pixmap.height()) painter.drawText(textrect, text, QTextOption(Qt.AlignVCenter)) if not self.pixmap: return painter = QPainter(self) painter.setRenderHints(QPainter.Antialiasing) painter.drawPixmap(event.rect(), self.pixmap) rect = event.rect() framerect = QRect(rect) newwidth = (rect.width() / 100) * 40 framerect.setWidth(newwidth) painter.setBrush(self.legendareabrush) painter.setPen(self.legendareapen) painter.drawRect(framerect) self.framerect = framerect painter.setPen(Qt.black) currenty = 40 position = rect.topLeft() + QPoint(30, currenty) for layer, items in self.items.iteritems(): if len(items) == 1: itempostion = QPoint(position) itempostion.setY(currenty) _drawitem(items[0][1], layer, itempostion) currenty += 40 else: for text, icon in items: if not text: continue itempostion = QPoint(position) itempostion.setY(currenty) _drawitem(icon, text, itempostion) currenty += 40 position.setY(currenty + 40)
def paintEvent(self, event): bgcol = QColor('#111') if self.panic: fgcol = QColor('#e11') else: fgcol = QColor('#ddd') # Size and shit w, h = self.width(), self.height() minsize = min(w,h)*self.scale arcwidth = minsize*0.1 minsize *= 0.86 marginx = (w-minsize)/2 marginy = (h-minsize)/2 # Start drawing shit painter = QPainter(self) painter.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing) painter.setPen(QPen(fgcol, arcwidth, cap=Qt.FlatCap)) #font = QFont('sv basic manual') font = QFont('bank gothic') font.setPointSize(get_font_size(font, minsize-2*arcwidth)) smallfont = QFont(font) smallfont.setPointSizeF(font.pointSize()/2) painter.fillRect(QRectF(0,0,w,h), bgcol) # Timer dial thingy painter.setOpacity(0.05) painter.drawArc(marginx,marginy, minsize,minsize, 0, 5760) painter.setOpacity(1) arclength = min(1, self.totalseconds/self.panictime) * 5760 painter.drawArc(marginx,marginy, minsize,minsize, 90*16, -arclength) # Timer text painter.setFont(font) textoptions = QtGui.QTextOption(Qt.AlignCenter) painter.drawText(QRectF(marginx, marginy, minsize, minsize), self.get_text(0), textoptions) painter.setFont(smallfont) painter.setOpacity(0.5) painter.drawText(QRectF(marginx, marginy+minsize*0.4, minsize, minsize/2), self.get_text(1), textoptions) #painter.setOpacity(0.15) #painter.drawText(QRectF(marginx, marginy+minsize*0.05, minsize, minsize/2), # self.get_text(2), textoptions) painter.end()
def punchcard(ui, repo, *pats, **opts): """Generate a "punch card" graph of commit times. For drawing the graph, either PyQt4 or matplotlib can be used. The default is PyQt4, unless the --mpl option is given. Normally, all commits are registered in local time, so that commits at 10 AM local time in Europe and the USA show up on the same punch card entry. If --utc is given, all commit times are converted to UTC before registered. """ if pats: raise util.Abort('no argument allowed') filename = opts['filename'] if opts['datemin']: datemin = datetime.strptime(opts['datemin'], '%Y-%m-%d') else: datemin = None if opts['datemax']: datemax = datetime.strptime(opts['datemax'], '%Y-%m-%d') else: datemax = None users_include = set(opts['user']) users_exclude = set(opts['notuser']) user_filter = bool(users_include or users_exclude) title = opts.get('title') font = opts.get('font') or 'Arial' utc = opts.get('utc') data = [[0] * 24 for i in range(7)] cl = repo.changelog n = 0 ui.status('filtering changesets\n') for i in xrange(len(cl)): node = cl.read(cl.node(i)) # node[2] is a tuple of the date in UTC and the timezone offset. # If --utc is given, the offset can be ignored; otherwise if utc: date = datetime.utcfromtimestamp(node[2][0]) else: date = datetime.utcfromtimestamp(node[2][0] - node[2][1]) if (datemin and date < datemin) or (datemax and date > datemax): continue if user_filter: user = node[1] if users_include and user not in users_include: continue if user in users_exclude: continue day = (int(date.strftime('%w')) - 1) % 7 data[day][date.hour] += 1 n += 1 if n == 0: raise util.Abort('no matching changesets found') else: ui.status('punched %d changesets\n' % n) maxvalue = max(max(i) for i in data) or 1 xs, ys, rs, ss = [], [], [], [] for y, d in enumerate(data): for x, n in enumerate(d): xs.append(x); ys.append(y); rs.append(13.*n/maxvalue) ss.append(4.*n**2/maxvalue) try: if opts.get('mpl') or opts.get('svg'): raise ImportError from PyQt4.QtCore import Qt, QPointF, QRectF from PyQt4.QtGui import QApplication, QColor, QFont, QImage, QLabel, \ QMainWindow, QPainter, QPixmap except ImportError: try: if opts.get('svg'): raise ImportError from matplotlib import pyplot except ImportError: if not opts.get('svg'): ui.status('Writing as SVG since neither PyQt4 nor ' 'matplotlib is available\n') if filename.endswith('.png'): filename = filename[:-4] + '.svg' f = open(filename, 'w') f.write('<?xml version="1.0" standalone="no"?>\n') f.write('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" ' '"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n') o = title and 30 or 0 # y coordinate offset f.write('<svg width="800" height="{0}" version="1.1" ' 'xmlns="http://www.w3.org/2000/svg">\n'.format(300+o)) f.write('<style type="text/css"> circle {{fill: black;}} ' 'text {{font-family:{0};font-size:12;}} ' '.label{{font-size:12px;}}</style>\n'.format(font)) f.write('<rect x="0" y="0" width="800" height="{0}" ' 'style="fill:#efefef;"/>\n'.format(300+o)) f.write('<line x1="35.5" y1="{0}" x2="{1}" y2="{0}" ' 'style="stroke:black;stroke-width:2"/>\n' .format(264.5+o,45.5+24*31)) f.write('<line x1="35.5" y1="{0}" x2="35.5" y2="{1}" ' 'style="stroke:black;stroke-width:2"/>\n' .format(14.5+o,264.5+o)) for i, text in enumerate(days): f.write('<text class="label" x="7.5" y="{0}">{1}</text>\n' .format(34.5+i*34+o,text)) for i in range(24): f.write('<text class="label" x="{0}" y="{1}">{2:02}</text>\n' .format(53.5 + i*31, 280.5 + o, i)) for x, y, r in zip(xs, ys, rs): f.write('<circle cx="{0}" cy="{1}" r="{2}" fill="black"/>\n' .format(58.5 + x*31, 30.5 + y*34 + o, r)) if title: f.write('<text x="400" y="20" style="text-anchor:middle;">' '{0}</text>\n'.format(title)) f.write('</svg>') f.close() ui.status('created punch card in %s\n' % filename) else: pyplot.rc('font', family=font) # create a figure an axes with the same background color fig = pyplot.figure(figsize=(8, title and 3 or 2.5), facecolor='#efefef') ax = fig.add_subplot('111', axisbg='#efefef') # make the figure margins smaller if title: fig.subplots_adjust(left=0.06, bottom=0.04, right=0.98, top=0.95) ax.set_title(title, y=0.96).set_color('#333333') else: fig.subplots_adjust(left=0.06, bottom=0.08, right=0.98, top=0.99) # don't display the axes frame ax.set_frame_on(False) # plot the punch card data ax.scatter(xs, ys[::-1], s=ss, c='#333333', edgecolor='#333333') # hide the tick lines for line in ax.get_xticklines() + ax.get_yticklines(): line.set_alpha(0.0) # draw x and y lines (instead of axes frame) dist = -0.8 ax.plot([dist, 23.5], [dist, dist], c='#555555') ax.plot([dist, dist], [dist, 6.4], c='#555555') # select new axis limits ax.set_xlim(-1, 24) ax.set_ylim(-0.9, 6.9) # set tick labels and draw them smaller than normal ax.set_yticks(range(7)) for tx in ax.set_yticklabels(days[::-1]): tx.set_color('#555555') tx.set_size('x-small') ax.set_xticks(range(24)) for tx in ax.set_xticklabels(['%02d' % x for x in range(24)]): tx.set_color('#555555') tx.set_size('x-small') # get equal spacing for days and hours ax.set_aspect('equal') fig.savefig(filename) ui.status('created punch card in %s\n' % filename) if opts.get('display'): pyplot.show() else: app = QApplication([]) o = title and 30 or 0 # y coordinate offset image = QImage(800, 300 + o, QImage.Format_RGB32) painter = QPainter(image) painter.setRenderHints(QPainter.Antialiasing) painter.fillRect(0, 0, 800, 300 + o, QColor('#efefef')) painter.setPen(QColor('#555555')) painter.drawLine(QPointF(35.5, 264.5 + o), QPointF(45.5 + 24 * 31, 264.5 + o)) painter.drawLine(QPointF(35.5, 14.5 + o), QPointF(35.5, 264.5 + o)) painter.setFont(QFont(font, 8)) for i, text in enumerate(days): painter.drawText(QPointF(7.5, 34.5 + i * 34 + o), text) for i in range(24): text = '%02d' % i painter.drawText(QPointF(53.5 + i * 31, 280.5 + o), text) painter.setBrush(QColor('#333333')) painter.setPen(QColor('#333333')) for x, y, r in zip(xs, ys, rs): painter.drawEllipse(QPointF(58.5 + x * 31, 30.5 + y * 34 + o), r, r) if title: painter.setFont(QFont(font, 12)) painter.drawText(QRectF(0, 15, 800, 20), Qt.AlignCenter, title) painter.end() image.save(filename) ui.status('created punch card in %s\n' % filename) if opts.get('display'): win = QMainWindow() win.setWindowTitle('punchcard display') win.resize(800, 300 + o) lbl = QLabel(win) lbl.resize(800, 300 + o) lbl.setPixmap(QPixmap.fromImage(image)) win.show() app.exec_()
def paintEvent(self, event): super().paintEvent(event) painter = QPainter(self.viewport()) painter.setBrush(QColor(100, 100, 100, 100)) painter.setRenderHints(self.renderHints()) painter.drawPolygon(self.viewPolygon())
def paintEvent(self, event): def itemlist(items): for layer, items in self.items.iteritems(): if len(items) == 1: yield layer, items[0][1] else: for text, icon in items: if not text: continue yield text, icon def _drawitem(pixmap, text, itempostion): painter.drawPixmap(itempostion, pixmap) textrect = QRectF(pixmap.width() + currentx + 10, itempostion.y(), event.rect().width() - pixmap.width() - OFFSET_X, pixmap.height()) painter.drawText(textrect, text, QTextOption(Qt.AlignVCenter)) def calcitems(): font = painter.font() metrices = QFontMetrics(font) maxwidth = 0 maxheight = 0 for item, _ in itemlist(self.items): maxwidth = max(metrices.boundingRect(item).width(), maxwidth) maxheight = max(metrices.boundingRect(item).height(), maxheight) return maxwidth, maxheight if not self.pixmap: return painter = QPainter(self) painter.setRenderHints(QPainter.Antialiasing) painter.drawPixmap(event.rect(), self.pixmap) itemwidths, itemmaxheight = calcitems() OFFSET_X = 30 OFFSET_Y = itemmaxheight + 10 rect = event.rect() neededheight = (len(self.items) * OFFSET_Y) runs = 1 if neededheight > rect.height(): import math runs = math.ceil(neededheight / float(rect.height())) print runs framerect = QRect(rect) framewidth = (itemwidths + OFFSET_X + ICON_SIZE.width() + 100) * runs framerect.setWidth(framewidth) painter.setBrush(self.legendareabrush) painter.setPen(self.legendareapen) painter.drawRect(framerect) self.framerect = framerect painter.setPen(Qt.black) currenty = OFFSET_Y currentx = OFFSET_X position = rect.topLeft() + QPoint(OFFSET_X, currenty) for text, icon in itemlist(self.items): itempostion = QPoint(position) if currenty > rect.height(): currentx = itemwidths + OFFSET_X + 100 currenty = itemmaxheight + 10 itempostion.setX(currentx) itempostion.setY(currenty) _drawitem(icon, text, itempostion) currenty += OFFSET_Y position.setY(currenty + OFFSET_Y)
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()) if self._firstPaintEvent is True: self.jumpedUP = False self.strings = self.edit.toPlainText().split('\n') self._originalTotalLine = len(self.strings) self.edit.jump_to_line(len(self.strings) - 2) elif self.jumpedUP is False: self.edit.jump_to_line(1) self.edit.verticalScrollBar().setValue(0) self.jumpedUP = True return 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)) ''' if self._firstPaintEvent is True: block = self.edit.document().findBlock(0) else: block = self.edit.firstVisibleBlock() ''' block = self.edit.firstVisibleBlock() viewport_offset = self.edit.contentOffset() line_count = block.blockNumber() painter.setFont(self.edit.document().defaultFont()) pat = re.compile('\s*#.*AppObject:') patAlexaAppImage = re.compile('\s*#.*AppImage:') patAlexaAppText = re.compile('\s*#.*AppText:') patAlexaLog = re.compile('\s*##.*Alexa Log') 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) if self._firstPaintEvent is True: block = self.edit.document().findBlock(0) else: block = self.edit.firstVisibleBlock() #block = self.edit.firstVisibleBlock() line_count = block.blockNumber() while block.isValid(): #while line_count < 5000: line_count += 1 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 #block.isVisible() and if block.isVisible() and pat.match( block.text()) and block not in self._foldedAlexaObject: self._fold(line_count) self._foldedAlexaObject.append(block) self._alexaObjectsPresent = True elif block.isVisible() and patAlexaAppImage.match( block.text()) and block not in self._foldedAlexaImage: self._fold(line_count) self._foldedAlexaImage.append(block) self._alexaObjectsPresent = True elif block.isVisible() and patAlexaAppText.match( block.text()) and block not in self._foldedAlexaText: self._fold(line_count) self._foldedAlexaText.append(block) self._alexaObjectsPresent = True elif block.isVisible() and patAlexaLog.match( block.text()) and block not in self._foldedAlexaLog: self._fold(line_count) self._foldedAlexaLog.append(block) self._alexaObjectsPresent = True elif pattern.match(block.text()) and block.isVisible(): if block.blockNumber() in self._foldedBlocks: painter.drawPixmap(xofs, round(position.y()), self.rightArrowIcon) else: #block.setVisible(True) 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 = self.edit.document().findBlock(0) line_count = 0 line_hidden = 0 while block.isValid(): line_count += 1 if not block.isVisible(): line_hidden += 1 block = block.next() endScrollBar = line_count - line_hidden self.edit.verticalScrollBar().setRange(0, endScrollBar) if self._firstPaintEvent is True: self._firstPaintEvent = False #self.updateAlexaAppObjCoords() #self.updateAlexaLogCoords() painter.end() ''' #self.edit.update() if self.edit.verticalScrollBar().value() != self._oldVerticalScrollbarPosition and self._alexaObjectsPresent is True: self._oldVerticalScrollbarPosition = self.edit.verticalScrollBar().value() self.updateAlexaCoords() self.edit.update() # in this way we can refresh alexa icon position if self.edit.horizontalScrollBar().value() != self._oldHorizontalScrollbarPosition and self._alexaObjectsPresent is True: self._oldHorizontalScrollbarPosition = self.edit.horizontalScrollBar().value() self.updateAlexaCoords() self.edit.update() # in this way we can refresh alexa icon position ''' self.strings = self.edit.toPlainText().split('\n') self._currentTotalLine = len(self.strings) if self._currentTotalLine != self._originalTotalLine: self._originalTotalLine = self._currentTotalLine self.updateAlexaCoords() self.edit.update() ''' if self._returnPressed is True: self._returnPressed = False self.updateAlexaAppObjCoords() self.updateAlexaLogCoords() self.edit.update() if self._backspacePressed is True: self._backspacePressed = False self.strings = self.edit.toPlainText().split('\n') self._currentTotalLine = len(self.strings) if self._currentTotalLine != self._originalTotalLine: self.updateAlexaAppObjCoords() self.updateAlexaLogCoords() self.edit.update() ''' if self.edit._alexaAppObjIconsCoords != self._oldAlexaAppObjIconsCoords: self._oldAlexaAppObjIconsCoords = copy.deepcopy( self.edit._alexaAppObjIconsCoords) self.edit.update() if self.edit._alexaAppImgIconsCoords != self._oldAlexaAppImgIconsCoords: self._oldAlexaAppImgIconsCoords = copy.deepcopy( self.edit._alexaAppImgIconsCoords) self.edit.update() if self.edit._alexaAppTextIconsCoords != self._oldAlexaAppTextIconsCoords: self._oldAlexaAppTextIconsCoords = copy.deepcopy( self.edit._alexaAppTextIconsCoords) self.edit.update() if self.edit._alexaLogIconsCoords != self._oldAlexaLogIconsCoords: self._oldAlexaLogIconsCoords = copy.deepcopy( self.edit._alexaLogIconsCoords) self.edit.update() selectedLine = self.edit.textCursor().selectedText() textAtCursorPos = self.edit.textCursor().block().text() try: #tmp = selectedLine.index("# AppObject") if (pat.match(selectedLine) or patAlexaLog.match(selectedLine) or \ pat.match(textAtCursorPos) or patAlexaLog.match(textAtCursorPos) or \ patAlexaAppImage.match(selectedLine) or patAlexaAppImage.match(textAtCursorPos) or\ patAlexaAppText.match(selectedLine) or patAlexaAppText.match(textAtCursorPos)) and \ self._keypress is True: self._keypress = False self.updateAlexaCoords() except: pass QWidget.paintEvent(self, event) '''
def drawImage(self, imageid): cache = image_cache.cache cellColoring = self.cellColoring wallColoring = self.wallColoring pointColoring = self.pointColoring ellipsisDraw = self.ellipsisDraw overSampling = self.overSampling extraDrawing = self.extraDrawing bgColor = self.bgColor.rgb() result = self.result if self.result_type == "Data": data = result img_name = result.images_name[imageid] else: data = result.data img_name = result.images[imageid] #scale = data.images_scale[img_name] min_scale = data.minScale() img = cache.image(data.image_path(img_name)) img_data = data[img_name] size = self._crop.size() pix = QImage(size*overSampling, QImage.Format_ARGB32) pix.fill(bgColor) painter = QPainter() if not painter.begin(pix): self.abort("Cannot create painter on QImage") return None, None, None painter.setRenderHints(QPainter.SmoothPixmapTransform, True) painter.setRenderHints(QPainter.Antialiasing, True) if overSampling > 1: painter.scale(overSampling, overSampling) painter.translate(-self._crop.topLeft()) painter.save() painter.translate(self.translate) log_debug("Translating: %gx%g" % (self.translate.x(), self.translate.y()) ) painter.scale(1/min_scale, 1/min_scale) painter.save() matrix = img_data.matrix() painter.setWorldTransform(matrix, True) painter.drawImage(QPoint(0,0), img) painter.restore() #pt_matrix = QTransform() #pt_matrix.scale(1/min_scale, 1/min_scale) #painter.setTransform(pt_matrix, True) cellColoring.startImage(painter, imageid) wallColoring.startImage(painter, imageid) for ed in extraDrawing: ed.startImage(painter, imageid) if self.result_type == "Growth": cells = result.cells[imageid] walls = result.walls[imageid] else: cells = img_data.cells walls = set() for cid in img_data.cells: pts = [ pt for pt in data.cells[cid] if pt in img_data ] if len(pts) > 1: for i in range(len(pts)): walls.add(data.wallId(pts[i-1], pts[i])) # Now, draw the cells and the ellipsis for cid in cells: painter.setPen(Qt.NoPen) color = cellColoring(imageid, cid) painter.setBrush(color) pts = data.cellAtTime(cid, img_data.index) if pts: pts.append(pts[0]) ppts = [] for p1,p2 in zip(pts[:-1], pts[1:]): ppts.append(img_data[p1]) ppts.extend(img_data.walls[p1,p2]) ppts.append(ppts[0]) poly = QPolygonF(ppts) painter.drawPolygon(poly) # And draw the walls wallThickness = self.wallThickness*min_scale for wid in walls: color = wallColoring(imageid, wid) if color.alpha() > 0: pen = QPen(color) pen.setWidthF(wallThickness) painter.setPen(pen) pts = [img_data[wid[0]]] + img_data.walls[wid[0], wid[1]] + [img_data[wid[1]]] #painter.drawLine(img_data[wid[0]], img_data[wid[1]]) painter.drawPolyline(*pts) # Then, draw the points pointSize = self.pointSize*min_scale pointLineColor = self.pointLineColor pointLineThickness = self.pointLineThickness*min_scale log_debug("pointSize = %g" % pointSize) for pid in img_data: color = pointColoring(imageid, pid) if color.alpha() > 0: pen = QPen(pointLineColor) pen.setWidthF(pointLineThickness) brush = QBrush(color) painter.setPen(pen) painter.setBrush(brush) pos = img_data[pid] rect = QRectF(pos.x()-pointSize, pos.y()-pointSize, 2*pointSize, 2*pointSize) painter.drawEllipse(rect) if ellipsisDraw.plot: for cid in cells: pts = data.cellAtTime(cid, img_data.index) if pts: pts.append(pts[0]) ppts = [] for p1,p2 in zip(pts[:-1], pts[1:]): ppts.append(img_data[p1]) ppts.extend(img_data.walls[p1,p2]) ppts.append(ppts[0]) #poly = QPolygonF(ppts) #painter.drawPolygon(poly) ellipsisDraw(painter, imageid, cid, ppts, min_scale) # At last, draw the extra data for ed in extraDrawing: ed(painter, imageid) tr = painter.worldTransform() painter.restore() pic_w = wallColoring.finalizeImage(painter, imageid, tr, self.crop) pic_c = cellColoring.finalizeImage(painter, imageid, tr, self.crop) for ed in extraDrawing: ed.finalizeImage(painter, imageid, tr, self.crop) painter.end() return pix, pic_w, pic_c
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']) 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 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() painter.end() QWidget.paintEvent(self, 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']) 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 painter.setPen(QColor(foreground)) error = False checkers = sorted(self._neditable.registered_checkers, key=lambda x: x[2], reverse=True) 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: 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) 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() QWidget.paintEvent(self, event)
def paintEvent(self, event): def itemlist(): for layer, items in self.items.iteritems(): if len(items) == 1 and not layer.startswith("~"): yield layer, items[0][1] else: for text, icon in items: if not text or text.startswith("~"): continue yield text, icon def _drawitem(pixmap, text, itempostion): painter.drawPixmap(itempostion, pixmap) textrect = QRectF(pixmap.width() + currentx + 10, itempostion.y(), event.rect().width() - pixmap.width() - OFFSET_X, pixmap.height()) painter.drawText(textrect, text, QTextOption(Qt.AlignVCenter)) def calcitems(): font = painter.font() metrices = QFontMetrics(font) maxwidth = 0 maxheight = 0 for item, _ in itemlist(): maxwidth = max(metrices.boundingRect(item).width(), maxwidth) maxheight = max( metrices.boundingRect(item).height(), maxheight) return maxwidth, maxheight if not self.canvasimage: return painter = QPainter(self) painter.setRenderHints(QPainter.Antialiasing) painter.drawImage(event.rect(), self.canvasimage) itemwidths, itemmaxheight = calcitems() OFFSET_X = 30 OFFSET_Y = itemmaxheight + 10 rect = event.rect() neededheight = (len(self.items) * OFFSET_Y) columns = 1 if neededheight > rect.height(): columns = math.ceil(neededheight / float(rect.height())) framerect = QRect(rect) framewidth = (itemwidths + OFFSET_X + ICON_SIZE.width() + 100) * columns framerect.setWidth(framewidth) painter.setBrush(self.legendareabrush) painter.setPen(self.legendareapen) painter.drawRect(framerect) self.framerect = framerect painter.setPen(Qt.black) currenty = OFFSET_Y currentx = OFFSET_X position = rect.topLeft() + QPoint(OFFSET_X, currenty) for text, icon in itemlist(): itempostion = QPoint(position) if currenty > rect.height(): currentx = itemwidths + OFFSET_X + 100 currenty = itemmaxheight + 10 itempostion.setX(currentx) itempostion.setY(currenty) _drawitem(icon, text, itempostion) currenty += OFFSET_Y position.setY(currenty + OFFSET_Y)
def drawImage(self, imageid): cache = image_cache.cache cellColoring = self.cellColoring wallColoring = self.wallColoring pointColoring = self.pointColoring ellipsisDraw = self.ellipsisDraw overSampling = self.overSampling extraDrawing = self.extraDrawing bgColor = self.bgColor.rgb() result = self.result if self.result_type == "Data": data = result img_name = result.images_name[imageid] else: data = result.data img_name = result.images[imageid] #scale = data.images_scale[img_name] min_scale = data.minScale() img = cache.image(data.image_path(img_name)) img_data = data[img_name] size = self._crop.size() pix = QImage(size * overSampling, QImage.Format_ARGB32) pix.fill(bgColor) painter = QPainter() if not painter.begin(pix): self.abort("Cannot create painter on QImage") return None, None, None painter.setRenderHints(QPainter.SmoothPixmapTransform, True) painter.setRenderHints(QPainter.Antialiasing, True) if overSampling > 1: painter.scale(overSampling, overSampling) painter.translate(-self._crop.topLeft()) painter.save() painter.translate(self.translate) log_debug("Translating: %gx%g" % (self.translate.x(), self.translate.y())) painter.scale(1 / min_scale, 1 / min_scale) painter.save() matrix = img_data.matrix() painter.setWorldTransform(matrix, True) painter.drawImage(QPoint(0, 0), img) painter.restore() #pt_matrix = QTransform() #pt_matrix.scale(1/min_scale, 1/min_scale) #painter.setTransform(pt_matrix, True) cellColoring.startImage(painter, imageid) wallColoring.startImage(painter, imageid) for ed in extraDrawing: ed.startImage(painter, imageid) if self.result_type == "Growth": cells = result.cells[imageid] walls = result.walls[imageid] else: cells = img_data.cells walls = set() for cid in img_data.cells: pts = [pt for pt in data.cells[cid] if pt in img_data] if len(pts) > 1: for i in range(len(pts)): walls.add(data.wallId(pts[i - 1], pts[i])) # Now, draw the cells and the ellipsis for cid in cells: painter.setPen(Qt.NoPen) color = cellColoring(imageid, cid) painter.setBrush(color) pts = data.cellAtTime(cid, img_data.index) if pts: pts.append(pts[0]) ppts = [] for p1, p2 in zip(pts[:-1], pts[1:]): ppts.append(img_data[p1]) ppts.extend(img_data.walls[p1, p2]) ppts.append(ppts[0]) poly = QPolygonF(ppts) painter.drawPolygon(poly) # And draw the walls wallThickness = self.wallThickness * min_scale for wid in walls: color = wallColoring(imageid, wid) if color.alpha() > 0: pen = QPen(color) pen.setWidthF(wallThickness) painter.setPen(pen) pts = [img_data[wid[0]] ] + img_data.walls[wid[0], wid[1]] + [img_data[wid[1]]] #painter.drawLine(img_data[wid[0]], img_data[wid[1]]) painter.drawPolyline(*pts) # Then, draw the points pointSize = self.pointSize * min_scale pointLineColor = self.pointLineColor pointLineThickness = self.pointLineThickness * min_scale log_debug("pointSize = %g" % pointSize) for pid in img_data: color = pointColoring(imageid, pid) if color.alpha() > 0: pen = QPen(pointLineColor) pen.setWidthF(pointLineThickness) brush = QBrush(color) painter.setPen(pen) painter.setBrush(brush) pos = img_data[pid] rect = QRectF(pos.x() - pointSize, pos.y() - pointSize, 2 * pointSize, 2 * pointSize) painter.drawEllipse(rect) if ellipsisDraw.plot: for cid in cells: pts = data.cellAtTime(cid, img_data.index) if pts: pts.append(pts[0]) ppts = [] for p1, p2 in zip(pts[:-1], pts[1:]): ppts.append(img_data[p1]) ppts.extend(img_data.walls[p1, p2]) ppts.append(ppts[0]) #poly = QPolygonF(ppts) #painter.drawPolygon(poly) ellipsisDraw(painter, imageid, cid, ppts, min_scale) # At last, draw the extra data for ed in extraDrawing: ed(painter, imageid) tr = painter.worldTransform() painter.restore() pic_w = wallColoring.finalizeImage(painter, imageid, tr, self.crop) pic_c = cellColoring.finalizeImage(painter, imageid, tr, self.crop) for ed in extraDrawing: ed.finalizeImage(painter, imageid, tr, self.crop) painter.end() return pix, pic_w, pic_c
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()) if self._firstPaintEvent is True: self.jumpedUP = False self.strings = self.edit.toPlainText().split("\n") self._originalTotalLine = len(self.strings) self.edit.jump_to_line(len(self.strings) - 2) elif self.jumpedUP is False: self.edit.jump_to_line(1) self.edit.verticalScrollBar().setValue(0) self.jumpedUP = True return 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)) """ if self._firstPaintEvent is True: block = self.edit.document().findBlock(0) else: block = self.edit.firstVisibleBlock() """ block = self.edit.firstVisibleBlock() viewport_offset = self.edit.contentOffset() line_count = block.blockNumber() painter.setFont(self.edit.document().defaultFont()) pat = re.compile("\s*#AppObject:") patAlexaAppImage = re.compile("\s*#AppImage:") patAlexaAppText = re.compile("\s*#AppText:") patAlexaLog = re.compile("\s*#Alexa Log") 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) if self._firstPaintEvent is True: block = self.edit.document().findBlock(0) else: block = self.edit.firstVisibleBlock() # block = self.edit.firstVisibleBlock() line_count = block.blockNumber() while block.isValid(): # while line_count < 5000: line_count += 1 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 # block.isVisible() and if block.isVisible() and pat.match(block.text()) and block not in self._foldedAlexaObject: self._fold(line_count) self._foldedAlexaObject.append(block) self._alexaObjectsPresent = True elif block.isVisible() and patAlexaAppImage.match(block.text()) and block not in self._foldedAlexaImage: self._fold(line_count) self._foldedAlexaImage.append(block) self._alexaObjectsPresent = True elif block.isVisible() and patAlexaAppText.match(block.text()) and block not in self._foldedAlexaText: self._fold(line_count) self._foldedAlexaText.append(block) self._alexaObjectsPresent = True elif block.isVisible() and patAlexaLog.match(block.text()) and block not in self._foldedAlexaLog: self._fold(line_count) self._foldedAlexaLog.append(block) self._alexaObjectsPresent = True elif pattern.match(block.text()) and block.isVisible(): if block.blockNumber() in self._foldedBlocks: painter.drawPixmap(xofs, round(position.y()), self.rightArrowIcon) else: # block.setVisible(True) 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 = self.edit.document().findBlock(0) line_count = 0 line_hidden = 0 while block.isValid(): line_count += 1 if not block.isVisible(): line_hidden += 1 block = block.next() endScrollBar = line_count - line_hidden self.edit.verticalScrollBar().setRange(0, endScrollBar) if self._firstPaintEvent is True: self._firstPaintEvent = False # self.updateAlexaAppObjCoords() # self.updateAlexaLogCoords() painter.end() """ #self.edit.update() if self.edit.verticalScrollBar().value() != self._oldVerticalScrollbarPosition and self._alexaObjectsPresent is True: self._oldVerticalScrollbarPosition = self.edit.verticalScrollBar().value() self.updateAlexaCoords() self.edit.update() # in this way we can refresh alexa icon position if self.edit.horizontalScrollBar().value() != self._oldHorizontalScrollbarPosition and self._alexaObjectsPresent is True: self._oldHorizontalScrollbarPosition = self.edit.horizontalScrollBar().value() self.updateAlexaCoords() self.edit.update() # in this way we can refresh alexa icon position """ self.strings = self.edit.toPlainText().split("\n") self._currentTotalLine = len(self.strings) if self._currentTotalLine != self._originalTotalLine: self._originalTotalLine = self._currentTotalLine self.updateAlexaCoords() self.edit.update() """ if self._returnPressed is True: self._returnPressed = False self.updateAlexaAppObjCoords() self.updateAlexaLogCoords() self.edit.update() if self._backspacePressed is True: self._backspacePressed = False self.strings = self.edit.toPlainText().split('\n') self._currentTotalLine = len(self.strings) if self._currentTotalLine != self._originalTotalLine: self.updateAlexaAppObjCoords() self.updateAlexaLogCoords() self.edit.update() """ if self.edit._alexaAppObjIconsCoords != self._oldAlexaAppObjIconsCoords: self._oldAlexaAppObjIconsCoords = copy.deepcopy(self.edit._alexaAppObjIconsCoords) self.edit.update() if self.edit._alexaAppImgIconsCoords != self._oldAlexaAppImgIconsCoords: self._oldAlexaAppImgIconsCoords = copy.deepcopy(self.edit._alexaAppImgIconsCoords) self.edit.update() if self.edit._alexaAppTextIconsCoords != self._oldAlexaAppTextIconsCoords: self._oldAlexaAppTextIconsCoords = copy.deepcopy(self.edit._alexaAppTextIconsCoords) self.edit.update() if self.edit._alexaLogIconsCoords != self._oldAlexaLogIconsCoords: self._oldAlexaLogIconsCoords = copy.deepcopy(self.edit._alexaLogIconsCoords) self.edit.update() selectedLine = self.edit.textCursor().selectedText() textAtCursorPos = self.edit.textCursor().block().text() try: # tmp = selectedLine.index("# AppObject") if ( pat.match(selectedLine) or patAlexaLog.match(selectedLine) or pat.match(textAtCursorPos) or patAlexaLog.match(textAtCursorPos) or patAlexaAppImage.match(selectedLine) or patAlexaAppImage.match(textAtCursorPos) or patAlexaAppText.match(selectedLine) or patAlexaAppText.match(textAtCursorPos) ) and self._keypress is True: self._keypress = False self.updateAlexaCoords() except: pass QWidget.paintEvent(self, event) """
def punchcard(ui, repo, *pats, **opts): """Generate a "punch card" graph of commit times. For drawing the graph, either PyQt4 or matplotlib can be used. The default is PyQt4, unless the --mpl option is given. Normally, all commits are registered in local time, so that commits at 10 AM local time in Europe and the USA show up on the same punch card entry. If --utc is given, all commit times are converted to UTC before registered. """ if pats: raise util.Abort('no argument allowed') filename = opts['filename'] if opts['datemin']: datemin = datetime.strptime(opts['datemin'], '%Y-%m-%d') else: datemin = None if opts['datemax']: datemax = datetime.strptime(opts['datemax'], '%Y-%m-%d') else: datemax = None users_include = set(opts['user']) users_exclude = set(opts['notuser']) user_filter = bool(users_include or users_exclude) title = opts.get('title') font = opts.get('font') or 'Arial' utc = opts.get('utc') data = [[0] * 24 for i in range(7)] cl = repo.changelog n = 0 ui.status('filtering changesets\n') for i in xrange(len(cl)): node = cl.read(cl.node(i)) # node[2] is a tuple of the date in UTC and the timezone offset. # If --utc is given, the offset can be ignored; otherwise if utc: date = datetime.utcfromtimestamp(node[2][0]) else: date = datetime.utcfromtimestamp(node[2][0] - node[2][1]) if (datemin and date < datemin) or (datemax and date > datemax): continue if user_filter: user = node[1] if users_include and user not in users_include: continue if user in users_exclude: continue day = (int(date.strftime('%w')) - 1) % 7 data[day][date.hour] += 1 n += 1 if n == 0: raise util.Abort('no matching changesets found') else: ui.status('punched %d changesets\n' % n) maxvalue = max(max(i) for i in data) or 1 xs, ys, rs, ss = [], [], [], [] for y, d in enumerate(data): for x, n in enumerate(d): xs.append(x) ys.append(y) rs.append(13. * n / maxvalue) ss.append(4. * n**2 / maxvalue) try: if opts.get('mpl') or opts.get('svg'): raise ImportError from PyQt4.QtCore import Qt, QPointF, QRectF from PyQt4.QtGui import QApplication, QColor, QFont, QImage, QLabel, \ QMainWindow, QPainter, QPixmap except ImportError: try: if opts.get('svg'): raise ImportError from matplotlib import pyplot except ImportError: if not opts.get('svg'): ui.status('Writing as SVG since neither PyQt4 nor ' 'matplotlib is available\n') if filename.endswith('.png'): filename = filename[:-4] + '.svg' f = open(filename, 'w') f.write('<?xml version="1.0" standalone="no"?>\n') f.write('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" ' '"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n') o = title and 30 or 0 # y coordinate offset f.write('<svg width="800" height="{0}" version="1.1" ' 'xmlns="http://www.w3.org/2000/svg">\n'.format(300 + o)) f.write('<style type="text/css"> circle {{fill: black;}} ' 'text {{font-family:{0};font-size:12;}} ' '.label{{font-size:12px;}}</style>\n'.format(font)) f.write('<rect x="0" y="0" width="800" height="{0}" ' 'style="fill:#efefef;"/>\n'.format(300 + o)) f.write('<line x1="35.5" y1="{0}" x2="{1}" y2="{0}" ' 'style="stroke:black;stroke-width:2"/>\n'.format( 264.5 + o, 45.5 + 24 * 31)) f.write('<line x1="35.5" y1="{0}" x2="35.5" y2="{1}" ' 'style="stroke:black;stroke-width:2"/>\n'.format( 14.5 + o, 264.5 + o)) for i, text in enumerate(days): f.write( '<text class="label" x="7.5" y="{0}">{1}</text>\n'.format( 34.5 + i * 34 + o, text)) for i in range(24): f.write('<text class="label" x="{0}" y="{1}">{2:02}</text>\n'. format(53.5 + i * 31, 280.5 + o, i)) for x, y, r in zip(xs, ys, rs): f.write('<circle cx="{0}" cy="{1}" r="{2}" fill="black"/>\n'. format(58.5 + x * 31, 30.5 + y * 34 + o, r)) if title: f.write('<text x="400" y="20" style="text-anchor:middle;">' '{0}</text>\n'.format(title)) f.write('</svg>') f.close() ui.status('created punch card in %s\n' % filename) else: pyplot.rc('font', family=font) # create a figure an axes with the same background color fig = pyplot.figure(figsize=(8, title and 3 or 2.5), facecolor='#efefef') ax = fig.add_subplot('111', axisbg='#efefef') # make the figure margins smaller if title: fig.subplots_adjust(left=0.06, bottom=0.04, right=0.98, top=0.95) ax.set_title(title, y=0.96).set_color('#333333') else: fig.subplots_adjust(left=0.06, bottom=0.08, right=0.98, top=0.99) # don't display the axes frame ax.set_frame_on(False) # plot the punch card data ax.scatter(xs, ys[::-1], s=ss, c='#333333', edgecolor='#333333') # hide the tick lines for line in ax.get_xticklines() + ax.get_yticklines(): line.set_alpha(0.0) # draw x and y lines (instead of axes frame) dist = -0.8 ax.plot([dist, 23.5], [dist, dist], c='#555555') ax.plot([dist, dist], [dist, 6.4], c='#555555') # select new axis limits ax.set_xlim(-1, 24) ax.set_ylim(-0.9, 6.9) # set tick labels and draw them smaller than normal ax.set_yticks(range(7)) for tx in ax.set_yticklabels(days[::-1]): tx.set_color('#555555') tx.set_size('x-small') ax.set_xticks(range(24)) for tx in ax.set_xticklabels(['%02d' % x for x in range(24)]): tx.set_color('#555555') tx.set_size('x-small') # get equal spacing for days and hours ax.set_aspect('equal') fig.savefig(filename) ui.status('created punch card in %s\n' % filename) if opts.get('display'): pyplot.show() else: app = QApplication([]) o = title and 30 or 0 # y coordinate offset image = QImage(800, 300 + o, QImage.Format_RGB32) painter = QPainter(image) painter.setRenderHints(QPainter.Antialiasing) painter.fillRect(0, 0, 800, 300 + o, QColor('#efefef')) painter.setPen(QColor('#555555')) painter.drawLine(QPointF(35.5, 264.5 + o), QPointF(45.5 + 24 * 31, 264.5 + o)) painter.drawLine(QPointF(35.5, 14.5 + o), QPointF(35.5, 264.5 + o)) painter.setFont(QFont(font, 8)) for i, text in enumerate(days): painter.drawText(QPointF(7.5, 34.5 + i * 34 + o), text) for i in range(24): text = '%02d' % i painter.drawText(QPointF(53.5 + i * 31, 280.5 + o), text) painter.setBrush(QColor('#333333')) painter.setPen(QColor('#333333')) for x, y, r in zip(xs, ys, rs): painter.drawEllipse(QPointF(58.5 + x * 31, 30.5 + y * 34 + o), r, r) if title: painter.setFont(QFont(font, 12)) painter.drawText(QRectF(0, 15, 800, 20), Qt.AlignCenter, title) painter.end() image.save(filename) ui.status('created punch card in %s\n' % filename) if opts.get('display'): win = QMainWindow() win.setWindowTitle('punchcard display') win.resize(800, 300 + o) lbl = QLabel(win) lbl.resize(800, 300 + o) lbl.setPixmap(QPixmap.fromImage(image)) win.show() app.exec_()
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()) painter = QPainter(self) painter.fillRect(self.rect(), Qt.lightGray) 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(Qt.darkYellow) 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(Qt.red) font = painter.font() font.setItalic(True) font.setUnderline(True) painter.setFont(font) error = True else: painter.setPen(Qt.black) # 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 self.pat.match(unicode(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() painter.end() QWidget.paintEvent(self, event)