Must update columns when GridView geometry changes
authorBea Lam <bea.lam@nokia.com>
Wed, 1 Feb 2012 06:48:03 +0000 (16:48 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 2 Feb 2012 03:56:27 +0000 (04:56 +0100)
Regression from changes in 80d85e0017cb5cc4b0a0df6c19d4126bf5062731

Also remove shared duplicate code in visibleItemsChanged() in
ListView and GridView.

Change-Id: Ic3ab3ba070ddf9901a232ed5b3250c725797cf69
Reviewed-by: Martin Jones <martin.jones@nokia.com>

src/quick/items/qquickgridview.cpp
src/quick/items/qquickgridview_p.h
src/quick/items/qquickitemview.cpp
src/quick/items/qquickitemview_p_p.h
src/quick/items/qquicklistview.cpp
tests/auto/qtquick2/qquickgridview/data/resizeview.qml
tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp

index 8f8fac7..80ab2ac 100644 (file)
@@ -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()
 
index 204e274..8a2487b 100644 (file)
@@ -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
index 3b264ab..a90d7cc 100644 (file)
@@ -1331,6 +1331,9 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to)
         markExtentsDirty();
         updateBeginningEnd();
         visibleItemsChanged();
+        updateHeader();
+        updateFooter();
+        updateViewport();
     }
 
     if (prevCount != itemCount)
index 870baa0..56a2243 100644 (file)
@@ -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;
index 21ff2c7..129db0c 100644 (file)
@@ -695,9 +695,6 @@ void QQuickListViewPrivate::visibleItemsChanged()
     }
     if (sectionCriteria)
         updateCurrentSection();
-    updateHeader();
-    updateFooter();
-    updateViewport();
     updateUnrequestedPositions();
 }
 
index 1f730a4..130a0de 100644 (file)
@@ -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
index 303f4bd..fb2b6b4 100644 (file)
@@ -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<QQuickGridView>(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<QQuickItem>(contentItem, "wrapper").count();
+    QCOMPARE(itemCount, 6);
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QQuickItem *item = findItem<QQuickItem>(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<QQuickItem>(contentItem, "wrapper").count();
+    QCOMPARE(itemCount, 6*3 + 1);
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QQuickItem *item = findItem<QQuickItem>(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<QQuickItem>(contentItem, "wrapper").count();
+    QCOMPARE(itemCount, 6);
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QQuickItem *item = findItem<QQuickItem>(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<qreal>("x");