aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickgridview.cpp5
-rw-r--r--src/quick/items/qquickitemview.cpp14
-rw-r--r--tests/auto/qtquick2/qquickgridview/data/unrequestedItems.qml12
-rw-r--r--tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp50
4 files changed, 55 insertions, 26 deletions
diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp
index 60514b27f8..8f8fac7cc8 100644
--- a/src/quick/items/qquickgridview.cpp
+++ b/src/quick/items/qquickgridview.cpp
@@ -609,9 +609,8 @@ void QQuickGridViewPrivate::adjustFirstItem(qreal forwards, qreal backwards, int
return;
int moveCount = (forwards - backwards) / rowSize();
-
- if (changeBeforeVisible)
- moveCount += (changeBeforeVisible%columns) - (columns - 1);
+ if (moveCount == 0 && changeBeforeVisible != 0)
+ moveCount += (changeBeforeVisible % columns) - (columns - 1);
FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(visibleItems.first());
gridItem->setPosition(gridItem->colPos(), gridItem->rowPos() + ((moveCount / columns) * rowSize()));
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp
index 6577617091..3b264ab96b 100644
--- a/src/quick/items/qquickitemview.cpp
+++ b/src/quick/items/qquickitemview.cpp
@@ -1426,8 +1426,11 @@ bool QQuickItemViewPrivate::applyModelChanges()
FxViewItem *prevFirstVisible = firstVisibleItem();
QDeclarativeNullableValue<qreal> prevViewPos;
- if (prevFirstVisible)
+ int prevFirstVisibleIndex = -1;
+ if (prevFirstVisible) {
prevViewPos = prevFirstVisible->position();
+ prevFirstVisibleIndex = prevFirstVisible->index;
+ }
qreal prevVisibleItemsFirstPos = visibleItems.count() ? visibleItems.first()->position() : 0.0;
const QVector<QDeclarativeChangeSet::Remove> &removals = currentChanges.pendingChanges.removes();
@@ -1442,6 +1445,12 @@ bool QQuickItemViewPrivate::applyModelChanges()
visibleAffected = true;
if (!visibleAffected && needsRefillForAddedOrRemovedIndex(removals[i].index))
visibleAffected = true;
+ if (prevFirstVisibleIndex >= 0 && removals[i].index < prevFirstVisibleIndex) {
+ if (removals[i].index + removals[i].count < prevFirstVisibleIndex)
+ removalResult.changeBeforeVisible -= removals[i].count;
+ else
+ removalResult.changeBeforeVisible -= (prevFirstVisibleIndex - removals[i].index);
+ }
}
if (!removals.isEmpty()) {
updateVisibleIndex();
@@ -1557,9 +1566,6 @@ bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remo
}
}
- if (removal.index + removal.count < visibleIndex)
- removeResult->changeBeforeVisible -= removal.count;
-
return visibleAffected;
}
diff --git a/tests/auto/qtquick2/qquickgridview/data/unrequestedItems.qml b/tests/auto/qtquick2/qquickgridview/data/unrequestedItems.qml
index ffd52d283e..79f845fd25 100644
--- a/tests/auto/qtquick2/qquickgridview/data/unrequestedItems.qml
+++ b/tests/auto/qtquick2/qquickgridview/data/unrequestedItems.qml
@@ -14,8 +14,10 @@ Item {
Package.name: "left"
height: 80
width: 60
- Text {
- text: index
+ Column {
+ Text { text: index }
+ Text { text: name }
+ Text { text: leftWrapper.x + ", " + leftWrapper.y }
}
color: ListView.isCurrentItem ? "lightsteelblue" : "white"
}
@@ -25,8 +27,10 @@ Item {
Package.name: "right"
height: 80
width: 60
- Text {
- text: index
+ Column {
+ Text { text: index }
+ Text { text: name }
+ Text { text: rightWrapper.x + ", " + rightWrapper.y }
}
color: ListView.isCurrentItem ? "lightsteelblue" : "white"
}
diff --git a/tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp b/tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp
index 32934b5eb3..303f4bd7b7 100644
--- a/tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp
+++ b/tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp
@@ -628,8 +628,8 @@ void tst_QQuickGridView::insertBeforeVisible()
gridview->setCacheBuffer(cacheBuffer);
// trigger a refill (not just setting contentY) so that the visibleItems grid is updated
- int firstVisibleIndex = 20; // move to an index where the top item is not visible
- gridview->setContentY(firstVisibleIndex * 20.0);
+ int firstVisibleIndex = 12; // move to an index where the top item is not visible
+ gridview->setContentY(firstVisibleIndex/3 * 60.0);
gridview->setCurrentIndex(firstVisibleIndex);
qApp->processEvents();
@@ -914,6 +914,11 @@ void tst_QQuickGridView::removed_more_data()
QTest::newRow("remove 1, before visible items")
<< 120.0 // show 6-23
+ << 2 << 1
+ << 0.0 << "Item7";
+
+ QTest::newRow("remove 1, before visible position")
+ << 120.0 // show 6-23
<< 3 << 1
<< 0.0 << "Item7";
@@ -932,6 +937,16 @@ void tst_QQuickGridView::removed_more_data()
<< 1 << 7
<< 120.0 << "Item13";
+ QTest::newRow("remove one row before visible, content y not on item border")
+ << 100.0
+ << 0 << 3
+ << 60.0 << "Item6"; // 1 row removed
+
+ QTest::newRow("remove mix of visible/non-visible")
+ << 120.0 // show 6-23
+ << 2 << 3
+ << 60.0 << "Item6"; // 1 row removed
+
// remove 3,4,5 before the visible pos, first row moves down to just before the visible pos,
// items 6,7 are removed from view, item 8 slides up to original pos of item 6 (120px)
@@ -4091,14 +4106,15 @@ void tst_QQuickGridView::unrequestedVisibility()
QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3));
QCOMPARE(item->isVisible(), false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 4));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 10));
QCOMPARE(item->isVisible(), false);
- model.moveItems(19, 1, 1);
+ // move a non-visible item into view
+ model.moveItems(10, 9, 1);
QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false);
QTRY_VERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 1));
@@ -4113,55 +4129,59 @@ void tst_QQuickGridView::unrequestedVisibility()
QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3));
QCOMPARE(item->isVisible(), false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 4));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 10));
QCOMPARE(item->isVisible(), false);
- model.moveItems(3, 4, 1);
+ // move a visible item out of view
+ model.moveItems(5, 3, 1);
QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 1));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3));
QCOMPARE(item->isVisible(), false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 2));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 10));
QCOMPARE(item->isVisible(), false);
- model.moveItems(4, 5, 1);
+ // move a non-visible item into view
+ model.moveItems(3, 5, 1);
QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 1));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3));
QCOMPARE(item->isVisible(), false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 2));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 10));
QCOMPARE(item->isVisible(), false);
+ // move a visible item out of view
model.moveItems(9, 10, 1);
QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 1));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3));
QCOMPARE(item->isVisible(), false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 2));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 10));
QCOMPARE(item->isVisible(), false);
+ // move a non-visible item into view
model.moveItems(10, 9, 1);
QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 1));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3));
QCOMPARE(item->isVisible(), false);
- QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 2));
+ QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
QCOMPARE(item->isVisible(), true);
QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
QCOMPARE(item->isVisible(), true);