Performance should always be better with cacheBuffer
authorMartin Jones <martin.jones@nokia.com>
Fri, 8 Jun 2012 01:19:09 +0000 (11:19 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 8 Jun 2012 04:17:54 +0000 (06:17 +0200)
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 <bea.lam@nokia.com>
src/quick/items/qquickgridview.cpp
src/quick/items/qquickitem.cpp
src/quick/items/qquickitem_p.h
src/quick/items/qquickitemview.cpp
src/quick/items/qquickitemview_p_p.h
src/quick/items/qquicklistview.cpp
tests/auto/quick/qquickgridview/tst_qquickgridview.cpp
tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
tests/auto/quick/shared/visualtestutil.cpp
tests/auto/quick/shared/visualtestutil.h

index 235005b..331f23e 100644 (file)
@@ -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<FxGridItemSG*>(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<FxGridItemSG*>(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;
index f5ab703..ae912a2 100644 (file)
@@ -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);
index e7c449b..bbff260 100644 (file)
@@ -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;
index 9ea2aad..e48db3d 100644 (file)
@@ -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;
index c235945..f68baf2 100644 (file)
@@ -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;
index e2de19b..75d4933 100644 (file)
@@ -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<FxListItemSG*>(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<FxListItemSG*>(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<FxListItemSG*>(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<FxListItemSG*>(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;
index 9a84200..d7eb5b2 100644 (file)
@@ -536,7 +536,7 @@ void tst_QQuickGridView::inserted_defaultLayout(QQuickGridView::Flow flow,
     int firstVisibleIndex = -1;
     for (int i=0; i<items.count(); i++) {
         QQuickItem *item = findItem<QQuickItem>(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<QQuickItem>(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<items.count(); i++) {
         QQuickItem *item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 11));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 11));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 9));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 10));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 3));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 1));
-    QTRY_COMPARE(item->isVisible(), true);
+    QTRY_COMPARE(delegateVisible(item), true);
 
     QVERIFY(!findItem<QQuickItem>(leftContent, "wrapper", 11));
     QVERIFY(!findItem<QQuickItem>(rightContent, "wrapper", 11));
@@ -6022,98 +6022,98 @@ void tst_QQuickGridView::unrequestedVisibility()
     QTRY_COMPARE(rightview->contentY(), 0.0);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 1));
-    QTRY_COMPARE(item->isVisible(), false);
+    QTRY_COMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 11));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 11));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 11));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 11));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 3));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 3));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 3));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 3));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 9));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 10));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
 
     delete canvas;
 }
index 4696e44..b1ba5bb 100644 (file)
@@ -599,7 +599,7 @@ void tst_QQuickListView::inserted_more(QQuickItemView::VerticalLayoutDirection v
     int firstVisibleIndex = -1;
     for (int i=0; i<items.count(); i++) {
         QQuickItem *item = findItem<QQuickItem>(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<items.count(); i++) {
         QQuickItem *item = findItem<QQuickItem>(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<items.count(); i++) {
         QQuickItem *item = findItem<QQuickItem>(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<QQuickItem>(contentItem, "item1"));
-    QVERIFY(item->isVisible());
+    QVERIFY(delegateVisible(item));
     QVERIFY(item = findItem<QQuickItem>(contentItem, "item2"));
-    QVERIFY(item->isVisible());
+    QVERIFY(delegateVisible(item));
     QVERIFY(item = findItem<QQuickItem>(contentItem, "item3"));
-    QVERIFY(item->isVisible());
+    QVERIFY(delegateVisible(item));
 
     listview->setCurrentIndex(1);
 
     QVERIFY(item = findItem<QQuickItem>(contentItem, "item1"));
-    QVERIFY(item->isVisible());
+    QVERIFY(delegateVisible(item));
     QVERIFY(item = findItem<QQuickItem>(contentItem, "item2"));
-    QVERIFY(item->isVisible());
+    QVERIFY(delegateVisible(item));
     QVERIFY(item = findItem<QQuickItem>(contentItem, "item3"));
-    QVERIFY(item->isVisible());
+    QVERIFY(delegateVisible(item));
 
     listview->setCurrentIndex(2);
 
     QVERIFY(item = findItem<QQuickItem>(contentItem, "item1"));
-    QVERIFY(item->isVisible());
+    QVERIFY(delegateVisible(item));
     QVERIFY(item = findItem<QQuickItem>(contentItem, "item2"));
-    QVERIFY(item->isVisible());
+    QVERIFY(delegateVisible(item));
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 19));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 19));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 16));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 17));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 3));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 1));
-    QTRY_COMPARE(item->isVisible(), true);
+    QTRY_COMPARE(delegateVisible(item), true);
 
     QVERIFY(!findItem<QQuickItem>(leftContent, "wrapper", 19));
     QVERIFY(!findItem<QQuickItem>(rightContent, "wrapper", 19));
@@ -5336,93 +5336,93 @@ void tst_QQuickListView::unrequestedVisibility()
     QTRY_COMPARE(rightview->contentY(), 0.0);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 1));
-    QTRY_COMPARE(item->isVisible(), false);
+    QTRY_COMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 19));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 19));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 4));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 16));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 1));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 19));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 19));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
 
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 4));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 16));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 4));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 16));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 4));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 16));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 4));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 16));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(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<QQuickItem>(leftContent, "wrapper", 4));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
     QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 5));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 16));
-    QCOMPARE(item->isVisible(), true);
+    QCOMPARE(delegateVisible(item), true);
     QVERIFY(item = findItem<QQuickItem>(rightContent, "wrapper", 17));
-    QCOMPARE(item->isVisible(), false);
+    QCOMPARE(delegateVisible(item), false);
 
     delete canvas;
 }
index 8680df1..37d7323 100644 (file)
 #include <QtQuick/QQuickItem>
 #include <QtCore/QDebug>
 
+bool QQuickVisualTestUtil::delegateVisible(QQuickItem *item)
+{
+    return item->isVisible() && !QQuickItemPrivate::get(item)->culled;
+}
+
 QQuickItem *QQuickVisualTestUtil::findVisibleChild(QQuickItem *parent, const QString &objectName)
 {
     QQuickItem *item = 0;
     QList<QQuickItem*> items = parent->findChildren<QQuickItem*>(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;
         }
index c2fc9cc..51f3f50 100644 (file)
@@ -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<QQuickItem*>(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<T*>(item));