From 39c144f44be76ccc7bdec540a7b7ec00cf0fdc5d Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Wed, 23 Jul 2014 17:51:37 +1000 Subject: Don't recreate header and footer unnecessarily The only time that they need to be recreated is if the orientation changes (even then, a good implementation could handle it, but no point requiring that now). Task-number: QTBUG-40375 Change-Id: Id0215fb812724827bb139cda8f8dc6208c703852 Reviewed-by: Andrew den Exter --- src/quick/items/qquickgridview.cpp | 2 +- src/quick/items/qquickitemview.cpp | 14 ++++++++------ src/quick/items/qquickitemview_p_p.h | 2 +- src/quick/items/qquicklistview.cpp | 2 +- tests/auto/quick/qquickgridview/tst_qquickgridview.cpp | 9 +++++---- tests/auto/quick/qquicklistview/tst_qquicklistview.cpp | 9 +++++---- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index d5ca3a128e..c9a051c9bb 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -1616,7 +1616,7 @@ void QQuickGridView::setFlow(Flow flow) } setContentX(0); setContentY(0); - d->regenerate(); + d->regenerate(true); emit flowChanged(); } } diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 94abbd0954..ff8c69a9c0 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1783,18 +1783,20 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to) emit q->countChanged(); } -void QQuickItemViewPrivate::regenerate() +void QQuickItemViewPrivate::regenerate(bool orientationChanged) { Q_Q(QQuickItemView); if (q->isComponentComplete()) { currentChanges.reset(); - delete header; - header = 0; - delete footer; - footer = 0; + if (orientationChanged) { + delete header; + header = 0; + delete footer; + footer = 0; + } + clear(); updateHeader(); updateFooter(); - clear(); updateViewport(); setPosition(contentStartOffset()); refill(); diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index a0d17b3bf9..297b9a1471 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -184,7 +184,7 @@ public: virtual void clear(); virtual void updateViewport(); - void regenerate(); + void regenerate(bool orientationChanged=false); void layout(); virtual void animationFinished(QAbstractAnimationJob *); void refill(); diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index c496eab3c5..e5b9f9cf59 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -2070,7 +2070,7 @@ void QQuickListView::setOrientation(QQuickListView::Orientation orientation) setFlickableDirection(HorizontalFlick); setContentY(0); } - d->regenerate(); + d->regenerate(true); emit orientationChanged(); } } diff --git a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp index 863fb69b84..a350074b42 100644 --- a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp +++ b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp @@ -3613,12 +3613,13 @@ void tst_QQuickGridView::resetModel_headerFooter() model.reset(); - header = findItem(contentItem, "header"); - QVERIFY(header); + // A reset should not force a new header or footer to be created. + QQuickItem *newHeader = findItem(contentItem, "header"); + QVERIFY(newHeader == header); QCOMPARE(header->y(), -header->height()); - footer = findItem(contentItem, "footer"); - QVERIFY(footer); + QQuickItem *newFooter = findItem(contentItem, "footer"); + QVERIFY(newFooter == footer); QCOMPARE(footer->y(), 60.*2); delete window; diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index 14e26b720c..b561258351 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -4081,12 +4081,13 @@ void tst_QQuickListView::resetModel_headerFooter() model.reset(); - header = findItem(contentItem, "header"); - QVERIFY(header); + // A reset should not force a new header or footer to be created. + QQuickItem *newHeader = findItem(contentItem, "header"); + QVERIFY(newHeader == header); QCOMPARE(header->y(), -header->height()); - footer = findItem(contentItem, "footer"); - QVERIFY(footer); + QQuickItem *newFooter = findItem(contentItem, "footer"); + QVERIFY(newFooter == footer); QCOMPARE(footer->y(), 30.*4); delete window; -- cgit v1.2.3