def _update_margin_line(self, font): # Fix for older version of Qt which doens't has ForceIntegerMetrics if "ForceIntegerMetrics" in dir(QFont): self.document().defaultFont().setStyleStrategy( QFont.ForceIntegerMetrics) font_metrics = QFontMetricsF(self.document().defaultFont()) if (font_metrics.width("#") * settings.MARGIN_LINE) == \ (font_metrics.width(" ") * settings.MARGIN_LINE): self.pos_margin = font_metrics.width('#') * settings.MARGIN_LINE else: char_width = font_metrics.averageCharWidth() self.pos_margin = char_width * settings.MARGIN_LINE
def getAdjustedText(self, text): font = QFont('Verdana', 8) fm = QFontMetricsF(font) w = fm.width(text) if w < self.BOX_WIDTH - 25 - FlatButtonGraphicItem.WIDTH: return text text = text[0:-3] + '...' w = fm.width(text) while w > self.BOX_WIDTH - 25 - FlatButtonGraphicItem.WIDTH: text = text[0:-4] + '...' w = fm.width(text) return text
def set_font(self, family=settings.FONT_FAMILY, size=settings.FONT_SIZE): font = QFont(family, size) self.document().setDefaultFont(font) # Fix for older version of Qt which doens't has ForceIntegerMetrics if "ForceIntegerMetrics" in dir(QFont): self.document().defaultFont().setStyleStrategy( QFont.ForceIntegerMetrics) font_metrics = QFontMetricsF(self.document().defaultFont()) if (font_metrics.width("#") * settings.MARGIN_LINE) == \ (font_metrics.width(" ") * settings.MARGIN_LINE): self.pos_margin = font_metrics.width('#') * settings.MARGIN_LINE else: char_width = font_metrics.averageCharWidth() self.pos_margin = char_width * settings.MARGIN_LINE
def minimumSizeHint(self): font = QFont(self.font()) font.setPointSize(font.pointSize() - 1) fm = QFontMetricsF(font) return QSize( fm.width(FractionSlider.WSTRING) * self.__denominator, (fm.height() * 4) + FractionSlider.YMARGIN)
def minimumSizeHint(self): font = QFont(self.font()) font.setPointSize(font.pointSize() - 1) fm = QFontMetricsF(font) return QSize(fm.width(FractionSlider.WSTRING) * self.__denominator, (fm.height() * 4) + FractionSlider.YMARGIN)
def drawMarkings(self, painter): painter.save() painter.translate(self.width() / 2, self.height() / 2) scale = min((self.width() - self._margins) / 120.0, (self.height() - self._margins) / 120.0) painter.scale(scale, scale) font = QFont(self.font()) font.setPixelSize(10) metrics = QFontMetricsF(font) painter.setFont(font) painter.setPen(self.palette().color(QPalette.Shadow)) i = 0 while i < 360: if i % 45 == 0: painter.drawLine(0, -40, 0, -50) painter.drawText(-metrics.width(self._pointText[i]) / 2.0, -52, self._pointText[i]) else: painter.drawLine(0, -45, 0, -50) painter.rotate(15) i += 15 painter.restore()
def plot(self, under, over): if not under: return ctx = PaintGL.instance().currentContext painter = ctx.painter plotm = PlotModule.instance() plot_width, plot_height = plotm.getPlotWindow() metrics = QFontMetricsF(QFont()) painter.save() painter.setPen(QColor(0, 0, 160)) painter.setBrush(QColor(255, 255, 255, 192)) painter.setCompositionMode(painter.CompositionMode_SourceOver) for point, label in self.locations: ok, x, y = plotm.GeoToPhys(point.x(), point.y()) y = plot_height - y if ok: rect = QRectF(x, y, metrics.width(label) + 8, metrics.height() + 8) painter.drawRect(rect) painter.drawText(rect, Qt.AlignCenter, label) painter.restore()
def __init__(self, leftFlow=0, rightFlow=0, maxFlow=100, parent=None): super(YPipeWidget, self).__init__(parent) self.leftSpinBox = QSpinBox(self) self.leftSpinBox.setRange(0, maxFlow) self.leftSpinBox.setValue(leftFlow) self.leftSpinBox.setSuffix(" l/s") self.leftSpinBox.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.connect(self.leftSpinBox, SIGNAL("valueChanged(int)"), self.valueChanged) self.rightSpinBox = QSpinBox(self) self.rightSpinBox.setRange(0, maxFlow) self.rightSpinBox.setValue(rightFlow) self.rightSpinBox.setSuffix(" l/s") self.rightSpinBox.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.connect(self.rightSpinBox, SIGNAL("valueChanged(int)"), self.valueChanged) self.label = QLabel(self) self.label.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.label.setAlignment(Qt.AlignCenter) fm = QFontMetricsF(self.font()) self.label.setMinimumWidth(fm.width(" 999 l/s ")) self.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self.setMinimumSize(self.minimumSizeHint()) self.valueChanged()
def __init__(self, leftFlow = 0, rightFlow = 0, maxFlow = 100, parent = None): super(YPipeWidget, self).__init__(parent) self.leftSpinBox = QSpinBox(self) self.leftSpinBox.setRange(0, maxFlow) self.leftSpinBox.setValue(leftFlow) self.leftSpinBox.setSuffix(" l/s") self.leftSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter) self.connect(self.leftSpinBox, SIGNAL("valueChanged(int)"), self.valueChanged) self.rightSpinBox = QSpinBox(self) self.rightSpinBox.setRange(0, maxFlow) self.rightSpinBox.setValue(rightFlow) self.rightSpinBox.setSuffix(" l/s") self.rightSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter) self.connect(self.rightSpinBox, SIGNAL("valueChanged(int)"), self.valueChanged) self.label = QLabel(self) self.label.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.label.setAlignment(Qt.AlignCenter) fm = QFontMetricsF(self.font()) self.label.setMinimumWidth(fm.width(" 999 l/s ")) self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self.setMinimumSize(self.minimumSizeHint()) self.valueChanged()
def minimumSizeHint(self): "Pour être sûr que le texte du chrono ne soit pas tronqué" font = QFont(self.font()) font.setPointSize(font.pointSize() - 1) fm = QFontMetricsF(font) l = fm.width(TracerChrono.TAILLE*2) # + 10. L = fm.height() + 2. return QSize(l, L)
def _find_font(self): font = QFont() wanted_size = self._point_size font.setStyleStrategy(QFont.StyleStrategy(QFont.OpenGLCompatible | QFont.PreferAntialias)) fm = QFontMetricsF(font) width = fm.width("888") ratio = 1.8*wanted_size/max(width, fm.ascent()) self._font = font self._font_zoom = ratio
def paintEvent(self, event=None): font = QFont(self.font()) font.setPointSize(font.pointSize() - 1) fm = QFontMetricsF(font) fracWidth = fm.width(FractionSlider.WSTRING) indent = fm.boundingRect("9").width() / 2.0 if not X11: fracWidth *= 1.5 span = self.width() - (FractionSlider.XMARGIN * 2) value = self.__numerator / float(self.__denominator) painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.setRenderHint(QPainter.TextAntialiasing) painter.setPen(self.palette().color(QPalette.Mid)) painter.setBrush(self.palette().brush( QPalette.AlternateBase)) painter.drawRect(self.rect()) segColor = QColor(Qt.green).dark(120) segLineColor = segColor.dark() painter.setPen(segLineColor) painter.setBrush(segColor) painter.drawRect(FractionSlider.XMARGIN, FractionSlider.YMARGIN, span, fm.height()) textColor = self.palette().color(QPalette.Text) segWidth = span / self.__denominator segHeight = fm.height() * 2 nRect = fm.boundingRect(FractionSlider.WSTRING) x = FractionSlider.XMARGIN yOffset = segHeight + fm.height() for i in range(self.__denominator + 1): painter.setPen(segLineColor) painter.drawLine(x, FractionSlider.YMARGIN, x, segHeight) painter.setPen(textColor) y = segHeight rect = QRectF(nRect) rect.moveCenter(QPointF(x, y + fm.height() / 2.0)) painter.drawText(rect, Qt.AlignCenter, QString.number(i)) y = yOffset rect.moveCenter(QPointF(x, y + fm.height() / 2.0)) painter.drawText(rect, Qt.AlignCenter, QString.number(self.__denominator)) painter.drawLine(QPointF(rect.left() + indent, y), QPointF(rect.right() - indent, y)) x += segWidth span = int(span) y = FractionSlider.YMARGIN - 0.5 triangle = [QPointF(value * span, y), QPointF((value * span) + (2 * FractionSlider.XMARGIN), y), QPointF((value * span) + FractionSlider.XMARGIN, fm.height())] painter.setPen(Qt.yellow) painter.setBrush(Qt.darkYellow) painter.drawPolygon(QPolygonF(triangle))
def _find_font(self): font = QFont() wanted_size = self._point_size font.setStyleStrategy( QFont.StyleStrategy(QFont.OpenGLCompatible | QFont.PreferAntialias)) fm = QFontMetricsF(font) width = fm.width("888") ratio = 1.8 * wanted_size / max(width, fm.ascent()) self._font = font self._font_zoom = ratio
def getLinkPointForOutput(self, outputIndex): if isinstance(self.element, Algorithm): outputIndex = outputIndex if not self.element.outputsFolded else -1 text = self.getAdjustedText(self.element.algorithm.outputs[outputIndex].description) font = QFont("Verdana", 8) fm = QFontMetricsF(font) w = fm.width(text) h = fm.height() * 1.2 * (outputIndex + 1) + fm.height() / 2.0 y = h + ModelerGraphicItem.BOX_HEIGHT / 2.0 + 5 x = -ModelerGraphicItem.BOX_WIDTH / 2 + 33 + w + 5 if not self.element.outputsFolded else 10 return QPointF(x, y) else: return QPointF(0, 0)
def getLinkPointForOutput(self, outputIndex): if isinstance(self.element, Algorithm): outputIndex = (outputIndex if not self.element.outputsFolded else -1) text = self.getAdjustedText(self.element.algorithm.outputs[outputIndex].description) font = QFont('Verdana', 8) fm = QFontMetricsF(font) w = fm.width(text) h = fm.height() * 1.2 * (outputIndex + 1) + fm.height() / 2.0 y = h + ModelerGraphicItem.BOX_HEIGHT / 2.0 + 5 x = (-ModelerGraphicItem.BOX_WIDTH / 2 + 33 + w + 5 if not self.element.outputsFolded else 10) return QPointF(x, y) else: return QPointF(0, 0)
def drawText(self, p, innerRect, innerRadius, value): if not self.m_format: return f = QFont(self.font()) f.setPixelSize(10) fm = QFontMetricsF(f) maxWidth = fm.width(self.valueToText(self.m_max)) delta = innerRadius / maxWidth fontSize = f.pixelSize() * delta * 0.75 f.setPixelSize(int(fontSize)) p.setFont(f) textRect = QRectF(innerRect) p.setPen(self.palette().text().color()) p.drawText(textRect, Qt.AlignCenter, self.valueToText(value))
def _update_sidebar(self): # Margin 0 is used for line numbers fontmetrics = QFontMetricsF(self.__font) maxLine = math.ceil(math.log10(self.lines())) self.setMarginWidth(0, fontmetrics.width('0' * int(maxLine)) + 10) # Fold self.foldable_lines = [] lines = self.lines() for line in range(lines): text = self.text(line) if self.patFold.match(text): self.foldable_lines.append(line) if line in self.contractedFolds(): self.markerDelete(line, self._fold_collapsed_marker) self.markerDelete(line, self._fold_expanded_marker) self.markerAdd(line, self._fold_collapsed_marker) else: self.markerDelete(line, self._fold_collapsed_marker) self.markerDelete(line, self._fold_expanded_marker) self.markerAdd(line, self._fold_expanded_marker)
def _width_with_metrics(self, text): # Return the width of this piece of text when rendered using this # font. fontName = self.font["BaseFont"].name at = fontName.find("+") if at != -1: fontName = fontName[at + 1:] if "-" in fontName: family, style = fontName.split("-")[:2] elif " " in fontName: family, style = fontName.split(" ")[:2] elif "," in fontName: family, style = fontName.split(",")[:2] else: family = fontName style = "" font = QFontDatabase().font(family, style, self.size) font.setPointSizeF(self.size) fm = QFontMetricsF(font) return fm.width(text)
def _width_with_metrics(self, text): # Return the width of this piece of text when rendered using this # font. fontName = self.font["BaseFont"].name at = fontName.find("+") if at != -1: fontName = fontName[at+1:] if "-" in fontName: family, style = fontName.split("-")[:2] elif " " in fontName: family, style = fontName.split(" ")[:2] elif "," in fontName: family, style = fontName.split(",")[:2] else: family = fontName style = "" font = QFontDatabase().font(family, style, self.size) font.setPointSizeF(self.size) fm = QFontMetricsF(font) return fm.width(text)