Don't shrink a column when it spans multiple columns

If a cell spans multiple columns, then the merged cells' starting
column's maximum width should never become smaller than what was
calculated from previous rows.

Otherwise, we'd distribute the space of the column that has a span
across all merged columns, resulting in unnecessary line breaks esp if
WrapAnywhere is enabled.

Add a test case.

Fixes: QTBUG-91691
Fixes: QTBUG-95240
Pick-to: 6.2 5.15
Change-Id: Ic27dbdb128071e50fba049de85c9f23ba2f059b3
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
bb10
Volker Hilsheimer 2021-11-24 19:14:26 +01:00
parent 147093edd9
commit 9538c7ca73
2 changed files with 30 additions and 0 deletions

View File

@ -2545,6 +2545,8 @@ recalc_minmax_widths:
for (int n = 0; n < cspan; ++n) {
const int col = i + n;
QFixed w = widthToDistribute / (cspan - n);
if (td->maxWidths[col] != QFIXED_MAX)
w = qMax(td->maxWidths[col], w);
td->maxWidths[col] = qMax(td->minWidths.at(col), w);
widthToDistribute -= td->maxWidths.at(col);
if (widthToDistribute <= 0)

View File

@ -44,6 +44,7 @@
#include <QPainter>
#include <QPaintEngine>
#endif
#include <private/qtextdocumentlayout_p.h>
#include <private/qpagedpaintdevice_p.h>
typedef QList<int> IntList;
@ -100,6 +101,10 @@ private slots:
void checkBorderAttributes_data();
void checkBorderAttributes();
#ifndef QT_NO_WIDGETS
void columnWidthWithSpans();
#endif
private:
QTextTable *create2x2Table();
QTextTable *create4x4Table();
@ -1278,5 +1283,28 @@ void tst_QTextTable::checkBorderAttributes()
}
}
#ifndef QT_NO_WIDGETS
void tst_QTextTable::columnWidthWithSpans()
{
cleanup();
init();
QTextTable *table = cursor.insertTable(4, 4);
QTextEdit textEdit;
textEdit.setDocument(doc);
textEdit.show();
QVERIFY(QTest::qWaitForWindowExposed(&textEdit));
for (int i = 0; i < table->columns(); ++i)
table->cellAt(0, i).firstCursorPosition().insertText(QString("Header %1").arg(i));
QTextBlock block = table->cellAt(0, 0).firstCursorPosition().block();
const QRectF beforeRect = table->document()->documentLayout()->blockBoundingRect(block);
table->mergeCells(1, 0, 1, table->columns());
block = table->cellAt(0, 0).firstCursorPosition().block();
const QRectF afterRect = table->document()->documentLayout()->blockBoundingRect(block);
QCOMPARE(afterRect, beforeRect);
}
#endif
QTEST_MAIN(tst_QTextTable)
#include "tst_qtexttable.moc"