From abf030cead015752b22774b46e290e3a5e4ef4e4 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 22 Dec 2015 13:13:50 +0100 Subject: Fix ListView.OverlayHeader Infinite loop because of rounding in QQuickFlickablePrivate::fixup(). Change-Id: Icffe216587d90660ac3cb8090a676868416566c8 Task-number: QTBUG-50105 Reviewed-by: Robin Burchell --- src/quick/items/qquickflickable.cpp | 4 +- .../auto/quick/qquicklistview/data/qtbug50105.qml | 130 +++++++++++++++++++++ .../quick/qquicklistview/tst_qquicklistview.cpp | 14 +++ 3 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 tests/auto/quick/qquicklistview/data/qtbug50105.qml diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 092d4afdd9..43405db40d 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -435,12 +435,12 @@ void QQuickFlickablePrivate::clearTimeline() void QQuickFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent) { - if (data.move.value() > minExtent || maxExtent > minExtent) { + if (data.move.value() >= minExtent || maxExtent > minExtent) { resetTimeline(data); if (data.move.value() != minExtent) { adjustContentPos(data, minExtent); } - } else if (data.move.value() < maxExtent) { + } else if (data.move.value() <= maxExtent) { resetTimeline(data); adjustContentPos(data, maxExtent); } else if (-qRound(-data.move.value()) != data.move.value()) { diff --git a/tests/auto/quick/qquicklistview/data/qtbug50105.qml b/tests/auto/quick/qquicklistview/data/qtbug50105.qml new file mode 100644 index 0000000000..a48a881a21 --- /dev/null +++ b/tests/auto/quick/qquicklistview/data/qtbug50105.qml @@ -0,0 +1,130 @@ +import QtQuick 2.4 +import QtQuick.Window 2.2 + +Window { + id : mainWindow + visible: true + width: 800 + height: 480 + + property real gridListWidth : (width * 0.60) + property real gridListHeight : (height * 0.50) + + property real gridCellSpacing : (height * 0.004) + property real gridCellHeight : (height * 0.039) + property real gridCellWidth : (width * 0.20) + + Rectangle { + id : rectBackground + anchors.fill: parent + color : "white" + + ListView { + id : ls + width: mainWindow.gridListWidth + height: mainWindow.gridListHeight + clip : true + headerPositioning: ListView.OverlayHeader + spacing : mainWindow.gridCellSpacing + + model: ListModel { + ListElement { + name: "Bill Smith" + number: "555 3264" + hairColor: "red" + } + ListElement { + name: "John Brown" + number: "484 7789" + hairColor: "blue" + } + ListElement { + name: "Sam Wise" + number: "284 1547" + hairColor: "yellow" + } + } + + header : Row { + spacing : mainWindow.gridCellSpacing + + Rectangle { + width : mainWindow.gridCellWidth + height : mainWindow.gridCellHeight + color : "blue" + + Text { + anchors.centerIn: parent + color : "white" + text: "Name" + } + } + + Rectangle { + width : mainWindow.gridCellWidth + height : mainWindow.gridCellHeight + color : "blue" + + Text { + anchors.centerIn: parent + color : "white" + text: "Number" + } + + } + + Rectangle { + width : mainWindow.gridCellWidth + height : mainWindow.gridCellHeight + color : "blue" + + Text { + anchors.centerIn: parent + color : "white" + text: "Hair Color" + } + } + } + + delegate: Row { + spacing : mainWindow.gridCellSpacing + + Rectangle { + width : mainWindow.gridCellWidth + height : mainWindow.gridCellHeight + color : "red" + + Text { + anchors.centerIn: parent + color : "white" + text: name + } + } + + Rectangle { + width : mainWindow.gridCellWidth + height : mainWindow.gridCellHeight + color : "red" + + Text { + anchors.centerIn: parent + color : "white" + text: number + } + } + + Rectangle { + width : mainWindow.gridCellWidth + height : mainWindow.gridCellHeight + color : "red" + + Text { + anchors.centerIn: parent + color : "white" + text: hairColor + } + } + } + } + } +} diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index b3a6edb66a..1fec04d08a 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -252,6 +252,8 @@ private slots: void QTBUG_48044_currentItemNotVisibleAfterTransition(); void QTBUG_48870_fastModelUpdates(); + void QTBUG_50105(); + private: template void items(const QUrl &source); template void changed(const QUrl &source); @@ -8437,6 +8439,18 @@ void tst_QQuickListView::QTBUG_48870_fastModelUpdates() delete window; } +// infinite loop in overlay header positioning due to undesired rounding in QQuickFlickablePrivate::fixup() +void tst_QQuickListView::QTBUG_50105() +{ + QQmlEngine engine; + QQmlComponent component(&engine); + component.loadUrl(testFileUrl("qtbug50105.qml")); + + QScopedPointer window(qobject_cast(component.create())); + QVERIFY(window.data()); + QVERIFY(QTest::qWaitForWindowExposed(window.data())); +} + QTEST_MAIN(tst_QQuickListView) #include "tst_qquicklistview.moc" -- cgit v1.2.3