diff options
-rw-r--r-- | src/gui/kernel/qlayoutengine.cpp | 25 | ||||
-rw-r--r-- | tests/auto/qboxlayout/tst_qboxlayout.cpp | 27 |
2 files changed, 43 insertions, 9 deletions
diff --git a/src/gui/kernel/qlayoutengine.cpp b/src/gui/kernel/qlayoutengine.cpp index a333eda..1d8731a 100644 --- a/src/gui/kernel/qlayoutengine.cpp +++ b/src/gui/kernel/qlayoutengine.cpp @@ -83,9 +83,7 @@ void qGeomCalc(QVector<QLayoutStruct> &chain, int start, int count, int cMax = 0; int sumStretch = 0; int sumSpacing = 0; - - bool wannaGrow = false; // anyone who really wants to grow? - // bool canShrink = false; // anyone who could be persuaded to shrink? + int expandingCount = 0; bool allEmptyNonstretch = true; int pendingSpacing = -1; @@ -111,8 +109,9 @@ void qGeomCalc(QVector<QLayoutStruct> &chain, int start, int count, } pendingSpacing = data->effectiveSpacer(spacer); } - wannaGrow = wannaGrow || data->expansive || data->stretch > 0; - allEmptyNonstretch = allEmptyNonstretch && !wannaGrow && data->empty; + if (data->expansive) + expandingCount++; + allEmptyNonstretch = allEmptyNonstretch && data->empty && !data->expansive && data->stretch <= 0; } int extraspace = 0; @@ -233,13 +232,14 @@ void qGeomCalc(QVector<QLayoutStruct> &chain, int start, int count, QLayoutStruct *data = &chain[i]; if (!data->done && (data->maximumSize <= data->smartSizeHint() - || (wannaGrow && !data->expansive && data->stretch == 0) || (!allEmptyNonstretch && data->empty && !data->expansive && data->stretch == 0))) { data->size = data->smartSizeHint(); data->done = true; space_left -= data->size; sumStretch -= data->stretch; + if (data->expansive) + expandingCount--; n--; } } @@ -265,10 +265,13 @@ void qGeomCalc(QVector<QLayoutStruct> &chain, int start, int count, if (data->done) continue; extraspace = 0; - if (sumStretch <= 0) - fp_w += fp_space / n; - else + if (sumStretch > 0) { fp_w += (fp_space * data->stretch) / sumStretch; + } else if (expandingCount > 0) { + fp_w += (fp_space * (data->expansive ? 1 : 0)) / expandingCount; + } else { + fp_w += fp_space * 1 / n; + } int w = fRound(fp_w); data->size = w; fp_w -= toFixed(w); // give the difference to the next @@ -287,6 +290,8 @@ void qGeomCalc(QVector<QLayoutStruct> &chain, int start, int count, data->done = true; space_left -= data->smartSizeHint(); sumStretch -= data->stretch; + if (data->expansive) + expandingCount--; n--; } } @@ -300,6 +305,8 @@ void qGeomCalc(QVector<QLayoutStruct> &chain, int start, int count, data->done = true; space_left -= data->maximumSize; sumStretch -= data->stretch; + if (data->expansive) + expandingCount--; n--; } } diff --git a/tests/auto/qboxlayout/tst_qboxlayout.cpp b/tests/auto/qboxlayout/tst_qboxlayout.cpp index a47dafe..d3965e8 100644 --- a/tests/auto/qboxlayout/tst_qboxlayout.cpp +++ b/tests/auto/qboxlayout/tst_qboxlayout.cpp @@ -446,6 +446,33 @@ void tst_QBoxLayout::testLayoutEngine_data() << (PosList() << 100 << 300 << 300) << (SizeList() << 100 << 0 << 100); + QTest::newRow("QTBUG-33104") + << (DescrList() << Descr(11, 75, 75, true) << Descr(75, 75)) + << 200 + << 0 + << (PosList() << 0 << 75) + << (SizeList() << 75 << 125); + + QTest::newRow("Expanding with maximumSize") + << (DescrList() << Descr(11, 75, 100, true) << Descr(75, 75)) + << 200 + << 0 + << (PosList() << 0 << 100) + << (SizeList() << 100 << 100); + + QTest::newRow("Stretch with maximumSize") + << (DescrList() << Descr(11, 75, 100, false, 1) << Descr(75, 75)) + << 200 + << 0 + << (PosList() << 0 << 100) + << (SizeList() << 100 << 100); + + QTest::newRow("Stretch with maximumSize last") + << (DescrList() << Descr(75, 75) << Descr(11, 75, 100, false, 1)) + << 200 + << 0 + << (PosList() << 0 << 100) + << (SizeList() << 100 << 100); } void tst_QBoxLayout::testLayoutEngine() |