Fixed a bug where spans across empty cells got broken.

If a row/column is only used only because of the spanning of an item,
the cell should be treated as it didn't exist. We keep track of this
with the "ignore" bit array.

The old code would always start from the row/column at position 1.
In the attached testcase this made the effectiveRowSpan become larger
than actually needed.

Task-number: QTBUG-30255

Change-Id: Ief0e7018ee8e5ee36272ce075a43312ffeac7b91
Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
This commit is contained in:
Jan Arve Saether 2013-04-02 14:35:47 +02:00 committed by The Qt Project
parent 52ebf1f191
commit 4f072e2d3d
2 changed files with 29 additions and 1 deletions

View File

@ -1475,7 +1475,7 @@ void QGridLayoutEngine::fillRowData(QGridLayoutRowData *rowData, const QLayoutSt
int effectiveRowSpan = 1;
for (int i = 1; i < itemRowSpan; ++i) {
if (!rowData->ignore.testBit(i))
if (!rowData->ignore.testBit(i + itemRow))
++effectiveRowSpan;
}

View File

@ -126,6 +126,7 @@ private slots:
void spanningItem2x3_data();
void spanningItem2x3();
void spanningItem();
void spanAcrossEmptyRow();
void heightForWidth();
void widthForHeight();
void heightForWidthWithSpanning();
@ -3352,6 +3353,33 @@ void tst_QGraphicsGridLayout::spanningItem()
QCOMPARE(layout->maximumSize(), QSizeF(160,80));
}
void tst_QGraphicsGridLayout::spanAcrossEmptyRow()
{
QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window);
QGraphicsGridLayout *layout = new QGraphicsGridLayout(form);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
RectWidget *w1 = new RectWidget;
RectWidget *w2 = new RectWidget;
RectWidget *w3 = new RectWidget;
QSizeF size(10, 10);
for (int i = 0; i < 3; ++i) {
w1->setSizeHint((Qt::SizeHint)i, size);
w2->setSizeHint((Qt::SizeHint)i, size);
w3->setSizeHint((Qt::SizeHint)i, size);
size+=size; //[(10,10), (20,20), (40,40)]
}
layout->addItem(w1, 0, 0, 1, 1);
layout->addItem(w2, 0, 1, 1, 2);
layout->addItem(w3, 0, 99, 1, 1);
form->resize(60,20);
QCOMPARE(w1->geometry(), QRectF( 0, 0, 20, 20));
QCOMPARE(w2->geometry(), QRectF(20, 0, 20, 20));
QCOMPARE(w3->geometry(), QRectF(40, 0, 20, 20));
}
void tst_QGraphicsGridLayout::stretchAndHeightForWidth()
{
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);