diff options
author | Liang Qi <liang.qi@qt.io> | 2019-01-26 08:35:40 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2019-01-26 08:35:40 +0100 |
commit | 980567b3a32b2e2f00c86f2d627cd82b5230dd0f (patch) | |
tree | bc8cc4005b2e07cbc5cad8ba30f8c9fa4f236c3d /src/widgets/styles/qcommonstyle.cpp | |
parent | e81acde7d0cf5fb44a3fb2cf0bf7aaa2c65f807e (diff) | |
parent | 730cbad8824bcfcb7ab60371a6563cfb6dd5658d (diff) |
Merge remote-tracking branch 'origin/5.12' into dev
Conflicts:
src/android/templates/AndroidManifest.xml
tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
Change-Id: I4c9679e3a8ebba118fbf4772301ff8fde60455b9
Diffstat (limited to 'src/widgets/styles/qcommonstyle.cpp')
-rw-r--r-- | src/widgets/styles/qcommonstyle.cpp | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index 49543061cc..2bfc1acc26 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -946,17 +946,20 @@ void QCommonStylePrivate::viewItemDrawText(QPainter *p, const QStyleOptionViewIt const QRectF boundingRect = textLayout.boundingRect(); const QRect layoutRect = QStyle::alignedRect(option->direction, option->displayAlignment, boundingRect.size().toSize(), textRect); - const QPointF position = layoutRect.topLeft(); - const int lineCount = textLayout.lineCount(); + QPointF paintPosition = QPointF(textRect.x(), layoutRect.top()); + QString newText; qreal height = 0; + const int lineCount = textLayout.lineCount(); for (int i = 0; i < lineCount; ++i) { const QTextLine line = textLayout.lineAt(i); height += line.height(); // above visible rect - if (height + layoutRect.top() <= textRect.top()) + if (height + layoutRect.top() <= textRect.top()) { + paintPosition.ry() += line.height(); continue; + } const int start = line.textStart(); const int length = line.textLength(); @@ -971,26 +974,33 @@ void QCommonStylePrivate::viewItemDrawText(QPainter *p, const QStyleOptionViewIt elideLastVisibleLine = true; } + QString text = textLayout.text().mid(start, length); if (drawElided || elideLastVisibleLine) { - QString text = textLayout.text().mid(start, length); - if (elideLastVisibleLine) + if (elideLastVisibleLine) { + if (text.endsWith(QChar::LineSeparator)) + text.chop(1); text += QChar(0x2026); + } const QStackTextEngine engine(text, option->font); - const QString elidedText = engine.elidedText(option->textElideMode, textRect.width()); - const QPointF pos(position.x() + line.x(), - position.y() + line.y() + line.ascent()); - p->save(); - p->setFont(option->font); - p->drawText(pos, elidedText); - p->restore(); + newText += engine.elidedText(option->textElideMode, textRect.width()); + // sometimes drawElided is true but no eliding is done so the text ends + // with QChar::LineSeparator - don't add another one. This happened with + // arabic text in the testcase for QTBUG-72805 + if (i < lineCount - 1 && + !newText.endsWith(QChar::LineSeparator)) + newText += QChar::LineSeparator; } else { - line.draw(p, position); + newText += text; } // below visible text, can stop if (height + layoutRect.top() >= textRect.bottom()) break; } + + textLayout.setText(newText); + viewItemTextLayout(textLayout, textRect.width()); + textLayout.draw(p, paintPosition); } /*! \internal |