Item views: avoid fixing up the position while moving/flicking
authorJ-P Nurmi <jpnurmi@digia.com>
Thu, 2 Jan 2014 20:35:50 +0000 (21:35 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 13 Mar 2014 07:49:24 +0000 (08:49 +0100)
Task-number: QTBUG-35920
Change-Id: Id6a68400eed69d880dd1c218ec4a1beda8a8fbb9
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
src/quick/items/qquickitemview.cpp
tests/auto/quick/qquicklistview/data/qtbug35920.qml [new file with mode: 0644]
tests/auto/quick/qquicklistview/tst_qquicklistview.cpp

index 020d486..e51a562 100644 (file)
@@ -686,7 +686,8 @@ void QQuickItemView::setPreferredHighlightBegin(qreal start)
     d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
     if (isComponentComplete()) {
         d->updateViewport();
-        d->fixupPosition();
+        if (!isMoving() && !isFlicking())
+            d->fixupPosition();
     }
     emit preferredHighlightBeginChanged();
 }
@@ -700,7 +701,8 @@ void QQuickItemView::resetPreferredHighlightBegin()
     d->highlightRangeStart = 0;
     if (isComponentComplete()) {
         d->updateViewport();
-        d->fixupPosition();
+        if (!isMoving() && !isFlicking())
+            d->fixupPosition();
     }
     emit preferredHighlightBeginChanged();
 }
@@ -721,7 +723,8 @@ void QQuickItemView::setPreferredHighlightEnd(qreal end)
     d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
     if (isComponentComplete()) {
         d->updateViewport();
-        d->fixupPosition();
+        if (!isMoving() && !isFlicking())
+            d->fixupPosition();
     }
     emit preferredHighlightEndChanged();
 }
@@ -735,7 +738,8 @@ void QQuickItemView::resetPreferredHighlightEnd()
     d->highlightRangeEnd = 0;
     if (isComponentComplete()) {
         d->updateViewport();
-        d->fixupPosition();
+        if (!isMoving() && !isFlicking())
+            d->fixupPosition();
     }
     emit preferredHighlightEndChanged();
 }
diff --git a/tests/auto/quick/qquicklistview/data/qtbug35920.qml b/tests/auto/quick/qquicklistview/data/qtbug35920.qml
new file mode 100644 (file)
index 0000000..14853e3
--- /dev/null
@@ -0,0 +1,12 @@
+import QtQuick 2.1
+
+ListView {
+    width: 200
+    height: 200
+
+    snapMode: ListView.SnapOneItem
+    highlightRangeMode: ListView.StrictlyEnforceRange
+
+    model: 100
+    delegate: Text { text: modelData }
+}
index 5651806..efd0fa8 100644 (file)
@@ -221,6 +221,7 @@ private slots:
     void highlightItemGeometryChanges();
 
     void QTBUG_36481();
+    void QTBUG_35920();
 
 private:
     template <class T> void items(const QUrl &source);
@@ -7152,6 +7153,36 @@ void tst_QQuickListView::QTBUG_36481()
     QScopedPointer<QObject> object(component.create());
 }
 
+void tst_QQuickListView::QTBUG_35920()
+{
+    QScopedPointer<QQuickView> window(createView());
+    window->setSource(testFileUrl("qtbug35920.qml"));
+    window->show();
+    QVERIFY(QTest::qWaitForWindowExposed(window.data()));
+
+    QQuickListView *listview = qobject_cast<QQuickListView *>(window->rootObject());
+    QVERIFY(listview);
+
+    QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(10,0));
+    for (int i = 0; i < 100; ++i) {
+        QTest::mouseMove(window.data(), QPoint(10,i));
+        if (listview->isMoving()) {
+            // do not fixup() the position while in movement to avoid flicker
+            const qreal contentY = listview->contentY();
+            listview->setPreferredHighlightBegin(i);
+            QCOMPARE(listview->contentY(), contentY);
+            listview->resetPreferredHighlightBegin();
+            QCOMPARE(listview->contentY(), contentY);
+
+            listview->setPreferredHighlightEnd(i+10);
+            QCOMPARE(listview->contentY(), contentY);
+            listview->resetPreferredHighlightEnd();
+            QCOMPARE(listview->contentY(), contentY);
+        }
+    }
+    QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(10,100));
+}
+
 QTEST_MAIN(tst_QQuickListView)
 
 #include "tst_qquicklistview.moc"