aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickgridview.cpp
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2012-01-05 09:59:30 +1000
committerQt by Nokia <qt-info@nokia.com>2012-01-09 07:14:31 +0100
commit6b6d99c1a218f1c46ae0151a01575de6092ba9a7 (patch)
treed68e19b73691d4119f13358b29ca17cbd084c80b /src/quick/items/qquickgridview.cpp
parent95e720d1b63312e50be3df467973d098c4527b7d (diff)
Fix positioning issues and change content y repositioning behaviour
Refactor the code for re-positioning the visibleItems.first() in QSGItemView::applyModelChanges() and fix various positioning issues. The positioning behaviour for removing items at the start of the view has changed. This action will no longer cause the content y to move down; previously the content y would always move down unless another item was moving backwards to the first visible position. This will make it easier to implement built-in removal transitions for the views, since removed items cannot be animated if the content y jumps down past them. Additionally, moving items from before a GridView should not cause the top item in the view to move upwards and out of the view. This also adds additional remove tests and fixes the tst_QQuickGridView::moved() test which wasn't waiting for the polish event after setting the content y, which caused some of the tests to pass even though their test data was wrong. Change-Id: Idad11a73a18f88208e73a52111ed839458e05f2d Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick/items/qquickgridview.cpp')
-rw-r--r--src/quick/items/qquickgridview.cpp47
1 files changed, 23 insertions, 24 deletions
diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp
index 582f46251d..b29c61fdd7 100644
--- a/src/quick/items/qquickgridview.cpp
+++ b/src/quick/items/qquickgridview.cpp
@@ -173,7 +173,7 @@ public:
virtual void repositionPackageItemAt(QQuickItem *item, int index);
virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem);
virtual void resetFirstItemPosition();
- virtual void moveItemBy(FxViewItem *item, qreal forwards, qreal backwards);
+ virtual void adjustFirstItem(qreal forwards, qreal backwards);
virtual void createHighlight();
virtual void updateHighlight();
@@ -181,7 +181,7 @@ public:
virtual void setPosition(qreal pos);
virtual void layoutVisibleItems();
- bool applyInsertionChange(const QDeclarativeChangeSet::Insert &, FxViewItem *, InsertionsResult *);
+ virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems);
virtual bool needsRefillForAddedOrRemovedIndex(int index) const;
virtual qreal headerSize() const;
@@ -598,11 +598,14 @@ void QQuickGridViewPrivate::resetFirstItemPosition()
item->setPosition(0, 0);
}
-void QQuickGridViewPrivate::moveItemBy(FxViewItem *item, qreal forwards, qreal backwards)
+void QQuickGridViewPrivate::adjustFirstItem(qreal forwards, qreal backwards)
{
+ if (!visibleItems.count())
+ return;
+
int moveCount = (forwards / rowSize()) - (backwards / rowSize());
- FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(item);
+ FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(visibleItems.first());
gridItem->setPosition(gridItem->colPos(), gridItem->rowPos() + ((moveCount / columns) * rowSize()));
}
@@ -783,8 +786,7 @@ void QQuickGridViewPrivate::initializeCurrentItem()
{
if (currentItem && currentIndex >= 0) {
FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(currentItem);
- if (gridItem)
- gridItem->setPosition(colPosAt(currentIndex), rowPosAt(currentIndex));
+ gridItem->setPosition(colPosAt(currentIndex), rowPosAt(currentIndex));
}
}
@@ -1768,7 +1770,7 @@ void QQuickGridView::moveCurrentIndexRight()
}
}
-bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, FxViewItem *firstVisible, InsertionsResult *insertResult)
+bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems)
{
Q_Q(QQuickGridView);
@@ -1828,8 +1830,8 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In
item->index += count;
}
- int prevAddedCount = insertResult->addedItems.count();
- if (firstVisible && rowPos < firstVisible->position()) {
+ int prevVisibleCount = visibleItems.count();
+ if (insertResult->visiblePos.isValid() && rowPos < insertResult->visiblePos) {
// Insert items before the visible item.
int insertionIdx = index;
int i = count - 1;
@@ -1838,15 +1840,12 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In
while (i >= 0) {
if (rowPos > from && insertionIdx < visibleIndex) {
// item won't be visible, just note the size for repositioning
- insertResult->sizeAddedBeforeVisible += rowSize();
+ insertResult->sizeChangesBeforeVisiblePos += rowSize();
} else {
// item is before first visible e.g. in cache buffer
FxViewItem *item = 0;
- if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) {
- if (item->index > modelIndex + i)
- insertResult->movedBackwards.append(item);
+ if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i))))
item->index = modelIndex + i;
- }
if (!item)
item = createItem(modelIndex + i);
if (!item)
@@ -1854,10 +1853,9 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In
item->item->setVisible(true);
visibleItems.insert(insertionIdx, item);
- if (!change.isMove()) {
- insertResult->addedItems.append(item);
- insertResult->sizeAddedBeforeVisible += rowSize();
- }
+ if (!change.isMove())
+ addedItems->append(item);
+ insertResult->sizeChangesBeforeVisiblePos += rowSize();
}
if (--colNum < 0 ) {
@@ -1873,11 +1871,8 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In
int to = buffer+tempPos+size()-1;
while (i < count && rowPos <= to + rowSize()*(columns - (colPos/colSize()))/qreal(columns)) {
FxViewItem *item = 0;
- if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) {
- if (item->index > modelIndex + i)
- insertResult->movedBackwards.append(item);
+ if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i))))
item->index = modelIndex + i;
- }
if (!item)
item = createItem(modelIndex + i);
if (!item)
@@ -1885,8 +1880,12 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In
item->item->setVisible(true);
visibleItems.insert(index, item);
+ if (index == 0)
+ *newVisibleItemsFirst = true;
if (!change.isMove())
- insertResult->addedItems.append(item);
+ addedItems->append(item);
+ insertResult->sizeChangesAfterVisiblePos += rowSize();
+
if (++colNum >= columns) {
colNum = 0;
rowPos += rowSize();
@@ -1899,7 +1898,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In
updateVisibleIndex();
- return insertResult->addedItems.count() > prevAddedCount;
+ return visibleItems.count() > prevVisibleCount;
}
bool QQuickGridViewPrivate::needsRefillForAddedOrRemovedIndex(int modelIndex) const