QTextLayout: fix maximumWidth() for a text containing spaces

When laying out a text and calculating maxWidth, we must _always_ take
into account the accumulated width of spaces (lbh.spaceData.textWidth)
regardless of wrapMode, other text content, spaces position, etc.

Fixes: QTBUG-106947
Change-Id: I2ac9af92ed7dd07c1e040bfcf83949a358d1c9c9
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
bb10
Vladimir Belyavsky 2022-09-26 19:32:50 +03:00
parent fd28c97075
commit 4945fd93f1
2 changed files with 15 additions and 7 deletions

View File

@ -1976,7 +1976,6 @@ void QTextLine::layout_helper(int maxGlyphs)
}
if (!lbh.manualWrap && lbh.spaceData.textWidth > line.width) {
lbh.spaceData.textWidth = line.width; // ignore spaces that fall out of the line.
goto found;
}
} else {
@ -2162,12 +2161,9 @@ found:
eng->maxWidth = qMax(eng->maxWidth, line.textWidth);
} else {
eng->minWidth = qMax(eng->minWidth, lbh.minw);
eng->maxWidth += line.textWidth;
eng->maxWidth += line.textWidth + lbh.spaceData.textWidth;
}
if (line.textWidth > 0 && item < eng->layoutData->items.size())
eng->maxWidth += lbh.spaceData.textWidth;
line.textWidth += trailingSpace;
if (lbh.spaceData.length) {
line.trailingSpaces = lbh.spaceData.length;

View File

@ -124,6 +124,7 @@ private slots:
void tooManyDirectionalCharctersCrash_qtbug77819();
void softHyphens_data();
void softHyphens();
void min_maximumWidth_data();
void min_maximumWidth();
private:
@ -2647,10 +2648,21 @@ void tst_QTextLayout::softHyphens()
}
}
void tst_QTextLayout::min_maximumWidth_data()
{
QTest::addColumn<QString>("text");
QTest::newRow("long string") << QStringLiteral("lmong_long_crazy_87235982735_23857239682376923876923876-fuwhfhfw-names-AAAA-deeaois2019-03-03.and.more");
QTest::newRow("QTBUG-106947") << QStringLiteral("text text");
QTest::newRow("spaces") << QStringLiteral(" text text ");
}
void tst_QTextLayout::min_maximumWidth()
{
QString longString("lmong_long_crazy_87235982735_23857239682376923876923876-fuwhfhfw-names-AAAA-deeaois2019-03-03.and.more");
QTextLayout layout(longString, testFont);
QFETCH(QString, text);
QTextLayout layout(text, testFont);
layout.setCacheEnabled(true);
for (int wrapMode = QTextOption::NoWrap; wrapMode <= QTextOption::WrapAtWordBoundaryOrAnywhere; ++wrapMode) {
QTextOption opt;