diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2019-02-27 19:48:22 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2019-02-28 19:09:23 +0000 |
commit | 634b59f187c8697f03a606cbacb5f0a69650ea7c (patch) | |
tree | 9ac452c5667c9a0ce8eaf8d91561e2608b3e440c /src/quick/items | |
parent | 6bc72d76b60de1e02e5356d48ee662568cc624c6 (diff) |
Text: render table cell backgrounds properly
QQuickTextNodeEngine::addTextBlock() was noticing the background color of
text fragments, including those within table cells (and adding to the
colorChanges vector for rendering), but not rendering a rectangle for the
background of the entire table cell. So while the color was correct, it
only took up as much space as the text itself.
Also, QTextDocumentLayout needs to be told how much width is available
so that QTextDocumentLayoutPrivate::layoutTable() will allocate cell width
appropriately in case width is given as a percentage, e.g. <td width="20%">.
This is done by calling QTextDocument::setPageSize() with correct width in
pixels rather than zero.
Fixes: QTBUG-72457
Change-Id: I5c8f861829f76d1cf4044fccd1142c3817bb33bc
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquicktext.cpp | 4 | ||||
-rw-r--r-- | src/quick/items/qquicktextnodeengine.cpp | 18 |
2 files changed, 13 insertions, 9 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index dd7fbccff5..8b6f59497f 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -442,7 +442,7 @@ void QQuickTextPrivate::updateSize() if (internalWidthUpdate) return; - extra->doc->setPageSize(QSizeF()); + extra->doc->setPageSize(QSizeF(q->width(), -1)); if (q->widthValid() && (wrapMode != QQuickText::NoWrap || extra->doc->idealWidth() < availableWidth())) extra->doc->setTextWidth(availableWidth()); else @@ -1247,7 +1247,7 @@ void QQuickTextPrivate::ensureDoc() if (!extra.isAllocated() || !extra->doc) { Q_Q(QQuickText); extra.value().doc = new QQuickTextDocumentWithImageResources(q); - extra->doc->setPageSize(QSizeF(0, 0)); + extra->doc->setPageSize(QSizeF(q->width(), -1)); extra->doc->setDocumentMargin(0); extra->doc->setBaseUrl(q->baseUrl()); qmlobject_connect(extra->doc, QQuickTextDocumentWithImageResources, SIGNAL(imagesLoaded()), diff --git a/src/quick/items/qquicktextnodeengine.cpp b/src/quick/items/qquicktextnodeengine.cpp index 504d629b3e..36fc168ec2 100644 --- a/src/quick/items/qquicktextnodeengine.cpp +++ b/src/quick/items/qquicktextnodeengine.cpp @@ -967,9 +967,14 @@ void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QText QVarLengthArray<QTextLayout::FormatRange> colorChanges; mergeFormats(block.layout(), &colorChanges); - QPointF blockPosition = textDocument->documentLayout()->blockBoundingRect(block).topLeft() + position; + const QTextCharFormat charFormat = block.charFormat(); + const QRectF blockBoundingRect = textDocument->documentLayout()->blockBoundingRect(block).translated(position); + + if (charFormat.background().style() != Qt::NoBrush) + m_backgrounds.append(qMakePair(blockBoundingRect, charFormat.background().color())); + if (QTextList *textList = block.textList()) { - QPointF pos = blockPosition; + QPointF pos = blockBoundingRect.topLeft(); QTextLayout *layout = block.layout(); if (layout->lineCount() > 0) { QTextLine firstLine = layout->lineAt(0); @@ -982,7 +987,6 @@ void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QText if (block.textDirection() == Qt::RightToLeft) pos.rx() += textRect.width(); - const QTextCharFormat charFormat = block.charFormat(); QFont font(charFormat.font()); QFontMetricsF fontMetrics(font); QTextListFormat listFormat = textList->format(); @@ -1043,11 +1047,11 @@ void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QText int fontHeight = fontMetrics.descent() + fontMetrics.ascent(); int valign = charFormat.verticalAlignment(); if (valign == QTextCharFormat::AlignSuperScript) - setPosition(QPointF(blockPosition.x(), blockPosition.y() - fontHeight / 2)); + setPosition(QPointF(blockBoundingRect.x(), blockBoundingRect.y() - fontHeight / 2)); else if (valign == QTextCharFormat::AlignSubScript) - setPosition(QPointF(blockPosition.x(), blockPosition.y() + fontHeight / 6)); + setPosition(QPointF(blockBoundingRect.x(), blockBoundingRect.y() + fontHeight / 6)); else - setPosition(blockPosition); + setPosition(blockBoundingRect.topLeft()); if (text.contains(QChar::ObjectReplacementCharacter)) { QTextFrame *frame = qobject_cast<QTextFrame *>(textDocument->objectForFormat(charFormat)); @@ -1101,7 +1105,7 @@ void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QText #if QT_CONFIG(im) if (preeditLength >= 0 && textPos <= block.position() + preeditPosition) { - setPosition(blockPosition); + setPosition(blockBoundingRect.topLeft()); textPos = block.position() + preeditPosition; QTextLine line = block.layout()->lineForTextPosition(preeditPosition); if (!currentLine().isValid() |