aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2012-02-01 16:48:03 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-02 04:56:27 +0100
commit67ebd7014134df8c7981b815a99cd9d749e167db (patch)
tree75af05e865545cbf5611779143853d089184aa09
parentc1e668a96764d1a252322ebae3af72097c27dfe1 (diff)
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 <martin.jones@nokia.com>
-rw-r--r--src/quick/items/qquickgridview.cpp29
-rw-r--r--src/quick/items/qquickgridview_p.h1
-rw-r--r--src/quick/items/qquickitemview.cpp3
-rw-r--r--src/quick/items/qquickitemview_p_p.h2
-rw-r--r--src/quick/items/qquicklistview.cpp3
-rw-r--r--tests/auto/qtquick2/qquickgridview/data/resizeview.qml5
-rw-r--r--tests/auto/qtquick2/qquickgridview/tst_qquickgridview.cpp60
7 files changed, 86 insertions, 17 deletions
diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp
index 8f8fac7cc8..80ab2ac55a 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 204e2744ab..8a2487bb07 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 3b264ab96b..a90d7cc8a0 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 870baa04bc..56a22437ad 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 21ff2c76a8..129db0c3cf 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 1f730a4a8a..130a0defc1 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 303f4bd7b7..fb2b6b46f9 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<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");