From 762b4d90110465aeceb96f44cd06dcda229dfe89 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 8 Jun 2012 11:19:09 +1000 Subject: [PATCH] Performance should always be better with cacheBuffer Setting a cacheBuffer introduced more work for the scenegraph due to cached delegates' visibility being toggled. Changing visibility is expensive as it is proagated to all children. Introduce a cheap method of hiding a branch instead. Also avoid initiating incubation in the same frame as a completed creation. Change-Id: I573bcf37f441f96a7502d445be50ef4301f217d5 Reviewed-by: Bea Lam --- src/quick/items/qquickgridview.cpp | 12 +-- src/quick/items/qquickitem.cpp | 12 ++- src/quick/items/qquickitem_p.h | 5 +- src/quick/items/qquickitemview.cpp | 23 ++-- src/quick/items/qquickitemview_p_p.h | 4 +- src/quick/items/qquicklistview.cpp | 14 +-- .../quick/qquickgridview/tst_qquickgridview.cpp | 98 ++++++++--------- .../quick/qquicklistview/tst_qquicklistview.cpp | 116 ++++++++++----------- tests/auto/quick/shared/visualtestutil.cpp | 7 +- tests/auto/quick/shared/visualtestutil.h | 3 +- 10 files changed, 162 insertions(+), 132 deletions(-) diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index 235005b..331f23e 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -534,7 +534,7 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d break; if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() item->setPosition(colPos, rowPos, true); - item->item->setVisible(!doBuffer); + QQuickItemPrivate::get(item->item)->setCulled(doBuffer); visibleItems.append(item); if (++colNum >= columns) { colNum = 0; @@ -572,7 +572,7 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d --visibleIndex; if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() item->setPosition(colPos, rowPos, true); - item->item->setVisible(!doBuffer); + QQuickItemPrivate::get(item->item)->setCulled(doBuffer); visibleItems.prepend(item); if (--colNum < 0) { colNum = columns-1; @@ -2013,11 +2013,11 @@ void QQuickGridView::viewportMoved() qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); for (int i = 0; i < d->visibleItems.count(); ++i) { FxGridItemSG *item = static_cast(d->visibleItems.at(i)); - item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to); + QQuickItemPrivate::get(item->item)->setCulled(item->rowPos() + d->rowSize() < from || item->rowPos() > to); } if (d->currentItem) { FxGridItemSG *item = static_cast(d->currentItem); - item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to); + QQuickItemPrivate::get(item->item)->setCulled(item->rowPos() + d->rowSize() < from || item->rowPos() > to); } if (d->hData.flicking || d->vData.flicking || d->hData.moving || d->vData.moving) @@ -2363,7 +2363,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQuickChangeSet::Insert & if (!item) return false; - item->item->setVisible(true); + QQuickItemPrivate::get(item->item)->setCulled(false); visibleItems.insert(insertionIdx, item); if (insertionIdx == 0) insertResult->changedFirstItem = true; @@ -2395,7 +2395,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQuickChangeSet::Insert & if (!item) return false; - item->item->setVisible(true); + QQuickItemPrivate::get(item->item)->setCulled(false); visibleItems.insert(index, item); if (index == 0) insertResult->changedFirstItem = true; diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index f5ab703..ae912a2 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -2435,7 +2435,7 @@ QQuickItemPrivate::QQuickItemPrivate() effectiveVisible(true), explicitEnable(true), effectiveEnable(true), polishScheduled(false), inheritedLayoutMirror(false), effectiveLayoutMirror(false), isMirrorImplicit(true), inheritMirrorFromParent(false), inheritMirrorFromItem(false), - isAccessible(false), + isAccessible(false), culled(false), dirtyAttributes(0), nextDirtyItem(0), prevDirtyItem(0), @@ -4402,6 +4402,16 @@ void QQuickItemPrivate::derefFromEffectItem(bool unhide) } } +void QQuickItemPrivate::setCulled(bool cull) +{ + if (cull == culled) + return; + + culled = cull; + if ((cull && ++extra->hideRefCount == 1) || (!cull && --extra->hideRefCount == 0)) + dirty(HideReference); +} + void QQuickItemPrivate::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data) { Q_Q(QQuickItem); diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index e7c449b..bbff260 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -406,7 +406,8 @@ public: bool inheritMirrorFromParent:1; bool inheritMirrorFromItem:1; bool isAccessible:1; - // bool dummy:3 + bool culled:1; + // bool dummy:2 // Bit 32 enum DirtyType { @@ -448,6 +449,8 @@ public: QQuickItem *nextDirtyItem; QQuickItem**prevDirtyItem; + void setCulled(bool); + QQuickCanvas *canvas; int canvasRefCount; inline QSGContext *sceneGraphContext() const; diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 9ea2aad..e48db3d 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -87,7 +87,7 @@ void FxViewItem::setVisible(bool visible) { if (!visible && transitionableItem && transitionableItem->transitionScheduledOrRunning()) return; - item->setVisible(visible); + QQuickItemPrivate::get(item)->setCulled(!visible); } QQuickItemViewTransitioner::TransitionType FxViewItem::scheduledTransitionType() const @@ -1429,6 +1429,9 @@ QQuickItemViewPrivate::QQuickItemViewPrivate() , fillCacheBuffer(false), inRequest(false), requestedAsync(false) , runDelayedRemoveTransition(false) { + bufferPause.addAnimationChangeListener(this, QAbstractAnimationJob::Completion); + bufferPause.setLoopCount(1); + bufferPause.setDuration(16); } QQuickItemViewPrivate::~QQuickItemViewPrivate() @@ -1636,6 +1639,13 @@ void QQuickItemViewPrivate::mirrorChange() emit q->effectiveLayoutDirectionChanged(); } +void QQuickItemViewPrivate::animationFinished(QAbstractAnimationJob *) +{ + Q_Q(QQuickItemView); + fillCacheBuffer = true; + q->polish(); +} + void QQuickItemViewPrivate::refill() { qreal s = qMax(size(), qreal(0.)); @@ -1651,6 +1661,7 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to) if (!isValid() || !q->isComponentComplete()) return; + bufferPause.stop(); currentChanges.reset(); int prevCount = itemCount; @@ -1667,8 +1678,7 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to) if (added) { // We've already created a new delegate this frame. // Just schedule a buffer refill. - fillCacheBuffer = true; - q->polish(); + bufferPause.start(); } else { if (bufferMode & BufferAfter) fillTo = bufferTo; @@ -2206,7 +2216,7 @@ void QQuickItemView::createdItem(int index, QQuickItem *item) if (d->requestedIndex != index) { item->setParentItem(contentItem()); d->unrequestedItems.insert(item, index); - item->setVisible(false); + QQuickItemPrivate::get(item)->setCulled(true); d->repositionPackageItemAt(item, index); } else { d->requestedIndex = -1; @@ -2224,8 +2234,7 @@ void QQuickItemView::initItem(int index, QQuickItem *item) item->setZ(1); if (d->requestedIndex == index) { if (d->requestedAsync) - item->setVisible(false); - item->setParentItem(contentItem()); + QQuickItemPrivate::get(item)->setCulled(true); d->requestedItem = d->newViewItem(index, item); } } @@ -2248,7 +2257,7 @@ bool QQuickItemViewPrivate::releaseItem(FxViewItem *item) QQuickVisualModel::ReleaseFlags flags = model->release(item->item); if (flags == 0) { // item was not destroyed, and we no longer reference it. - item->item->setVisible(false); + QQuickItemPrivate::get(item->item)->setCulled(true); unrequestedItems.insert(item->item, model->indexOf(item->item, q)); } delete item; diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index c235945..f68baf2 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -120,7 +120,7 @@ public: }; -class QQuickItemViewPrivate : public QQuickFlickablePrivate, public QQuickItemViewTransitionChangeListener +class QQuickItemViewPrivate : public QQuickFlickablePrivate, public QQuickItemViewTransitionChangeListener, public QAnimationJobChangeListener { Q_DECLARE_PUBLIC(QQuickItemView) public: @@ -188,6 +188,7 @@ public: void regenerate(); void layout(); + virtual void animationFinished(QAbstractAnimationJob *); void refill(); void refill(qreal from, qreal to); void mirrorChange(); @@ -266,6 +267,7 @@ public: FxViewItem *requestedItem; QQuickItemViewChangeSet currentChanges; QQuickItemViewChangeSet bufferedChanges; + QPauseAnimationJob bufferPause; QQmlComponent *highlightComponent; FxViewItem *highlight; diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index e2de19b..75d4933 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -664,13 +664,13 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d qreal pos = itemEnd; while (modelIndex < model->count() && pos <= fillTo) { #ifdef DEBUG_DELEGATE_LIFECYCLE - qDebug() << "refill: append item" << modelIndex << "pos" << pos; + qDebug() << "refill: append item" << modelIndex << "pos" << pos << "buffer" << doBuffer; #endif if (!(item = static_cast(createItem(modelIndex, doBuffer)))) break; if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() item->setPosition(pos, true); - item->item->setVisible(!doBuffer); + QQuickItemPrivate::get(item->item)->setCulled(doBuffer); pos += item->size() + spacing; visibleItems.append(item); ++modelIndex; @@ -682,7 +682,7 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d while (visibleIndex > 0 && visibleIndex <= model->count() && visiblePos > fillFrom) { #ifdef DEBUG_DELEGATE_LIFECYCLE - qDebug() << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos; + qDebug() << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos << "buffer" << doBuffer; #endif if (!(item = static_cast(createItem(visibleIndex-1, doBuffer)))) break; @@ -690,7 +690,7 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d visiblePos -= item->size() + spacing; if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() item->setPosition(visiblePos, true); - item->item->setVisible(!doBuffer); + QQuickItemPrivate::get(item->item)->setCulled(doBuffer); visibleItems.prepend(item); changed = true; } @@ -787,7 +787,7 @@ void QQuickListViewPrivate::layoutVisibleItems(int fromModelIndex) bool fixedCurrent = currentItem && firstItem->item == currentItem->item; qreal sum = firstItem->size(); qreal pos = firstItem->position() + firstItem->size() + spacing; - firstItem->item->setVisible(firstItem->endPosition() >= from && firstItem->position() <= to); + firstItem->setVisible(firstItem->endPosition() >= from && firstItem->position() <= to); for (int i=1; i < visibleItems.count(); ++i) { FxListItemSG *item = static_cast(visibleItems.at(i)); @@ -2659,10 +2659,10 @@ void QQuickListView::viewportMoved() qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); for (int i = 0; i < d->visibleItems.count(); ++i) { FxViewItem *item = static_cast(d->visibleItems.at(i)); - item->item->setVisible(item->endPosition() >= from && item->position() <= to); + QQuickItemPrivate::get(item->item)->setCulled(item->endPosition() < from || item->position() > to); } if (d->currentItem) - d->currentItem->item->setVisible(d->currentItem->endPosition() >= from && d->currentItem->position() <= to); + QQuickItemPrivate::get(d->currentItem->item)->setCulled(d->currentItem->endPosition() < from || d->currentItem->position() > to); if (d->hData.flicking || d->vData.flicking || d->hData.moving || d->vData.moving) d->moveReason = QQuickListViewPrivate::Mouse; diff --git a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp index 9a84200..d7eb5b2 100644 --- a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp +++ b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp @@ -536,7 +536,7 @@ void tst_QQuickGridView::inserted_defaultLayout(QQuickGridView::Flow flow, int firstVisibleIndex = -1; for (int i=0; i(contentItem, "wrapper", i); - if (item && item->isVisible()) { + if (item && delegateVisible(item)) { firstVisibleIndex = i; break; } @@ -956,7 +956,7 @@ void tst_QQuickGridView::removed_defaultLayout(QQuickGridView::Flow flow, QQuickItem *item = findItem(contentItem, "wrapper", i); if (item) { QRectF itemRect(item->x(), item->y(), item->width(), item->height()); - if (item->isVisible() && viewRect.intersects(itemRect)) { + if (delegateVisible(item) && viewRect.intersects(itemRect)) { firstVisibleIndex = i; QQmlExpression en(qmlContext(item), item, "name"); firstName = en.evaluate().toString(); @@ -1302,7 +1302,7 @@ void tst_QQuickGridView::moved_defaultLayout(QQuickGridView::Flow flow, int firstVisibleIndex = -1; for (int i=0; i(contentItem, "wrapper", i); - if (item && item->isVisible()) { + if (item && delegateVisible(item)) { firstVisibleIndex = i; break; } @@ -1865,9 +1865,9 @@ void tst_QQuickGridView::currentIndex() // moving currentItem out of view should make it invisible gridview->setCurrentIndex(0); - QTRY_VERIFY(gridview->currentItem()->isVisible()); + QTRY_VERIFY(delegateVisible(gridview->currentItem())); gridview->setContentY(200); - QTRY_VERIFY(!gridview->currentItem()->isVisible()); + QTRY_VERIFY(!delegateVisible(gridview->currentItem())); delete canvas; } @@ -3748,7 +3748,7 @@ void tst_QQuickGridView::resizeViewAndRepaint() QTRY_VERIFY(item); QTRY_COMPARE(item->x(), qreal((i%3)*80)); QTRY_COMPARE(item->y(), qreal((i/3)*60)); - QCOMPARE(item->isVisible(), i < 9); // inside view visible, outside not visible + QCOMPARE(delegateVisible(item), i < 9); // inside view visible, outside not visible } // ensure items outside view become invisible @@ -3762,7 +3762,7 @@ void tst_QQuickGridView::resizeViewAndRepaint() QTRY_VERIFY(item); QTRY_COMPARE(item->x(), qreal((i%3)*80)); QTRY_COMPARE(item->y(), qreal((i/3)*60)); - QCOMPARE(item->isVisible(), i < 6); // inside view visible, outside not visible + QCOMPARE(delegateVisible(item), i < 6); // inside view visible, outside not visible } delete canvas; @@ -5985,23 +5985,23 @@ void tst_QQuickGridView::unrequestedVisibility() QQuickItem *item; QVERIFY(item = findItem(leftContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 11)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 11)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(leftContent, "wrapper", 9)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(leftContent, "wrapper", 10)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 3)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 4)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); rightview->setCurrentIndex(0); @@ -6009,9 +6009,9 @@ void tst_QQuickGridView::unrequestedVisibility() QTRY_COMPARE(rightview->contentY(), 0.0); QVERIFY(item = findItem(leftContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 1)); - QTRY_COMPARE(item->isVisible(), true); + QTRY_COMPARE(delegateVisible(item), true); QVERIFY(!findItem(leftContent, "wrapper", 11)); QVERIFY(!findItem(rightContent, "wrapper", 11)); @@ -6022,98 +6022,98 @@ void tst_QQuickGridView::unrequestedVisibility() QTRY_COMPARE(rightview->contentY(), 0.0); QVERIFY(item = findItem(leftContent, "wrapper", 1)); - QTRY_COMPARE(item->isVisible(), false); + QTRY_COMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(leftContent, "wrapper", 11)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 11)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 3)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 9)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 10)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); // move a non-visible item into view model.moveItems(10, 9, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QTRY_VERIFY(item = findItem(leftContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(leftContent, "wrapper", 11)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 11)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 3)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 9)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 10)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); // move a visible item out of view model.moveItems(5, 3, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QVERIFY(item = findItem(leftContent, "wrapper", 3)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 9)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 10)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); // move a non-visible item into view model.moveItems(3, 5, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QVERIFY(item = findItem(leftContent, "wrapper", 3)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 9)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 10)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); // move a visible item out of view model.moveItems(9, 10, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QVERIFY(item = findItem(leftContent, "wrapper", 3)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 9)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 10)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); // move a non-visible item into view model.moveItems(10, 9, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QVERIFY(item = findItem(leftContent, "wrapper", 3)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 9)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 10)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); delete canvas; } diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index 4696e44..b1ba5bb 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -599,7 +599,7 @@ void tst_QQuickListView::inserted_more(QQuickItemView::VerticalLayoutDirection v int firstVisibleIndex = -1; for (int i=0; i(contentItem, "wrapper", i); - if (item && item->isVisible()) { + if (item && !QQuickItemPrivate::get(item)->culled) { firstVisibleIndex = i; break; } @@ -1040,7 +1040,7 @@ void tst_QQuickListView::removed_more(const QUrl &source, QQuickItemView::Vertic int firstVisibleIndex = -1; for (int i=0; i(contentItem, "wrapper", i); - if (item && item->isVisible()) { + if (item && delegateVisible(item)) { firstVisibleIndex = i; break; } @@ -1275,7 +1275,7 @@ void tst_QQuickListView::moved(const QUrl &source, QQuickItemView::VerticalLayou int firstVisibleIndex = -1; for (int i=0; i(contentItem, "wrapper", i); - if (item && item->isVisible()) { + if (item && delegateVisible(item)) { firstVisibleIndex = i; break; } @@ -2436,9 +2436,9 @@ void tst_QQuickListView::currentIndex() // moving currentItem out of view should make it invisible listview->setCurrentIndex(0); - QTRY_VERIFY(listview->currentItem()->isVisible()); + QTRY_VERIFY(delegateVisible(listview->currentItem())); listview->setContentY(200); - QTRY_VERIFY(!listview->currentItem()->isVisible()); + QTRY_VERIFY(!delegateVisible(listview->currentItem())); delete canvas; } @@ -2667,29 +2667,29 @@ void tst_QQuickListView::itemListFlicker() QQuickItem *item; QVERIFY(item = findItem(contentItem, "item1")); - QVERIFY(item->isVisible()); + QVERIFY(delegateVisible(item)); QVERIFY(item = findItem(contentItem, "item2")); - QVERIFY(item->isVisible()); + QVERIFY(delegateVisible(item)); QVERIFY(item = findItem(contentItem, "item3")); - QVERIFY(item->isVisible()); + QVERIFY(delegateVisible(item)); listview->setCurrentIndex(1); QVERIFY(item = findItem(contentItem, "item1")); - QVERIFY(item->isVisible()); + QVERIFY(delegateVisible(item)); QVERIFY(item = findItem(contentItem, "item2")); - QVERIFY(item->isVisible()); + QVERIFY(delegateVisible(item)); QVERIFY(item = findItem(contentItem, "item3")); - QVERIFY(item->isVisible()); + QVERIFY(delegateVisible(item)); listview->setCurrentIndex(2); QVERIFY(item = findItem(contentItem, "item1")); - QVERIFY(item->isVisible()); + QVERIFY(delegateVisible(item)); QVERIFY(item = findItem(contentItem, "item2")); - QVERIFY(item->isVisible()); + QVERIFY(delegateVisible(item)); QVERIFY(item = findItem(contentItem, "item3")); - QVERIFY(item->isVisible()); + QVERIFY(delegateVisible(item)); delete canvas; } @@ -3886,7 +3886,7 @@ void tst_QQuickListView::resizeView() if (!item) qWarning() << "Item" << i << "not found"; QTRY_VERIFY(item); QTRY_COMPARE(item->y(), i*20.); - QCOMPARE(item->isVisible(), i < 11); // inside view visible, outside not visible + QCOMPARE(delegateVisible(item), i < 11); // inside view visible, outside not visible } // ensure items outside view become invisible @@ -3899,7 +3899,7 @@ void tst_QQuickListView::resizeView() if (!item) qWarning() << "Item" << i << "not found"; QTRY_VERIFY(item); QTRY_COMPARE(item->y(), i*20.); - QCOMPARE(item->isVisible(), i < 6); // inside view visible, outside not visible + QCOMPARE(delegateVisible(item), i < 6); // inside view visible, outside not visible } delete canvas; @@ -5299,23 +5299,23 @@ void tst_QQuickListView::unrequestedVisibility() QQuickItem *item; QVERIFY(item = findItem(leftContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 19)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 19)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(leftContent, "wrapper", 16)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(leftContent, "wrapper", 17)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 3)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 4)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); rightview->setCurrentIndex(0); @@ -5323,9 +5323,9 @@ void tst_QQuickListView::unrequestedVisibility() QTRY_COMPARE(rightview->contentY(), 0.0); QVERIFY(item = findItem(leftContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 1)); - QTRY_COMPARE(item->isVisible(), true); + QTRY_COMPARE(delegateVisible(item), true); QVERIFY(!findItem(leftContent, "wrapper", 19)); QVERIFY(!findItem(rightContent, "wrapper", 19)); @@ -5336,93 +5336,93 @@ void tst_QQuickListView::unrequestedVisibility() QTRY_COMPARE(rightview->contentY(), 0.0); QVERIFY(item = findItem(leftContent, "wrapper", 1)); - QTRY_COMPARE(item->isVisible(), false); + QTRY_COMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(leftContent, "wrapper", 19)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 19)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 3)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 4)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 16)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 17)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); model.moveItems(19, 1, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QTRY_VERIFY(item = findItem(leftContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(rightContent, "wrapper", 1)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(leftContent, "wrapper", 19)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 19)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 4)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 16)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 17)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); model.moveItems(3, 4, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QVERIFY(item = findItem(leftContent, "wrapper", 4)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 16)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 17)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); model.moveItems(4, 3, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QVERIFY(item = findItem(leftContent, "wrapper", 4)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 16)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 17)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); model.moveItems(16, 17, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QVERIFY(item = findItem(leftContent, "wrapper", 4)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 16)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 17)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); model.moveItems(17, 16, 1); QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); QVERIFY(item = findItem(leftContent, "wrapper", 4)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); QVERIFY(item = findItem(leftContent, "wrapper", 5)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 16)); - QCOMPARE(item->isVisible(), true); + QCOMPARE(delegateVisible(item), true); QVERIFY(item = findItem(rightContent, "wrapper", 17)); - QCOMPARE(item->isVisible(), false); + QCOMPARE(delegateVisible(item), false); delete canvas; } diff --git a/tests/auto/quick/shared/visualtestutil.cpp b/tests/auto/quick/shared/visualtestutil.cpp index 8680df1..37d7323 100644 --- a/tests/auto/quick/shared/visualtestutil.cpp +++ b/tests/auto/quick/shared/visualtestutil.cpp @@ -44,12 +44,17 @@ #include #include +bool QQuickVisualTestUtil::delegateVisible(QQuickItem *item) +{ + return item->isVisible() && !QQuickItemPrivate::get(item)->culled; +} + QQuickItem *QQuickVisualTestUtil::findVisibleChild(QQuickItem *parent, const QString &objectName) { QQuickItem *item = 0; QList items = parent->findChildren(objectName); for (int i = 0; i < items.count(); ++i) { - if (items.at(i)->isVisible()) { + if (items.at(i)->isVisible() && !QQuickItemPrivate::get(items.at(i))->culled) { item = items.at(i); break; } diff --git a/tests/auto/quick/shared/visualtestutil.h b/tests/auto/quick/shared/visualtestutil.h index c2fc9cc..51f3f50 100644 --- a/tests/auto/quick/shared/visualtestutil.h +++ b/tests/auto/quick/shared/visualtestutil.h @@ -53,6 +53,7 @@ namespace QQuickVisualTestUtil void dumpTree(QQuickItem *parent, int depth = 0); + bool delegateVisible(QQuickItem *item); /* Find an item with the specified objectName. If index is supplied then the @@ -90,7 +91,7 @@ namespace QQuickVisualTestUtil const QMetaObject &mo = T::staticMetaObject; for (int i = 0; i < parent->childItems().count(); ++i) { QQuickItem *item = qobject_cast(parent->childItems().at(i)); - if (!item || (visibleOnly && !item->isVisible())) + if (!item || (visibleOnly && (!item->isVisible() || QQuickItemPrivate::get(item)->culled))) continue; if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) items.append(static_cast(item)); -- 2.7.4