From: Bea Lam Date: Wed, 1 Feb 2012 06:48:03 +0000 (+1000) Subject: Must update columns when GridView geometry changes X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=67ebd7014134df8c7981b815a99cd9d749e167db;p=konrad%2Fqtdeclarative.git Must update columns when GridView geometry changes Regression from changes in 80d85e0017cb5cc4b0a0df6c19d4126bf5062731 Also remove shared duplicate code in visibleItemsChanged() in ListView and GridView. Change-Id: Ic3ab3ba070ddf9901a232ed5b3250c725797cf69 Reviewed-by: Martin Jones --- diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index 8f8fac7..80ab2ac 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -167,9 +167,10 @@ public: FxViewItem *snapItemAt(qreal pos) const; int snapIndex() const; + void resetColumns(); + virtual bool addVisibleItems(qreal fillFrom, qreal fillTo, bool doBuffer); virtual bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo); - virtual void visibleItemsChanged(); virtual FxViewItem *newViewItem(int index, QQuickItem *item); virtual void repositionPackageItemAt(QQuickItem *item, int index); @@ -395,6 +396,13 @@ int QQuickGridViewPrivate::snapIndex() const return index; } +void QQuickGridViewPrivate::resetColumns() +{ + Q_Q(QQuickGridView); + qreal length = flow == QQuickGridView::LeftToRight ? q->width() : q->height(); + columns = (int)qMax((length + colSize()/2) / colSize(), qreal(1.)); +} + FxViewItem *QQuickGridViewPrivate::newViewItem(int modelIndex, QQuickItem *item) { Q_Q(QQuickGridView); @@ -535,18 +543,9 @@ bool QQuickGridViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer return changed; } -void QQuickGridViewPrivate::visibleItemsChanged() -{ - updateHeader(); - updateFooter(); - updateViewport(); -} - void QQuickGridViewPrivate::updateViewport() { - Q_Q(QQuickGridView); - qreal length = flow == QQuickGridView::LeftToRight ? q->width() : q->height(); - columns = (int)qMax((length + colSize()/2) / colSize(), qreal(1.)); + resetColumns(); QQuickItemViewPrivate::updateViewport(); } @@ -1620,6 +1619,14 @@ void QQuickGridView::keyPressEvent(QKeyEvent *event) event->ignore(); QQuickItemView::keyPressEvent(event); } + +void QQuickGridView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) +{ + Q_D(QQuickGridView); + d->resetColumns(); + QQuickItemView::geometryChanged(newGeometry, oldGeometry); +} + /*! \qmlmethod QtQuick2::GridView::moveCurrentIndexUp() diff --git a/src/quick/items/qquickgridview_p.h b/src/quick/items/qquickgridview_p.h index 204e274..8a2487b 100644 --- a/src/quick/items/qquickgridview_p.h +++ b/src/quick/items/qquickgridview_p.h @@ -108,6 +108,7 @@ Q_SIGNALS: protected: virtual void viewportMoved(); virtual void keyPressEvent(QKeyEvent *); + virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); }; class QQuickGridViewAttached : public QQuickItemViewAttached diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 3b264ab..a90d7cc 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1331,6 +1331,9 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to) markExtentsDirty(); updateBeginningEnd(); visibleItemsChanged(); + updateHeader(); + updateFooter(); + updateViewport(); } if (prevCount != itemCount) diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index 870baa0..56a2243 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -243,7 +243,7 @@ protected: virtual bool addVisibleItems(qreal fillFrom, qreal fillTo, bool doBuffer) = 0; virtual bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo) = 0; - virtual void visibleItemsChanged() = 0; + virtual void visibleItemsChanged() {} virtual FxViewItem *newViewItem(int index, QQuickItem *item) = 0; virtual void repositionPackageItemAt(QQuickItem *item, int index) = 0; diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 21ff2c7..129db0c 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -695,9 +695,6 @@ void QQuickListViewPrivate::visibleItemsChanged() } if (sectionCriteria) updateCurrentSection(); - updateHeader(); - updateFooter(); - updateViewport(); updateUnrequestedPositions(); } diff --git a/tests/auto/qtquick2/qquickgridview/data/resizeview.qml b/tests/auto/qtquick2/qquickgridview/data/resizeview.qml index 1f730a4..130a0de 100644 --- a/tests/auto/qtquick2/qquickgridview/data/resizeview.qml +++ b/tests/auto/qtquick2/qquickgridview/data/resizeview.qml @@ -3,12 +3,13 @@ import QtQuick 2.0 Rectangle { id: root - property real initialHeight + width: 240 + height: 320 GridView { id: grid objectName: "grid" - width: 240 + width: initialWidth height: initialHeight cellWidth: 80 cellHeight: 60 diff --git a/tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp b/tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp index 303f4bd..fb2b6b4 100644 --- a/tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp +++ b/tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp @@ -105,6 +105,7 @@ private slots: void header(); void header_data(); void resizeViewAndRepaint(); + void changeColumnCount(); void indexAt_itemAt_data(); void indexAt_itemAt(); void onAdd(); @@ -3185,6 +3186,7 @@ void tst_QQuickGridView::resizeViewAndRepaint() QDeclarativeContext *ctxt = canvas->rootContext(); ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("initialWidth", 240); ctxt->setContextProperty("initialHeight", 100); canvas->setSource(testFileUrl("resizeview.qml")); @@ -3247,6 +3249,64 @@ void tst_QQuickGridView::resizeViewAndRepaint() delete canvas; } +void tst_QQuickGridView::changeColumnCount() +{ + TestModel model; + for (int i = 0; i < 40; i++) + model.addItem("Item" + QString::number(i), ""); + + QQuickView *canvas = createView(); + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("initialWidth", 100); + ctxt->setContextProperty("initialHeight", 320); + canvas->setSource(testFileUrl("resizeview.qml")); + canvas->show(); + qApp->processEvents(); + + QQuickGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + QQuickItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + + // a single column of 6 items are visible + int itemCount = findItems(contentItem, "wrapper").count(); + QCOMPARE(itemCount, 6); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QQuickItem *item = findItem(contentItem, "wrapper", i); + QVERIFY2(item, QTest::toString(QString("Item %1 not found").arg(i))); + QCOMPARE(item->x(), 0.0); + QCOMPARE(item->y(), qreal(i*60)); + } + + // now 6x3 grid is visible, plus 1 extra below for refill + gridview->setWidth(240); + QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + itemCount = findItems(contentItem, "wrapper").count(); + QCOMPARE(itemCount, 6*3 + 1); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QQuickItem *item = findItem(contentItem, "wrapper", i); + QVERIFY2(item, QTest::toString(QString("Item %1 not found").arg(i))); + QCOMPARE(item->x(), qreal((i%3)*80)); + QCOMPARE(item->y(), qreal((i/3)*60)); + } + + // back to single column + gridview->setWidth(100); + QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + itemCount = findItems(contentItem, "wrapper").count(); + QCOMPARE(itemCount, 6); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QQuickItem *item = findItem(contentItem, "wrapper", i); + QVERIFY2(item, QTest::toString(QString("Item %1 not found").arg(i))); + QCOMPARE(item->x(), 0.0); + QCOMPARE(item->y(), qreal(i*60)); + } + + delete canvas; +} + void tst_QQuickGridView::indexAt_itemAt_data() { QTest::addColumn("x");