diff options
Diffstat (limited to 'src/quick/items/qquickgridview.cpp')
-rw-r--r-- | src/quick/items/qquickgridview.cpp | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index ef79a4de42..8cc9b4248d 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -59,6 +59,8 @@ QT_BEGIN_NAMESPACE #define QML_FLICK_SNAPONETHRESHOLD 30 #endif +//#define DEBUG_DELEGATE_LIFECYCLE + //---------------------------------------------------------------------------- class FxGridItemSG : public FxViewItem @@ -172,7 +174,7 @@ public: virtual FxViewItem *newViewItem(int index, QQuickItem *item); virtual void repositionPackageItemAt(QQuickItem *item, int index); virtual void resetFirstItemPosition(qreal pos = 0.0); - virtual void adjustFirstItem(qreal forwards, qreal backwards); + virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible); virtual void createHighlight(); virtual void updateHighlight(); @@ -442,7 +444,9 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d bool changed = false; while (modelIndex < model->count() && rowPos <= fillTo + rowSize()*(columns - colNum)/(columns+1)) { -// qDebug() << "refill: append item" << modelIndex << colPos << rowPos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: append item" << modelIndex << colPos << rowPos; +#endif if (!(item = static_cast<FxGridItemSG*>(createItem(modelIndex, doBuffer)))) break; item->setPosition(colPos, rowPos); @@ -457,6 +461,9 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d changed = true; } + if (doBuffer && requestedIndex != -1) // already waiting for an item + return changed; + // Find first column if (visibleItems.count()) { FxGridItemSG *firstItem = static_cast<FxGridItemSG*>(visibleItems.first()); @@ -473,7 +480,9 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d // Prepend colPos = colNum * colSize(); while (visibleIndex > 0 && rowPos + rowSize() - 1 >= fillFrom - rowSize()*(colNum+1)/(columns+1)){ -// qDebug() << "refill: prepend item" << visibleIndex-1 << "top pos" << rowPos << colPos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: prepend item" << visibleIndex-1 << "top pos" << rowPos << colPos; +#endif if (!(item = static_cast<FxGridItemSG*>(createItem(visibleIndex-1, doBuffer)))) break; --visibleIndex; @@ -501,7 +510,9 @@ bool QQuickGridViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer && item->rowPos()+rowSize()-1 < bufferFrom - rowSize()*(item->colPos()/colSize()+1)/(columns+1)) { if (item->attached->delayRemove()) break; -// qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endRowPos(); +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endRowPos(); +#endif if (item->index != -1) visibleIndex++; visibleItems.removeFirst(); @@ -513,7 +524,9 @@ bool QQuickGridViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer && item->rowPos() > bufferTo + rowSize()*(columns - item->colPos()/colSize())/(columns+1)) { if (item->attached->delayRemove()) break; -// qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1; +#endif visibleItems.removeLast(); releaseItem(item); changed = true; @@ -590,12 +603,15 @@ void QQuickGridViewPrivate::resetFirstItemPosition(qreal pos) item->setPosition(0, pos); } -void QQuickGridViewPrivate::adjustFirstItem(qreal forwards, qreal backwards) +void QQuickGridViewPrivate::adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible) { if (!visibleItems.count()) return; - int moveCount = (forwards / rowSize()) - (backwards / rowSize()); + int moveCount = (forwards - backwards) / rowSize(); + + if (changeBeforeVisible) + moveCount += (changeBeforeVisible%columns) - (columns - 1); FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(visibleItems.first()); gridItem->setPosition(gridItem->colPos(), gridItem->rowPos() + ((moveCount / columns) * rowSize())); @@ -1419,7 +1435,7 @@ void QQuickGridView::setCellWidth(qreal cellWidth) d->updateViewport(); emit cellWidthChanged(); d->forceLayout = true; - d->layout(); + polish(); } } @@ -1437,7 +1453,7 @@ void QQuickGridView::setCellHeight(qreal cellHeight) d->updateViewport(); emit cellHeightChanged(); d->forceLayout = true; - d->layout(); + polish(); } } /*! @@ -1521,14 +1537,6 @@ void QQuickGridView::viewportMoved() return; d->inViewportMoved = true; - // Set visibility of items to eliminate cost of items outside the visible area. - qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); - qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); - for (int i = 0; i < d->visibleItems.count(); ++i) { - FxGridItemSG *item = static_cast<FxGridItemSG*>(d->visibleItems.at(i)); - item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to); - } - if (yflick()) d->bufferMode = d->vData.smoothVelocity < 0 ? QQuickItemViewPrivate::BufferBefore : QQuickItemViewPrivate::BufferAfter; else if (d->isRightToLeftTopToBottom()) @@ -1537,6 +1545,15 @@ void QQuickGridView::viewportMoved() d->bufferMode = d->hData.smoothVelocity < 0 ? QQuickItemViewPrivate::BufferBefore : QQuickItemViewPrivate::BufferAfter; d->refill(); + + // Set visibility of items to eliminate cost of items outside the visible area. + qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); + qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); + for (int i = 0; i < d->visibleItems.count(); ++i) { + FxGridItemSG *item = static_cast<FxGridItemSG*>(d->visibleItems.at(i)); + item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to); + } + if (d->hData.flicking || d->vData.flicking || d->hData.moving || d->vData.moving) d->moveReason = QQuickGridViewPrivate::Mouse; if (d->moveReason != QQuickGridViewPrivate::SetIndex) { @@ -1817,7 +1834,7 @@ 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->sizeChangesBeforeVisiblePos += rowSize(); + insertResult->changeBeforeVisible++; } else { // item is before first visible e.g. in cache buffer FxViewItem *item = 0; |