diff options
author | Martin Jones <martin.jones@nokia.com> | 2009-11-19 04:29:54 (GMT) |
---|---|---|
committer | Martin Jones <martin.jones@nokia.com> | 2009-11-19 04:29:54 (GMT) |
commit | b044184888d45dd4f9d94574c4528867e13845ef (patch) | |
tree | 3e202930ea9133eabff81c8c48779e693dbe6495 | |
parent | 08c45e83b05aa22b0d37a16aa01cbf5b3056bd15 (diff) | |
download | Qt-b044184888d45dd4f9d94574c4528867e13845ef.zip Qt-b044184888d45dd4f9d94574c4528867e13845ef.tar.gz Qt-b044184888d45dd4f9d94574c4528867e13845ef.tar.bz2 |
Fix GridView scrolling due to currentIndex changes. Add tests.
-rw-r--r-- | src/declarative/graphicsitems/qmlgraphicsgridview.cpp | 21 | ||||
-rw-r--r-- | tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp | 32 |
2 files changed, 47 insertions, 6 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicsgridview.cpp b/src/declarative/graphicsitems/qmlgraphicsgridview.cpp index 473f9e5..7e2d983 100644 --- a/src/declarative/graphicsitems/qmlgraphicsgridview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsgridview.cpp @@ -1302,12 +1302,21 @@ void QmlGraphicsGridView::trackedPositionChanged() if (!d->trackedItem) return; if (!isFlicking() && !d->moving && d->moveReason != QmlGraphicsGridViewPrivate::Mouse) { - if (d->trackedItem->rowPos() < d->position()) { - d->setPosition(d->trackedItem->rowPos()); - } else if (d->trackedItem->endRowPos() > d->position() + d->size()) { - qreal pos = d->trackedItem->endRowPos() - d->size(); - if (d->rowSize() > d->size()) - pos = d->trackedItem->rowPos(); + const qreal viewPos = d->position(); + if (d->trackedItem->rowPos() < viewPos && d->currentItem->rowPos() < viewPos) { + d->setPosition(d->currentItem->rowPos() < d->trackedItem->rowPos() ? d->trackedItem->rowPos() : d->currentItem->rowPos()); + } else if (d->trackedItem->endRowPos() > viewPos + d->size() + && d->currentItem->endRowPos() > viewPos + d->size()) { + qreal pos; + if (d->trackedItem->endRowPos() < d->currentItem->endRowPos()) { + pos = d->trackedItem->endRowPos() - d->size(); + if (d->rowSize() > d->size()) + pos = d->trackedItem->rowPos(); + } else { + pos = d->currentItem->endRowPos() - d->size(); + if (d->rowSize() > d->size()) + pos = d->currentItem->rowPos(); + } d->setPosition(pos); } } diff --git a/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp b/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp index 197191e..f31ea49 100644 --- a/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp +++ b/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp @@ -394,6 +394,9 @@ void tst_QmlGraphicsGridView::removed() // let transitions settle. QTest::qWait(300); + // Setting currentIndex above shouldn't cause view to scroll + QCOMPARE(gridview->viewportY(), 120.0); + model.removeItem(1); // let transitions settle. @@ -408,6 +411,14 @@ void tst_QmlGraphicsGridView::removed() QVERIFY(item->y() == (i/3)*60); } + // Remove currentIndex + QmlGraphicsItem *oldCurrent = gridview->currentItem(); + model.removeItem(9); + QTest::qWait(500); + + QCOMPARE(gridview->currentIndex(), 9); + QVERIFY(gridview->currentItem() != oldCurrent); + gridview->setViewportY(0); // let transitions settle. QTest::qWait(300); @@ -430,6 +441,27 @@ void tst_QmlGraphicsGridView::removed() model.removeItem(30); QVERIFY(gridview->currentIndex() == 31); + // remove current item beyond visible items. + gridview->setCurrentIndex(20); + QTest::qWait(500); + gridview->setViewportY(0); + model.removeItem(20); + QTest::qWait(500); + + QCOMPARE(gridview->currentIndex(), 20); + QVERIFY(gridview->currentItem() != 0); + + // remove item before current, but visible + gridview->setCurrentIndex(8); + QTest::qWait(500); + gridview->setViewportY(240); + oldCurrent = gridview->currentItem(); + model.removeItem(6); + QTest::qWait(500); + + QCOMPARE(gridview->currentIndex(), 7); + QVERIFY(gridview->currentItem() == oldCurrent); + delete canvas; } |