From a6b01ff80139247ee2c4b41e9ebcf3694d83514b Mon Sep 17 00:00:00 2001
From: Jan Arve Saether <jan-arve.saether@digia.com>
Date: Wed, 22 May 2013 21:32:27 +0200
Subject: [PATCH] Made sure items with preferred width of 0 could also stretch

If no stretch factors were specified, we used the preferred size as a
stretch factor. Obviously, that didn't work if the preferred size was
actually 0.

This patch works around this by actually setting the stretch factor to
1.0 if this is the case.
This should work fine in most cases, except for the case where there
are also other items with a preferred size close to 0.
In this case, the item with preferred size 0 will just grow
faster than an item with e.g. preferred size 0.1.

Task-number: QTBUG-31217

Change-Id: Id5a3e19c9cd756860fc4052daee3eb5582f39d0c
Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
---
 src/layouts/qgridlayoutengine.cpp          |  2 +-
 tests/auto/controls/data/tst_rowlayout.qml | 48 ++++++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/src/layouts/qgridlayoutengine.cpp b/src/layouts/qgridlayoutengine.cpp
index d091d124e..bba1efbd0 100644
--- a/src/layouts/qgridlayoutengine.cpp
+++ b/src/layouts/qgridlayoutengine.cpp
@@ -291,7 +291,7 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
 
                     int stretch = stretches[start + i];
                     if (sumStretches == 0) {
-                        if (hasIgnoreFlag) {
+                        if (hasIgnoreFlag || sizes[i] == 0.0) {
                             factors[i] = (stretch < 0) ? 1.0 : 0.0;
                         } else {
                             factors[i] = (stretch < 0) ? sizes[i] : 0.0;
diff --git a/tests/auto/controls/data/tst_rowlayout.qml b/tests/auto/controls/data/tst_rowlayout.qml
index f462bd78c..fd21f4756 100644
--- a/tests/auto/controls/data/tst_rowlayout.qml
+++ b/tests/auto/controls/data/tst_rowlayout.qml
@@ -556,6 +556,54 @@ Item {
         }
 
 
+        Component {
+            id: layout_rowLayout_Component
+            RowLayout {
+            }
+        }
+
+        function test_stretchItem_data()
+        {
+            return [
+                    { expectedWidth: 0},
+                    { preferredWidth: 20, expectedWidth: 20},
+                    { preferredWidth: 0, expectedWidth: 0},
+                    { preferredWidth: 20, fillWidth: true, expectedWidth: 100},
+                    { width: 20, fillWidth: true, expectedWidth: 100},
+                    { width: 0, fillWidth: true, expectedWidth: 100},
+                    { preferredWidth: 0, fillWidth: true, expectedWidth: 100},
+                    { preferredWidth: 1, maximumWidth: 0, fillWidth: true, expectedWidth: 0},
+                    { preferredWidth: 0, minimumWidth: 1, expectedWidth: 1},
+                    ];
+        }
+
+        function test_stretchItem(data)
+        {
+            var layout = layout_rowLayout_Component.createObject(container)
+            var r = layoutItem_Component.createObject(layout)
+            // Reset previously relevant properties
+            r.width = 0
+            r.implicitWidth = 0
+            compare(layout.implicitWidth, 0)
+
+            if (data.preferredWidth !== undefined)
+                r.Layout.preferredWidth = data.preferredWidth
+            if (data.fillWidth !== undefined)
+                r.Layout.fillWidth = data.fillWidth
+            if (data.width !== undefined)
+                r.width = data.width
+            if (data.minimumWidth !== undefined)
+                r.Layout.minimumWidth = data.minimumWidth
+            if (data.maximumWidth !== undefined)
+                r.Layout.maximumWidth = data.maximumWidth
+
+            layout.width = 100
+
+            compare(r.width, data.expectedWidth)
+
+            layout.destroy();
+        }
+
         Component {
             id: layout_alignToPixelGrid_Component
             RowLayout {
-- 
GitLab