/*! Draw a text document into a rectangle \param painter Painter \param rect Traget rectangle \param flags Alignments/Text flags, see QPainter::drawText() \param text Text document */ void QwtPainter::drawSimpleRichText( QPainter *painter, const QRectF &rect, int flags, const QTextDocument &text ) { QTextDocument *txt = text.clone(); painter->save(); painter->setFont( txt->defaultFont() ); qwtUnscaleFont( painter ); txt->setDefaultFont( painter->font() ); txt->setPageSize( QSizeF( rect.width(), QWIDGETSIZE_MAX ) ); QAbstractTextDocumentLayout* layout = txt->documentLayout(); const double height = layout->documentSize().height(); double y = rect.y(); if ( flags & Qt::AlignBottom ) y += ( rect.height() - height ); else if ( flags & Qt::AlignVCenter ) y += ( rect.height() - height ) / 2; QAbstractTextDocumentLayout::PaintContext context; context.palette.setColor( QPalette::Text, painter->pen().color() ); painter->translate( rect.x(), y ); layout->draw( painter, context ); painter->restore(); delete txt; }
void mousePressEvent(QMouseEvent *event) { QAbstractTextDocumentLayout *layout = m_document->documentLayout(); if (layout) { m_anchor = layout->anchorAt(event->pos()); } }
void QwtPainter::drawSimpleRichText(QPainter *painter, const QRect &rect, int flags, QTextDocument &text) { const QRect scaledRect = d_metricsMap.layoutToDevice(rect, painter); text.setPageSize(QSize(scaledRect.width(), QWIDGETSIZE_MAX)); QAbstractTextDocumentLayout* layout = text.documentLayout(); const int height = qRound(layout->documentSize().height()); int y = scaledRect.y(); if (flags & Qt::AlignBottom) y += (scaledRect.height() - height); else if (flags & Qt::AlignVCenter) y += (scaledRect.height() - height)/2; QAbstractTextDocumentLayout::PaintContext context; context.palette.setColor(QPalette::Text, painter->pen().color()); painter->save(); painter->translate(scaledRect.x(), y); layout->draw(painter, context); painter->restore(); }
void PsiTipLabel::paintEvent(QPaintEvent *) { QStylePainter p(this); QStyleOptionFrame opt; opt.init(this); p.drawPrimitive(QStyle::PE_PanelTipLabel, opt); p.end(); // stolen from QLabel::paintEvent QPainter painter(this); drawFrame(&painter); QRect cr = contentsRect(); cr.adjust(margin, margin, -margin, -margin); PsiRichText::ensureTextLayouted(doc, width() - 2*margin); QAbstractTextDocumentLayout *layout = doc->documentLayout(); // QRect lr = rect(); QRect lr = cr; QAbstractTextDocumentLayout::PaintContext context; // Adjust the palette context.palette = palette(); if (foregroundRole() != QPalette::Text && isEnabled()) context.palette.setColor(QPalette::Text, context.palette.color(foregroundRole())); painter.save(); painter.translate(lr.x() + 1, lr.y() + 1); painter.setClipRect(lr.translated(-lr.x() - 1, -lr.y() - 1)); layout->draw(&painter, context); painter.restore(); }
bool VMdEditor::isBlockVisible(const QTextBlock &p_block) { if (!p_block.isValid() || !p_block.isVisible()) { return false; } QScrollBar *vbar = verticalScrollBar(); if (!vbar || !vbar->isVisible()) { // No vertical scrollbar. return true; } int height = rect().height(); QScrollBar *hbar = horizontalScrollBar(); if (hbar && hbar->isVisible()) { height -= hbar->height(); } QAbstractTextDocumentLayout *layout = document()->documentLayout(); QRectF rect = layout->blockBoundingRect(p_block); int y = GETVISUALOFFSETY; int rectHeight = (int)rect.height(); return (y >= 0 && y < height) || (y < 0 && y + rectHeight > 0); }
void mouseReleaseEvent(QMouseEvent *event) { QAbstractTextDocumentLayout *layout = m_document->documentLayout(); if (layout) { QString anchor = layout->anchorAt(event->pos()); if (anchor == m_anchor) { m_toolTip->linkActivated(m_anchor, event); } m_anchor.clear(); } }
QT_BEGIN_NAMESPACE ExpandingTextEdit::ExpandingTextEdit(QWidget *parent) : QTextEdit(parent) { setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding)); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); QAbstractTextDocumentLayout *docLayout = document()->documentLayout(); connect(docLayout, SIGNAL(documentSizeChanged(QSizeF)), SLOT(updateHeight(QSizeF))); connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(reallyEnsureCursorVisible())); m_minimumHeight = qRound(docLayout->documentSize().height()) + frameWidth() * 2; }
/*! Draw a text document into a rectangle \param painter Painter \param rect Traget rectangle \param flags Alignments/Text flags, see QPainter::drawText() \param text Text document */ void QwtPainter::drawSimpleRichText( QPainter *painter, const QRectF &rect, int flags, const QTextDocument &text ) { QTextDocument *txt = text.clone(); painter->save(); QRectF unscaledRect = rect; if ( painter->font().pixelSize() < 0 ) { const QSize res = qwtScreenResolution(); const QPaintDevice *pd = painter->device(); if ( pd->logicalDpiX() != res.width() || pd->logicalDpiY() != res.height() ) { QTransform transform; transform.scale( res.width() / double( pd->logicalDpiX() ), res.height() / double( pd->logicalDpiY() )); painter->setWorldTransform( transform, true ); unscaledRect = transform.inverted().mapRect(rect); } } txt->setDefaultFont( painter->font() ); txt->setPageSize( QSizeF( unscaledRect.width(), QWIDGETSIZE_MAX ) ); QAbstractTextDocumentLayout* layout = txt->documentLayout(); const double height = layout->documentSize().height(); double y = unscaledRect.y(); if ( flags & Qt::AlignBottom ) y += ( unscaledRect.height() - height ); else if ( flags & Qt::AlignVCenter ) y += ( unscaledRect.height() - height ) / 2; QAbstractTextDocumentLayout::PaintContext context; context.palette.setColor( QPalette::Text, painter->pen().color() ); painter->translate( unscaledRect.x(), y ); layout->draw( painter, context ); painter->restore(); delete txt; }
void NumberBar::paintEvent(QPaintEvent *event) { QPainter painter(this); QAbstractTextDocumentLayout *layout = edit->document()->documentLayout(); QTextBlock block = edit->document()->begin(); int vscrollValue = edit->verticalScrollBar()->value(); for (int i=1; block.isValid(); i++, block=block.next()) { const QRectF rect = layout->blockBoundingRect(block); if (block.isVisible()) { painter.drawText(-1, qRound(rect.top())-vscrollValue+1, width(), fontMetrics().height(), Qt::AlignRight, QString::number(i)); } else if (rect.top() > vscrollValue) { break; } } }
void QLineNumberArea::paintEvent(QPaintEvent *) { QAbstractTextDocumentLayout* layout = textEditor->document()->documentLayout(); int contentsY = textEditor->verticalScrollBar()->value(); qreal pageBottom = contentsY + textEditor->viewport()->height(); const QFontMetrics fm = fontMetrics(); const int ascent = fontMetrics().ascent() + 1; int lineCount = 1; QPainter p(this); // textEditor->document()-> QTextBlock block = textEditor->document()->begin(); for(;block.isValid(); block = block.next(), lineCount++) { const QRectF boundingRect = layout->blockBoundingRect(block); QPointF position = boundingRect.topLeft(); if(position.y() + boundingRect.height() < contentsY) continue; if(position.y() > pageBottom) break; const QString txt = QString::number(lineCount); QFont f = p.font(); QFont q = p.font(); const int i = boldLines.indexOf(lineCount); if(i!=-1) { //float r = ((float)i) / ((float)max_run_hist); f.setBold(true); p.setFont(f); } p.drawText(width() - fm.width(txt), qRound( position.y() ) - contentsY + ascent, txt); if(i!=-1) { p.setFont(q); } } }
void PlaylistLargeItemDelegate::drawRichText( QPainter* painter, const QRect& rect, int flags, QTextDocument& text ) const { text.setPageSize( QSize( rect.width(), QWIDGETSIZE_MAX ) ); QAbstractTextDocumentLayout* layout = text.documentLayout(); const int height = qRound( layout->documentSize().height() ); int y = rect.y(); if ( flags & Qt::AlignBottom ) y += ( rect.height() - height ); else if ( flags & Qt::AlignVCenter ) y += ( rect.height() - height ) / 2; QAbstractTextDocumentLayout::PaintContext context; context.palette.setColor( QPalette::Text, painter->pen().color() ); painter->save(); painter->translate( rect.x(), y ); layout->draw( painter, context ); painter->restore(); }
/*! \brief Dessine la barre. Cette méthode est appelée automatiquement dès que nécessaire. \param pEvent <Inutilisé> Évènement de dessin */ void BarreNombres::paintEvent(QPaintEvent */*pEvent*/) { QAbstractTextDocumentLayout *layout = m_edit->document()->documentLayout(); int contentsY = m_edit->verticalScrollBar()->value(); qreal pageBottom = contentsY + m_edit->viewport()->height(); const QFontMetrics fm = fontMetrics(); const int ascent = fontMetrics().ascent() + 1; int lineCount = 1; QPainter p(this); for (QTextBlock block = m_edit->document()->begin(); block.isValid(); block = block.next(), lineCount++) { const QRectF boundingRect = layout->blockBoundingRect(block); QPointF position = boundingRect.topLeft(); if (position.y() + boundingRect.height() < contentsY) continue; if (position.y() > pageBottom) break; const QString txt = QString::number(lineCount); p.drawText(width() - fm.width(txt), qRound(position.y()) - contentsY + ascent, txt); } }
void NumberBar::paintEvent( QPaintEvent * ) { QAbstractTextDocumentLayout *layout = edit->document()->documentLayout(); int contentsY = edit->verticalScrollBar()->value(); qreal pageBottom = contentsY + edit->viewport()->height(); const QFontMetrics fm = fontMetrics(); const int ascent = fontMetrics().ascent() + 1; // height = ascent + descent + 1 int lineCount = 1; QPainter p(this); markedRect = QRect(); for ( QTextBlock block = edit->document()->begin(); block.isValid(); block = block.next(), ++lineCount ) { const QRectF boundingRect = layout->blockBoundingRect( block ); QPointF position = boundingRect.topLeft(); if ( position.y() + boundingRect.height() < contentsY ) continue; if ( position.y() > pageBottom ) break; const QString txt = QString::number( lineCount ); p.drawText( width() - fm.width(txt), qRound( position.y() ) - contentsY + ascent, txt ); // marker if ( markedLine == lineCount ) { p.drawPixmap( 1, qRound( position.y() ) - contentsY, markerIcon ); markedRect = QRect( 1, qRound( position.y() ) - contentsY, markerIcon.width(), markerIcon.height() ); } } }
void QFCompleterTextEditNumberBar::paintEvent(QPaintEvent */*event*/) { QTextDocument* doc=editor->document(); QAbstractTextDocumentLayout *layout = doc->documentLayout(); qreal yPosition=editor->verticalScrollBar()->value(); qreal vpHeight=editor->viewport()->height(); QPainter p(this); p.setFont(linenumberFont); int linenumberWidth=QString::number(doc->blockCount()).size()*p.fontMetrics().width("0")+4; int markerheight=p.fontMetrics().ascent()+2; // set the width of the widget setFixedWidth(linenumberWidth+markerWidth+2); // first we draw the background p.setBrush(QBrush(linenumberColumnColor)); p.setPen(QPen(linenumberColumnColor)); p.drawRect(0,0,width(),vpHeight); p.setPen(QPen(markerColumnColor)); p.setBrush(QBrush(markerColumnColor)); p.drawRect(linenumberWidth,0,width()-linenumberWidth,vpHeight); // reset the rect of all markers QMutableMapIterator<int, itemData> i(markers); while (i.hasNext()) { i.next(); itemData d=i.value(); d.rect=QRect(0,0,0,0); i.setValue(d); } // now we draw the line numbers p.setPen(QPen(linenumberColor)); for (QTextBlock it = doc->begin(); it != doc->end(); it = it.next()) { QRectF brect=layout->blockBoundingRect(it); qreal bottompos=brect.y()+brect.height(); markerheight=brect.height()-8; // we end this loop if the current block lies below the viewport if (brect.y() > yPosition+ vpHeight) break; // if we are inside the viewport, we have to paint a line number for this line if (bottompos >= yPosition) { QString txt = QString::number(it.blockNumber()+1); p.drawText(1, brect.y()-yPosition, linenumberWidth-2, brect.height(), Qt::AlignRight|Qt::AlignVCenter, txt); if (markers.contains(it.blockNumber()+1)) { itemData d=markers[it.blockNumber()+1]; QRect markerrect=QRect(linenumberWidth+2, brect.y()-yPosition+4, width()-linenumberWidth-4, markerheight); markers[it.blockNumber()+1].rect=markerrect; if (d.type==mtInfo) { //p.drawImage(linenumberWidth+2, brect.y()-yPosition, QIcon(":/event_info.png")); p.setBrush(infoMarkerColor); QPen pe=p.pen(); pe.setColor(QColor("black")); pe.setCosmetic(true); pe.setWidth(1); p.setPen(pe); p.drawRect(markerrect); } else if (d.type==mtError) { //p.drawImage(linenumberWidth+2, brect.y()-yPosition, QIcon(":/event_error.png")); p.setBrush(errorMarkerColor); QPen pe=p.pen(); pe.setColor(QColor("black")); pe.setCosmetic(true); pe.setWidth(1); p.setPen(pe); p.drawRect(markerrect); } else { //p.drawImage(linenumberWidth+2, brect.y()-yPosition, QIcon(":/event_warning.png")); p.setBrush(warningMarkerColor); QPen pe=p.pen(); pe.setColor(QColor("black")); pe.setCosmetic(true); pe.setWidth(1); p.setPen(pe); p.drawRect(markerrect); } } } } }
/*!\reimp */ void QLabel::paintEvent(QPaintEvent *) { Q_D(QLabel); QStyle *style = QWidget::style(); QPainter painter(this); drawFrame(&painter); QRect cr = contentsRect(); cr.adjust(d->margin, d->margin, -d->margin, -d->margin); int align = QStyle::visualAlignment(layoutDirection(), QFlag(d->align)); #ifndef QT_NO_MOVIE if (d->movie) { if (d->scaledcontents) style->drawItemPixmap(&painter, cr, align, d->movie->currentPixmap().scaled(cr.size())); else style->drawItemPixmap(&painter, cr, align, d->movie->currentPixmap()); } else #endif if (d->isTextLabel) { QRectF lr = d->layoutRect(); if (d->control) { #ifndef QT_NO_SHORTCUT const bool underline = (bool)style->styleHint(QStyle::SH_UnderlineShortcut, 0, this, 0); if (d->shortcutId != 0 && underline != d->shortcutCursor.charFormat().fontUnderline()) { QTextCharFormat fmt; fmt.setFontUnderline(underline); d->shortcutCursor.mergeCharFormat(fmt); } #endif d->ensureTextLayouted(); QAbstractTextDocumentLayout::PaintContext context; QStyleOption opt(0); opt.init(this); if (!isEnabled() && style->styleHint(QStyle::SH_EtchDisabledText, &opt, this)) { context.palette = palette(); context.palette.setColor(QPalette::Text, context.palette.light().color()); painter.save(); painter.translate(lr.x() + 1, lr.y() + 1); painter.setClipRect(lr.translated(-lr.x() - 1, -lr.y() - 1)); QAbstractTextDocumentLayout *layout = d->control->document()->documentLayout(); layout->draw(&painter, context); painter.restore(); } // Adjust the palette context.palette = palette(); if (foregroundRole() != QPalette::Text && isEnabled()) context.palette.setColor(QPalette::Text, context.palette.color(foregroundRole())); painter.save(); painter.translate(lr.topLeft()); painter.setClipRect(lr.translated(-lr.x(), -lr.y())); d->control->setPalette(context.palette); d->control->drawContents(&painter, QRectF(), this); painter.restore(); } else { int flags = align; if (d->hasShortcut) { flags |= Qt::TextShowMnemonic; QStyleOption opt; opt.initFrom(this); if (!style->styleHint(QStyle::SH_UnderlineShortcut, &opt, this)) flags |= Qt::TextHideMnemonic; } style->drawItemText(&painter, lr.toRect(), flags, palette(), isEnabled(), d->text, foregroundRole()); } } else #ifndef QT_NO_PICTURE if (d->picture) { QRect br = d->picture->boundingRect(); int rw = br.width(); int rh = br.height(); if (d->scaledcontents) { painter.save(); painter.translate(cr.x(), cr.y()); painter.scale((double)cr.width()/rw, (double)cr.height()/rh); painter.drawPicture(-br.x(), -br.y(), *d->picture); painter.restore(); } else { int xo = 0; int yo = 0; if (align & Qt::AlignVCenter) yo = (cr.height()-rh)/2; else if (align & Qt::AlignBottom) yo = cr.height()-rh; if (align & Qt::AlignRight) xo = cr.width()-rw; else if (align & Qt::AlignHCenter) xo = (cr.width()-rw)/2; painter.drawPicture(cr.x()+xo-br.x(), cr.y()+yo-br.y(), *d->picture); } } else #endif if (d->pixmap && !d->pixmap->isNull()) { QPixmap pix; if (d->scaledcontents) { if (!d->scaledpixmap || d->scaledpixmap->size() != cr.size()) { if (!d->cachedimage) d->cachedimage = new QImage(d->pixmap->toImage()); delete d->scaledpixmap; d->scaledpixmap = new QPixmap(QPixmap::fromImage(d->cachedimage->scaled(cr.size(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation))); } pix = *d->scaledpixmap; } else pix = *d->pixmap; QStyleOption opt; opt.initFrom(this); if (!isEnabled()) pix = style->generatedIconPixmap(QIcon::Disabled, pix, &opt); style->drawItemPixmap(&painter, cr, align, pix); } }
void VMdEditor::makeBlockVisible(const QTextBlock &p_block) { if (!p_block.isValid() || !p_block.isVisible()) { return; } QScrollBar *vbar = verticalScrollBar(); if (!vbar || (vbar->minimum() == vbar->maximum())) { // No vertical scrollbar. No need to scroll. return; } int height = rect().height(); QScrollBar *hbar = horizontalScrollBar(); if (hbar && (hbar->minimum() != hbar->maximum())) { height -= hbar->height(); } bool moved = false; QAbstractTextDocumentLayout *layout = document()->documentLayout(); QRectF rect = layout->blockBoundingRect(p_block); int y = GETVISUALOFFSETY; int rectHeight = (int)rect.height(); // Handle the case rectHeight >= height. if (rectHeight >= height) { if (y < 0) { // Need to scroll up. while (y + rectHeight < height && vbar->value() > vbar->minimum()) { moved = true; vbar->setValue(vbar->value() - vbar->singleStep()); rect = layout->blockBoundingRect(p_block); rectHeight = (int)rect.height(); y = GETVISUALOFFSETY; } } else if (y > 0) { // Need to scroll down. while (y > 0 && vbar->value() < vbar->maximum()) { moved = true; vbar->setValue(vbar->value() + vbar->singleStep()); rect = layout->blockBoundingRect(p_block); rectHeight = (int)rect.height(); y = GETVISUALOFFSETY; } if (y < 0) { // One step back. moved = true; vbar->setValue(vbar->value() - vbar->singleStep()); } } if (moved) { qDebug() << "scroll to make huge block visible"; } return; } while (y < 0 && vbar->value() > vbar->minimum()) { moved = true; vbar->setValue(vbar->value() - vbar->singleStep()); rect = layout->blockBoundingRect(p_block); rectHeight = (int)rect.height(); y = GETVISUALOFFSETY; } if (moved) { qDebug() << "scroll page down to make block visible"; return; } while (y + rectHeight > height && vbar->value() < vbar->maximum()) { moved = true; vbar->setValue(vbar->value() + vbar->singleStep()); rect = layout->blockBoundingRect(p_block); rectHeight = (int)rect.height(); y = GETVISUALOFFSETY; } if (moved) { qDebug() << "scroll page up to make block visible"; } }