diff options
author | Martin Jones <martin.jones@nokia.com> | 2009-12-18 07:31:52 (GMT) |
---|---|---|
committer | Martin Jones <martin.jones@nokia.com> | 2009-12-18 07:31:52 (GMT) |
commit | d216acf40978fb4ad161bd25a4f4f1a0ceb7d0f3 (patch) | |
tree | 8b1226e7a989dbd49ce0b79663665254aefc5273 /src/declarative | |
parent | 6a7272687080abcc4d79ba3c1a8fd44ad23a1206 (diff) | |
download | Qt-d216acf40978fb4ad161bd25a4f4f1a0ceb7d0f3.zip Qt-d216acf40978fb4ad161bd25a4f4f1a0ceb7d0f3.tar.gz Qt-d216acf40978fb4ad161bd25a4f4f1a0ceb7d0f3.tar.bz2 |
ListView housekeeping optimizations.
Diffstat (limited to 'src/declarative')
-rw-r--r-- | src/declarative/graphicsitems/qmlgraphicslistview.cpp | 132 |
1 files changed, 80 insertions, 52 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicslistview.cpp b/src/declarative/graphicsitems/qmlgraphicslistview.cpp index cddf33c..e2eff2b 100644 --- a/src/declarative/graphicsitems/qmlgraphicslistview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicslistview.cpp @@ -223,6 +223,7 @@ public: , bufferMode(NoBuffer) , ownModel(false), wrap(false), autoHighlight(true), haveHighlightRange(false) , correctFlick(true), inFlickCorrection(false), lazyRelease(false) + , minExtentDirty(true), maxExtentDirty(true) {} void init(); @@ -285,7 +286,7 @@ public: qreal startPosition() const { qreal pos = 0; if (!visibleItems.isEmpty()) { - pos = visibleItems.first()->position(); + pos = (*visibleItems.constBegin())->position(); if (visibleIndex > 0) pos -= visibleIndex * (averageSize + spacing) - spacing; } @@ -302,7 +303,7 @@ public: break; } } - pos = visibleItems.last()->endPosition() + invisibleCount * (averageSize + spacing); + pos = (*(--visibleItems.constEnd()))->endPosition() + invisibleCount * (averageSize + spacing); } return pos; } @@ -313,7 +314,7 @@ public: if (!visibleItems.isEmpty()) { if (modelIndex < visibleIndex) { int count = visibleIndex - modelIndex; - return visibleItems.first()->position() - count * (averageSize + spacing); + return (*visibleItems.constBegin())->position() - count * (averageSize + spacing); } else { int idx = visibleItems.count() - 1; while (idx >= 0 && visibleItems.at(idx)->index == -1) @@ -323,7 +324,7 @@ public: else idx = visibleItems.at(idx)->index; int count = modelIndex - idx - 1; - return visibleItems.last()->endPosition() + spacing + count * (averageSize + spacing) + 1; + return (*(--visibleItems.constEnd()))->endPosition() + spacing + count * (averageSize + spacing) + 1; } } return 0; @@ -446,10 +447,13 @@ public: void updateViewport() { Q_Q(QmlGraphicsListView); - if (orient == QmlGraphicsListView::Vertical) + minExtentDirty = true; + maxExtentDirty = true; + if (orient == QmlGraphicsListView::Vertical) { q->setViewportHeight(q->minYExtent() - q->maxYExtent()); - else + } else { q->setViewportWidth(q->minXExtent() - q->maxXExtent()); + } } void itemGeometryChanged(QmlGraphicsItem *, const QRectF &newGeometry, const QRectF &oldGeometry) { @@ -530,6 +534,8 @@ public: FxListItem *header; enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 }; BufferMode bufferMode; + mutable qreal minExtent; + mutable qreal maxExtent; bool ownModel : 1; bool wrap : 1; @@ -538,6 +544,8 @@ public: bool correctFlick : 1; bool inFlickCorrection : 1; bool lazyRelease : 1; + mutable bool minExtentDirty : 1; + mutable bool maxExtentDirty : 1; }; void QmlGraphicsListViewPrivate::init() @@ -566,6 +574,8 @@ void QmlGraphicsListViewPrivate::clear() currentItem = 0; createHighlight(); trackedItem = 0; + minExtentDirty = true; + maxExtentDirty = true; } FxListItem *QmlGraphicsListViewPrivate::createItem(int modelIndex) @@ -655,8 +665,8 @@ void QmlGraphicsListViewPrivate::refill(qreal from, qreal to, bool doBuffer) int modelIndex = visibleIndex; qreal itemEnd = visiblePos-1; if (!visibleItems.isEmpty()) { - visiblePos = visibleItems.first()->position(); - itemEnd = visibleItems.last()->endPosition() + spacing; + visiblePos = (*visibleItems.constBegin())->position(); + itemEnd = (*(--visibleItems.constEnd()))->endPosition() + spacing; int i = visibleItems.count() - 1; while (i > 0 && visibleItems.at(i)->index == -1) --i; @@ -713,7 +723,7 @@ void QmlGraphicsListViewPrivate::refill(qreal from, qreal to, bool doBuffer) } if (changed) { if (visibleItems.count()) - visiblePos = visibleItems.first()->position(); + visiblePos = (*visibleItems.constBegin())->position(); updateAverage(); if (sectionCriteria) updateCurrentSection(); @@ -895,7 +905,7 @@ void QmlGraphicsListViewPrivate::createSection(FxListItem *listItem) listItem->section = sectionCache[i]; sectionCache[i] = 0; listItem->section->setVisible(true); - QmlContext *context = QmlEngine::contextForObject(listItem->section); + QmlContext *context = QmlEngine::contextForObject(listItem->section)->parentContext(); context->setContextProperty(QLatin1String("section"), listItem->attached->m_section); } else { QmlContext *context = new QmlContext(qmlContext(q)); @@ -1038,10 +1048,14 @@ void QmlGraphicsListViewPrivate::updateFooter() } } if (footer) { - if (visibleItems.count()) - footer->setPosition(endPosition()); - else + if (visibleItems.count()) { + qreal endPos = endPosition(); + qreal visiblePos = position() + q->height(); + if (endPos <= visiblePos || footer->position() < endPos) + footer->setPosition(endPos); + } else { footer->setPosition(visiblePos); + } } } @@ -1069,10 +1083,13 @@ void QmlGraphicsListViewPrivate::updateHeader() } } if (header) { - if (visibleItems.count()) - header->setPosition(startPosition() - header->size()); - else + if (visibleItems.count()) { + qreal startPos = startPosition(); + if (position() <= startPos || header->position() > startPos - header->size()) + header->setPosition(startPos - header->size()); + } else { header->setPosition(0); + } } } @@ -2088,31 +2105,36 @@ qreal QmlGraphicsListView::minYExtent() const Q_D(const QmlGraphicsListView); if (d->orient == QmlGraphicsListView::Horizontal) return QmlGraphicsFlickable::minYExtent(); - qreal extent = -d->startPosition(); - if (d->header && d->visibleItems.count()) - extent += d->header->size(); - if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) - extent += d->highlightRangeStart; + if (d->minExtentDirty) { + d->minExtent = -d->startPosition(); + if (d->header && d->visibleItems.count()) + d->minExtent += d->header->size(); + if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) + d->minExtent += d->highlightRangeStart; + d->minExtentDirty = false; + } - return extent; + return d->minExtent; } qreal QmlGraphicsListView::maxYExtent() const { Q_D(const QmlGraphicsListView); if (d->orient == QmlGraphicsListView::Horizontal) - return QmlGraphicsFlickable::maxYExtent(); - qreal extent; - if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) - extent = -(d->positionAt(count()-1) - d->highlightRangeEnd); - else - extent = -(d->endPosition() - height() + 1); - if (d->footer) - extent -= d->footer->size(); - qreal minY = minYExtent(); - if (extent > minY) - extent = minY; - return extent; + return height(); + if (d->maxExtentDirty) { + if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) + d->maxExtent = -(d->positionAt(count()-1) - d->highlightRangeEnd); + else + d->maxExtent = -(d->endPosition() - height() + 1); + if (d->footer) + d->maxExtent -= d->footer->size(); + qreal minY = minYExtent(); + if (d->maxExtent > minY) + d->maxExtent = minY; + d->maxExtentDirty = false; + } + return d->maxExtent; } qreal QmlGraphicsListView::minXExtent() const @@ -2120,31 +2142,37 @@ qreal QmlGraphicsListView::minXExtent() const Q_D(const QmlGraphicsListView); if (d->orient == QmlGraphicsListView::Vertical) return QmlGraphicsFlickable::minXExtent(); - qreal extent = -d->startPosition(); - if (d->header) - extent += d->header->size(); - if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) - extent += d->highlightRangeStart; + if (d->minExtentDirty) { + d->minExtent = -d->startPosition(); + if (d->header) + d->minExtent += d->header->size(); + if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) + d->minExtent += d->highlightRangeStart; + d->minExtentDirty = false; + } - return extent; + return d->minExtent; } qreal QmlGraphicsListView::maxXExtent() const { Q_D(const QmlGraphicsListView); if (d->orient == QmlGraphicsListView::Vertical) - return QmlGraphicsFlickable::maxXExtent(); - qreal extent; - if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) - extent = -(d->positionAt(count()-1) - d->highlightRangeEnd); - else - extent = -(d->endPosition() - width() + 1); - if (d->footer) - extent -= d->footer->size(); - qreal minX = minXExtent(); - if (extent > minX) - extent = minX; - return extent; + return width(); + if (d->maxExtentDirty) { + if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) + d->maxExtent = -(d->positionAt(count()-1) - d->highlightRangeEnd); + else + d->maxExtent = -(d->endPosition() - width() + 1); + if (d->footer) + d->maxExtent -= d->footer->size(); + qreal minX = minXExtent(); + if (d->maxExtent > minX) + d->maxExtent = minX; + d->maxExtentDirty = false; + } + + return d->maxExtent; } void QmlGraphicsListView::keyPressEvent(QKeyEvent *event) |