From 83c8ca0ab459dbf7594abf90fdf4e83f9f121a74 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 10 Apr 2012 15:06:48 +1000 Subject: [PATCH] Don't create glyphs for truncated text. Instead of positioning truncated lines far out of the way where they won't be seen, simply skip them when creating the glyph node. Change-Id: I83bd8f76619d822fb22ec2ebd8c1e45c45b8b990 Reviewed-by: Yann Bodson --- src/quick/items/qquicktext.cpp | 30 +++++++++++++++++------------- src/quick/items/qquicktextnode.cpp | 9 +++++++-- src/quick/items/qquicktextnode_p.h | 3 ++- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index f34c062..f52138c 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -822,20 +822,16 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth, qreal *cons height = preLayoutHeight; characterCount = line.textStart() + line.textLength(); + visibleCount -= 1; - QTextLine previousLine = layout.lineAt(visibleCount - 2); + QTextLine previousLine = layout.lineAt(visibleCount - 1); elideText = layoutText.at(line.textStart() - 1) != QChar::LineSeparator ? elidedText(lineWidth, previousLine, &line) : elidedText(lineWidth, previousLine); elideStart = previousLine.textStart(); // elideEnd isn't required for right eliding. - // The previous line is the last one visible so move the current one off somewhere - // out of the way and back everything up one line. - line.setLineWidth(0); - line.setPosition(QPointF(FLT_MAX, FLT_MAX)); line = previousLine; - --visibleCount; height -= (lineHeightMode() == QQuickText::FixedHeight) ? lineHeight() : previousLine.height() * lineHeight(); break; } @@ -889,8 +885,6 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth, qreal *cons } else { br = br.united(line.naturalTextRect()); } - nextLine.setLineWidth(0); - nextLine.setPosition(QPointF(FLT_MAX, FLT_MAX)); break; } } @@ -991,8 +985,10 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth, qreal *cons truncated = true; if (elide) { - if (!elideLayout) + if (!elideLayout) { elideLayout = new QTextLayout; + elideLayout->setCacheEnabled(true); + } if (styledText) { QList formats; switch (elideMode) { @@ -1036,9 +1032,7 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth, qreal *cons br = br.united(elidedLine.naturalTextRect()); - if (visibleCount > 1) - line.setPosition(QPointF(FLT_MAX, FLT_MAX)); - else + if (visibleCount == 1) layout.clearLayout(); } else { delete elideLayout; @@ -2156,7 +2150,17 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data d->ensureDoc(); node->addTextDocument(bounds.topLeft(), d->extra->doc, color, d->style, styleColor, linkColor); } else if (d->elideMode == QQuickText::ElideNone || bounds.width() > 0.) { - node->addTextLayout(QPoint(0, bounds.y()), &d->layout, color, d->style, styleColor, linkColor); + int unelidedLineCount = d->lineCount; + if (d->elideLayout) + unelidedLineCount -= 1; + if (unelidedLineCount > 0) { + node->addTextLayout( + QPoint(0, bounds.y()), + &d->layout, + d->color, d->style, d->styleColor, d->linkColor, + QColor(), QColor(), -1, -1, + 0, unelidedLineCount); + } if (d->elideLayout) node->addTextLayout(QPoint(0, bounds.y()), d->elideLayout, color, d->style, styleColor, linkColor); } diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index 81340d6..597ebc4 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -1292,7 +1292,8 @@ void QQuickTextNode::addTextLayout(const QPointF &position, QTextLayout *textLay QQuickText::TextStyle style, const QColor &styleColor, const QColor &anchorColor, const QColor &selectionColor, const QColor &selectedTextColor, - int selectionStart, int selectionEnd) + int selectionStart, int selectionEnd, + int lineStart, int lineCount) { SelectionEngine engine; engine.setTextColor(color); @@ -1307,7 +1308,11 @@ void QQuickTextNode::addTextLayout(const QPointF &position, QTextLayout *textLay QVarLengthArray colorChanges; mergeFormats(textLayout, &colorChanges); - for (int i=0; ilineCount(); ++i) { + lineCount = lineCount >= 0 + ? qMin(lineStart + lineCount, textLayout->lineCount()) + : textLayout->lineCount(); + + for (int i=lineStart; ilineAt(i); int start = line.textStart(); diff --git a/src/quick/items/qquicktextnode_p.h b/src/quick/items/qquicktextnode_p.h index 2ecd20d..9e75731 100644 --- a/src/quick/items/qquicktextnode_p.h +++ b/src/quick/items/qquicktextnode_p.h @@ -84,7 +84,8 @@ public: QQuickText::TextStyle style = QQuickText::Normal, const QColor &styleColor = QColor(), const QColor &anchorColor = QColor(), const QColor &selectionColor = QColor(), const QColor &selectedTextColor = QColor(), - int selectionStart = -1, int selectionEnd = -1); + int selectionStart = -1, int selectionEnd = -1, + int lineStart = 0, int lineCount = -1); void addTextDocument(const QPointF &position, QTextDocument *textDocument, const QColor &color = QColor(), QQuickText::TextStyle style = QQuickText::Normal, const QColor &styleColor = QColor(), const QColor &anchorColor = QColor(), -- 2.7.4