1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the test suite of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include <QtTest/QtTest>
43 #include <QtCore/qstringlistmodel.h>
44 #include <QtQuick1/qdeclarativeview.h>
45 #include <QtDeclarative/qdeclarativeengine.h>
46 #include <QtDeclarative/qdeclarativecomponent.h>
47 #include <QtDeclarative/qdeclarativecontext.h>
48 #include <QtDeclarative/qdeclarativeexpression.h>
49 #include <QtQuick1/private/qdeclarativeitem_p.h>
50 #include <QtQuick1/private/qdeclarativegridview_p.h>
51 #include <QtQuick1/private/qdeclarativetext_p.h>
53 class tst_QDeclarative1GridView : public QObject
57 tst_QDeclarative1GridView();
68 void noCurrentIndex();
71 void propertyChanges();
72 void componentChanges();
74 void positionViewAtIndex();
75 void positionViewAtIndex_rightToLeft();
80 void enforceRange_rightToLeft();
82 void manualHighlight();
90 void testQtQuick11Attributes();
91 void testQtQuick11Attributes_data();
92 void contentPosJump();
95 QDeclarativeView *createView();
97 T *findItem(QGraphicsObject *parent, const QString &id, int index=-1);
99 QList<T*> findItems(QGraphicsObject *parent, const QString &objectName);
100 void dumpTree(QDeclarativeItem *parent, int depth = 0);
103 class TestModel : public QAbstractListModel
106 enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 };
108 TestModel(QObject *parent=0) : QAbstractListModel(parent) {
109 QHash<int, QByteArray> roles;
110 roles[Name] = "name";
111 roles[Number] = "number";
115 int rowCount(const QModelIndex &parent=QModelIndex()) const { Q_UNUSED(parent); return list.count(); }
116 QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const {
119 rv = list.at(index.row()).first;
120 else if (role == Number)
121 rv = list.at(index.row()).second;
126 int count() const { return rowCount(); }
127 QString name(int index) const { return list.at(index).first; }
128 QString number(int index) const { return list.at(index).second; }
130 void addItem(const QString &name, const QString &number) {
131 emit beginInsertRows(QModelIndex(), list.count(), list.count());
132 list.append(QPair<QString,QString>(name, number));
133 emit endInsertRows();
136 void addItems(const QList<QPair<QString, QString> > &items) {
137 emit beginInsertRows(QModelIndex(), list.count(), list.count()+items.count()-1);
138 for (int i=0; i<items.count(); i++)
139 list.append(QPair<QString,QString>(items[i].first, items[i].second));
140 emit endInsertRows();
143 void insertItem(int index, const QString &name, const QString &number) {
144 emit beginInsertRows(QModelIndex(), index, index);
145 list.insert(index, QPair<QString,QString>(name, number));
146 emit endInsertRows();
149 void removeItem(int index) {
150 emit beginRemoveRows(QModelIndex(), index, index);
151 list.removeAt(index);
152 emit endRemoveRows();
155 void removeItems(int index, int count) {
156 emit beginRemoveRows(QModelIndex(), index, index+count-1);
158 list.removeAt(index);
159 emit endRemoveRows();
162 void moveItem(int from, int to) {
163 emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to);
168 void modifyItem(int idx, const QString &name, const QString &number) {
169 list[idx] = QPair<QString,QString>(name, number);
170 emit dataChanged(index(idx,0), index(idx,0));
174 int count = list.count();
175 emit beginRemoveRows(QModelIndex(), 0, count-1);
177 emit endRemoveRows();
182 QList<QPair<QString,QString> > list;
185 tst_QDeclarative1GridView::tst_QDeclarative1GridView()
189 void tst_QDeclarative1GridView::items()
191 QDeclarativeView *canvas = createView();
194 model.addItem("Fred", "12345");
195 model.addItem("John", "2345");
196 model.addItem("Bob", "54321");
197 model.addItem("Billy", "22345");
198 model.addItem("Sam", "2945");
199 model.addItem("Ben", "04321");
200 model.addItem("Jim", "0780");
202 QDeclarativeContext *ctxt = canvas->rootContext();
203 ctxt->setContextProperty("testModel", &model);
204 ctxt->setContextProperty("testRightToLeft", QVariant(false));
205 ctxt->setContextProperty("testTopToBottom", QVariant(false));
207 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
208 qApp->processEvents();
210 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
211 QTRY_VERIFY(gridview != 0);
213 QDeclarativeItem *contentItem = gridview->contentItem();
214 QTRY_VERIFY(contentItem != 0);
216 QTRY_COMPARE(gridview->count(), model.count());
217 QTRY_COMPARE(canvas->rootObject()->property("count").toInt(), model.count());
218 QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
220 for (int i = 0; i < model.count(); ++i) {
221 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", i);
222 QTRY_VERIFY(name != 0);
223 QTRY_COMPARE(name->text(), model.name(i));
224 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", i);
225 QTRY_VERIFY(number != 0);
226 QTRY_COMPARE(number->text(), model.number(i));
229 // set an empty model and confirm that items are destroyed
231 ctxt->setContextProperty("testModel", &model2);
233 int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
234 QTRY_VERIFY(itemCount == 0);
239 void tst_QDeclarative1GridView::changed()
241 QDeclarativeView *canvas = createView();
244 model.addItem("Fred", "12345");
245 model.addItem("John", "2345");
246 model.addItem("Bob", "54321");
247 model.addItem("Billy", "22345");
248 model.addItem("Sam", "2945");
249 model.addItem("Ben", "04321");
250 model.addItem("Jim", "0780");
252 QDeclarativeContext *ctxt = canvas->rootContext();
253 ctxt->setContextProperty("testModel", &model);
254 ctxt->setContextProperty("testRightToLeft", QVariant(false));
255 ctxt->setContextProperty("testTopToBottom", QVariant(false));
257 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
258 qApp->processEvents();
260 QDeclarative1Flickable *gridview = findItem<QDeclarative1Flickable>(canvas->rootObject(), "grid");
261 QTRY_VERIFY(gridview != 0);
263 QDeclarativeItem *contentItem = gridview->contentItem();
264 QTRY_VERIFY(contentItem != 0);
266 model.modifyItem(1, "Will", "9876");
267 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", 1);
268 QTRY_VERIFY(name != 0);
269 QTRY_COMPARE(name->text(), model.name(1));
270 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", 1);
271 QTRY_VERIFY(number != 0);
272 QTRY_COMPARE(number->text(), model.number(1));
277 void tst_QDeclarative1GridView::inserted()
279 QDeclarativeView *canvas = createView();
282 model.addItem("Fred", "12345");
283 model.addItem("John", "2345");
284 model.addItem("Bob", "54321");
286 QDeclarativeContext *ctxt = canvas->rootContext();
287 ctxt->setContextProperty("testModel", &model);
288 ctxt->setContextProperty("testRightToLeft", QVariant(false));
289 ctxt->setContextProperty("testTopToBottom", QVariant(false));
291 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
292 qApp->processEvents();
294 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
295 QTRY_VERIFY(gridview != 0);
297 QDeclarativeItem *contentItem = gridview->contentItem();
298 QTRY_VERIFY(contentItem != 0);
300 model.insertItem(1, "Will", "9876");
301 QCOMPARE(canvas->rootObject()->property("count").toInt(), model.count());
303 QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
305 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", 1);
306 QTRY_VERIFY(name != 0);
307 QTRY_COMPARE(name->text(), model.name(1));
308 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", 1);
309 QTRY_VERIFY(number != 0);
310 QTRY_COMPARE(number->text(), model.number(1));
312 // Checks that onAdd is called
313 int added = canvas->rootObject()->property("added").toInt();
314 QTRY_COMPARE(added, 1);
316 // Confirm items positioned correctly
317 for (int i = 0; i < model.count(); ++i) {
318 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
319 QTRY_COMPARE(item->x(), (i%3)*80.0);
320 QTRY_COMPARE(item->y(), (i/3)*60.0);
323 model.insertItem(0, "Foo", "1111"); // zero index, and current item
325 QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
327 name = findItem<QDeclarative1Text>(contentItem, "textName", 0);
328 QTRY_VERIFY(name != 0);
329 QTRY_COMPARE(name->text(), model.name(0));
330 number = findItem<QDeclarative1Text>(contentItem, "textNumber", 0);
331 QTRY_VERIFY(number != 0);
332 QTRY_COMPARE(number->text(), model.number(0));
334 QTRY_COMPARE(gridview->currentIndex(), 1);
336 // Confirm items positioned correctly
337 for (int i = 0; i < model.count(); ++i) {
338 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
339 QTRY_VERIFY(item->x() == (i%3)*80);
340 QTRY_VERIFY(item->y() == (i/3)*60);
343 for (int i = model.count(); i < 30; ++i)
344 model.insertItem(i, "Hello", QString::number(i));
346 gridview->setContentY(120);
348 // Insert item outside visible area
349 model.insertItem(1, "Hello", "1324");
351 QTRY_VERIFY(gridview->contentY() == 120);
356 void tst_QDeclarative1GridView::removed()
358 QDeclarativeView *canvas = createView();
361 for (int i = 0; i < 40; i++)
362 model.addItem("Item" + QString::number(i), "");
364 QDeclarativeContext *ctxt = canvas->rootContext();
365 ctxt->setContextProperty("testModel", &model);
366 ctxt->setContextProperty("testRightToLeft", QVariant(false));
367 ctxt->setContextProperty("testTopToBottom", QVariant(false));
369 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
370 qApp->processEvents();
372 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
373 QTRY_VERIFY(gridview != 0);
375 QDeclarativeItem *contentItem = gridview->contentItem();
376 QTRY_VERIFY(contentItem != 0);
379 QCOMPARE(canvas->rootObject()->property("count").toInt(), model.count());
381 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", 1);
382 QTRY_VERIFY(name != 0);
383 QTRY_COMPARE(name->text(), model.name(1));
384 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", 1);
385 QTRY_VERIFY(number != 0);
386 QTRY_COMPARE(number->text(), model.number(1));
388 // Checks that onRemove is called
389 QString removed = canvas->rootObject()->property("removed").toString();
390 QTRY_COMPARE(removed, QString("Item1"));
392 // Confirm items positioned correctly
393 int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
394 for (int i = 0; i < model.count() && i < itemCount; ++i) {
395 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
396 if (!item) qWarning() << "Item" << i << "not found";
398 QTRY_VERIFY(item->x() == (i%3)*80);
399 QTRY_VERIFY(item->y() == (i/3)*60);
402 // Remove first item (which is the current item);
405 name = findItem<QDeclarative1Text>(contentItem, "textName", 0);
406 QTRY_VERIFY(name != 0);
407 QTRY_COMPARE(name->text(), model.name(0));
408 number = findItem<QDeclarative1Text>(contentItem, "textNumber", 0);
409 QTRY_VERIFY(number != 0);
410 QTRY_COMPARE(number->text(), model.number(0));
412 // Confirm items positioned correctly
413 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
414 for (int i = 0; i < model.count() && i < itemCount; ++i) {
415 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
416 if (!item) qWarning() << "Item" << i << "not found";
418 QTRY_VERIFY(item->x() == (i%3)*80);
419 QTRY_VERIFY(item->y() == (i/3)*60);
422 // Remove items not visible
423 model.removeItem(25);
425 // Confirm items positioned correctly
426 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
427 for (int i = 0; i < model.count() && i < itemCount; ++i) {
428 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
429 if (!item) qWarning() << "Item" << i << "not found";
431 QTRY_VERIFY(item->x() == (i%3)*80);
432 QTRY_VERIFY(item->y() == (i/3)*60);
435 // Remove items before visible
436 gridview->setContentY(120);
437 gridview->setCurrentIndex(10);
439 // Setting currentIndex above shouldn't cause view to scroll
440 QTRY_COMPARE(gridview->contentY(), 120.0);
444 // Confirm items positioned correctly
445 for (int i = 3; i < 15; ++i) {
446 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
447 if (!item) qWarning() << "Item" << i << "not found";
449 QTRY_COMPARE(item->x(), (i%3)*80.0);
450 QTRY_COMPARE(item->y(), 60+(i/3)*60.0);
453 // Remove currentIndex
454 QDeclarativeItem *oldCurrent = gridview->currentItem();
457 QTRY_COMPARE(gridview->currentIndex(), 9);
458 QTRY_VERIFY(gridview->currentItem() != oldCurrent);
460 gridview->setContentY(0);
461 // let transitions settle.
464 // Confirm items positioned correctly
465 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
466 for (int i = 0; i < model.count() && i < itemCount; ++i) {
467 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
468 if (!item) qWarning() << "Item" << i << "not found";
470 QTRY_VERIFY(item->x() == (i%3)*80);
471 QTRY_VERIFY(item->y() == 60+(i/3)*60);
474 // remove item outside current view.
475 gridview->setCurrentIndex(32);
476 gridview->setContentY(240);
478 model.removeItem(30);
479 QTRY_VERIFY(gridview->currentIndex() == 31);
481 // remove current item beyond visible items.
482 gridview->setCurrentIndex(20);
483 gridview->setContentY(0);
484 model.removeItem(20);
486 QTRY_COMPARE(gridview->currentIndex(), 20);
487 QTRY_VERIFY(gridview->currentItem() != 0);
489 // remove item before current, but visible
490 gridview->setCurrentIndex(8);
491 gridview->setContentY(240);
492 oldCurrent = gridview->currentItem();
495 QTRY_COMPARE(gridview->currentIndex(), 7);
496 QTRY_VERIFY(gridview->currentItem() == oldCurrent);
501 void tst_QDeclarative1GridView::clear()
503 QDeclarativeView *canvas = createView();
506 for (int i = 0; i < 30; i++)
507 model.addItem("Item" + QString::number(i), "");
509 QDeclarativeContext *ctxt = canvas->rootContext();
510 ctxt->setContextProperty("testModel", &model);
511 ctxt->setContextProperty("testRightToLeft", QVariant(false));
512 ctxt->setContextProperty("testTopToBottom", QVariant(false));
514 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
515 qApp->processEvents();
517 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
518 QVERIFY(gridview != 0);
520 QDeclarativeItem *contentItem = gridview->contentItem();
521 QVERIFY(contentItem != 0);
525 QVERIFY(gridview->count() == 0);
526 QVERIFY(gridview->currentItem() == 0);
527 QVERIFY(gridview->contentY() == 0);
528 QVERIFY(gridview->currentIndex() == -1);
530 // confirm sanity when adding an item to cleared list
531 model.addItem("New", "1");
532 QVERIFY(gridview->count() == 1);
533 QVERIFY(gridview->currentItem() != 0);
534 QVERIFY(gridview->currentIndex() == 0);
539 void tst_QDeclarative1GridView::moved()
541 QDeclarativeView *canvas = createView();
544 for (int i = 0; i < 30; i++)
545 model.addItem("Item" + QString::number(i), "");
547 QDeclarativeContext *ctxt = canvas->rootContext();
548 ctxt->setContextProperty("testModel", &model);
549 ctxt->setContextProperty("testRightToLeft", QVariant(false));
550 ctxt->setContextProperty("testTopToBottom", QVariant(false));
552 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
553 qApp->processEvents();
555 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
556 QTRY_VERIFY(gridview != 0);
558 QDeclarativeItem *contentItem = gridview->contentItem();
559 QTRY_VERIFY(contentItem != 0);
561 model.moveItem(1, 8);
563 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", 1);
564 QTRY_VERIFY(name != 0);
565 QTRY_COMPARE(name->text(), model.name(1));
566 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", 1);
567 QTRY_VERIFY(number != 0);
568 QTRY_COMPARE(number->text(), model.number(1));
570 name = findItem<QDeclarative1Text>(contentItem, "textName", 8);
571 QTRY_VERIFY(name != 0);
572 QTRY_COMPARE(name->text(), model.name(8));
573 number = findItem<QDeclarative1Text>(contentItem, "textNumber", 8);
574 QTRY_VERIFY(number != 0);
575 QTRY_COMPARE(number->text(), model.number(8));
577 // Confirm items positioned correctly
578 int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
579 for (int i = 0; i < model.count() && i < itemCount; ++i) {
580 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
581 if (!item) qWarning() << "Item" << i << "not found";
583 QTRY_VERIFY(item->x() == (i%3)*80);
584 QTRY_VERIFY(item->y() == (i/3)*60);
587 gridview->setContentY(120);
589 // move outside visible area
590 model.moveItem(1, 25);
592 // Confirm items positioned correctly and indexes correct
593 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count()-1;
594 for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
595 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
596 if (!item) qWarning() << "Item" << i << "not found";
598 QTRY_COMPARE(item->x(), qreal((i%3)*80));
599 QTRY_COMPARE(item->y(), qreal((i/3)*60));
600 name = findItem<QDeclarative1Text>(contentItem, "textName", i);
601 QTRY_VERIFY(name != 0);
602 QTRY_COMPARE(name->text(), model.name(i));
603 number = findItem<QDeclarative1Text>(contentItem, "textNumber", i);
604 QTRY_VERIFY(number != 0);
605 QTRY_COMPARE(number->text(), model.number(i));
608 // move from outside visible into visible
609 model.moveItem(28, 8);
611 // Confirm items positioned correctly and indexes correct
612 for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
613 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
614 if (!item) qWarning() << "Item" << i << "not found";
616 QTRY_VERIFY(item->x() == (i%3)*80);
617 QTRY_VERIFY(item->y() == (i/3)*60);
618 name = findItem<QDeclarative1Text>(contentItem, "textName", i);
619 QTRY_VERIFY(name != 0);
620 QTRY_COMPARE(name->text(), model.name(i));
621 number = findItem<QDeclarative1Text>(contentItem, "textNumber", i);
622 QTRY_VERIFY(number != 0);
623 QTRY_COMPARE(number->text(), model.number(i));
626 // ensure content position is stable
627 gridview->setContentY(0);
628 model.moveItem(10, 0);
629 QTRY_VERIFY(gridview->contentY() == 0);
634 void tst_QDeclarative1GridView::currentIndex()
637 for (int i = 0; i < 60; i++)
638 model.addItem("Item" + QString::number(i), QString::number(i));
640 QDeclarativeView *canvas = new QDeclarativeView(0);
641 canvas->setFixedSize(240,320);
643 QDeclarativeContext *ctxt = canvas->rootContext();
644 ctxt->setContextProperty("testModel", &model);
646 QString filename(SRCDIR "/data/gridview-initCurrent.qml");
647 canvas->setSource(QUrl::fromLocalFile(filename));
649 qApp->processEvents();
651 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
652 QVERIFY(gridview != 0);
654 QDeclarativeItem *contentItem = gridview->contentItem();
655 QVERIFY(contentItem != 0);
657 // current item should be third item
658 QCOMPARE(gridview->currentIndex(), 35);
659 QCOMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 35));
660 QCOMPARE(gridview->currentItem()->y(), gridview->highlightItem()->y());
661 QCOMPARE(gridview->contentY(), 400.0);
663 gridview->moveCurrentIndexRight();
664 QCOMPARE(gridview->currentIndex(), 36);
665 gridview->moveCurrentIndexDown();
666 QCOMPARE(gridview->currentIndex(), 39);
667 gridview->moveCurrentIndexUp();
668 QCOMPARE(gridview->currentIndex(), 36);
669 gridview->moveCurrentIndexLeft();
670 QCOMPARE(gridview->currentIndex(), 35);
673 gridview->setCurrentIndex(0);
674 QCOMPARE(gridview->currentIndex(), 0);
675 // confirm that the velocity is updated
676 QTRY_VERIFY(gridview->verticalVelocity() != 0.0);
678 gridview->moveCurrentIndexUp();
679 QCOMPARE(gridview->currentIndex(), 0);
681 gridview->moveCurrentIndexLeft();
682 QCOMPARE(gridview->currentIndex(), 0);
684 gridview->setCurrentIndex(model.count()-1);
685 QCOMPARE(gridview->currentIndex(), model.count()-1);
687 gridview->moveCurrentIndexRight();
688 QCOMPARE(gridview->currentIndex(), model.count()-1);
690 gridview->moveCurrentIndexDown();
691 QCOMPARE(gridview->currentIndex(), model.count()-1);
694 gridview->setWrapEnabled(true);
696 gridview->setCurrentIndex(0);
697 QCOMPARE(gridview->currentIndex(), 0);
699 gridview->moveCurrentIndexLeft();
700 QCOMPARE(gridview->currentIndex(), model.count()-1);
702 QTRY_COMPARE(gridview->contentY(), 880.0);
704 gridview->moveCurrentIndexRight();
705 QCOMPARE(gridview->currentIndex(), 0);
707 QTRY_COMPARE(gridview->contentY(), 0.0);
711 qApp->setActiveWindow(canvas);
713 // to be safe and avoid failing setFocus with window managers
714 qt_x11_wait_for_window_manager(canvas);
716 QTRY_VERIFY(canvas->hasFocus());
717 QTRY_VERIFY(canvas->scene()->hasFocus());
718 qApp->processEvents();
720 QTest::keyClick(canvas, Qt::Key_Down);
721 QCOMPARE(gridview->currentIndex(), 3);
723 QTest::keyClick(canvas, Qt::Key_Up);
724 QCOMPARE(gridview->currentIndex(), 0);
726 gridview->setFlow(QDeclarative1GridView::TopToBottom);
728 qApp->setActiveWindow(canvas);
730 // to be safe and avoid failing setFocus with window managers
731 qt_x11_wait_for_window_manager(canvas);
733 QTRY_VERIFY(canvas->hasFocus());
734 QTRY_VERIFY(canvas->scene()->hasFocus());
735 qApp->processEvents();
737 QTest::keyClick(canvas, Qt::Key_Right);
738 QCOMPARE(gridview->currentIndex(), 5);
740 QTest::keyClick(canvas, Qt::Key_Left);
741 QCOMPARE(gridview->currentIndex(), 0);
743 QTest::keyClick(canvas, Qt::Key_Down);
744 QCOMPARE(gridview->currentIndex(), 1);
746 QTest::keyClick(canvas, Qt::Key_Up);
747 QCOMPARE(gridview->currentIndex(), 0);
750 // turn off auto highlight
751 gridview->setHighlightFollowsCurrentItem(false);
752 QVERIFY(gridview->highlightFollowsCurrentItem() == false);
753 QVERIFY(gridview->highlightItem());
754 qreal hlPosX = gridview->highlightItem()->x();
755 qreal hlPosY = gridview->highlightItem()->y();
757 gridview->setCurrentIndex(5);
758 QTRY_COMPARE(gridview->highlightItem()->x(), hlPosX);
759 QTRY_COMPARE(gridview->highlightItem()->y(), hlPosY);
761 // insert item before currentIndex
762 gridview->setCurrentIndex(28);
763 model.insertItem(0, "Foo", "1111");
764 QTRY_COMPARE(canvas->rootObject()->property("current").toInt(), 29);
766 // check removing highlight by setting currentIndex to -1;
767 gridview->setCurrentIndex(-1);
769 QCOMPARE(gridview->currentIndex(), -1);
770 QVERIFY(!gridview->highlightItem());
771 QVERIFY(!gridview->currentItem());
773 gridview->setHighlightFollowsCurrentItem(true);
775 gridview->setFlow(QDeclarative1GridView::LeftToRight);
776 gridview->setLayoutDirection(Qt::RightToLeft);
778 qApp->setActiveWindow(canvas);
780 // to be safe and avoid failing setFocus with window managers
781 qt_x11_wait_for_window_manager(canvas);
783 QTRY_VERIFY(canvas->hasFocus());
784 QTRY_VERIFY(canvas->scene()->hasFocus());
785 qApp->processEvents();
787 gridview->setCurrentIndex(35);
789 QTest::keyClick(canvas, Qt::Key_Right);
790 QCOMPARE(gridview->currentIndex(), 34);
792 QTest::keyClick(canvas, Qt::Key_Down);
793 QCOMPARE(gridview->currentIndex(), 37);
795 QTest::keyClick(canvas, Qt::Key_Up);
796 QCOMPARE(gridview->currentIndex(), 34);
798 QTest::keyClick(canvas, Qt::Key_Left);
799 QCOMPARE(gridview->currentIndex(), 35);
802 // turn off auto highlight
803 gridview->setHighlightFollowsCurrentItem(false);
804 QVERIFY(gridview->highlightFollowsCurrentItem() == false);
805 QVERIFY(gridview->highlightItem());
806 hlPosX = gridview->highlightItem()->x();
807 hlPosY = gridview->highlightItem()->y();
809 gridview->setCurrentIndex(5);
810 QTRY_COMPARE(gridview->highlightItem()->x(), hlPosX);
811 QTRY_COMPARE(gridview->highlightItem()->y(), hlPosY);
813 // insert item before currentIndex
814 gridview->setCurrentIndex(28);
815 model.insertItem(0, "Foo", "1111");
816 QTRY_COMPARE(canvas->rootObject()->property("current").toInt(), 29);
818 // check removing highlight by setting currentIndex to -1;
819 gridview->setCurrentIndex(-1);
821 QCOMPARE(gridview->currentIndex(), -1);
822 QVERIFY(!gridview->highlightItem());
823 QVERIFY(!gridview->currentItem());
828 void tst_QDeclarative1GridView::noCurrentIndex()
831 for (int i = 0; i < 60; i++)
832 model.addItem("Item" + QString::number(i), QString::number(i));
834 QDeclarativeView *canvas = new QDeclarativeView(0);
835 canvas->setFixedSize(240,320);
837 QDeclarativeContext *ctxt = canvas->rootContext();
838 ctxt->setContextProperty("testModel", &model);
840 QString filename(SRCDIR "/data/gridview-noCurrent.qml");
841 canvas->setSource(QUrl::fromLocalFile(filename));
843 qApp->processEvents();
845 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
846 QVERIFY(gridview != 0);
848 QDeclarativeItem *contentItem = gridview->contentItem();
849 QVERIFY(contentItem != 0);
851 // current index should be -1
852 QCOMPARE(gridview->currentIndex(), -1);
853 QVERIFY(!gridview->currentItem());
854 QVERIFY(!gridview->highlightItem());
855 QCOMPARE(gridview->contentY(), 0.0);
857 gridview->setCurrentIndex(5);
858 QCOMPARE(gridview->currentIndex(), 5);
859 QVERIFY(gridview->currentItem());
860 QVERIFY(gridview->highlightItem());
865 void tst_QDeclarative1GridView::changeFlow()
867 QDeclarativeView *canvas = createView();
870 for (int i = 0; i < 30; i++)
871 model.addItem("Item" + QString::number(i), QString::number(i));
873 QDeclarativeContext *ctxt = canvas->rootContext();
874 ctxt->setContextProperty("testModel", &model);
875 ctxt->setContextProperty("testRightToLeft", QVariant(false));
876 ctxt->setContextProperty("testTopToBottom", QVariant(false));
878 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
879 qApp->processEvents();
881 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
882 QTRY_VERIFY(gridview != 0);
884 QDeclarativeItem *contentItem = gridview->contentItem();
885 QTRY_VERIFY(contentItem != 0);
887 // Confirm items positioned correctly and indexes correct
888 int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
889 for (int i = 0; i < model.count() && i < itemCount; ++i) {
890 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
891 if (!item) qWarning() << "Item" << i << "not found";
893 QTRY_COMPARE(item->x(), qreal((i%3)*80));
894 QTRY_COMPARE(item->y(), qreal((i/3)*60));
895 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", i);
896 QTRY_VERIFY(name != 0);
897 QTRY_COMPARE(name->text(), model.name(i));
898 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", i);
899 QTRY_VERIFY(number != 0);
900 QTRY_COMPARE(number->text(), model.number(i));
903 ctxt->setContextProperty("testTopToBottom", QVariant(true));
905 // Confirm items positioned correctly and indexes correct
906 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
907 for (int i = 0; i < model.count() && i < itemCount; ++i) {
908 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
909 if (!item) qWarning() << "Item" << i << "not found";
911 QTRY_COMPARE(item->x(), qreal((i/5)*80));
912 QTRY_COMPARE(item->y(), qreal((i%5)*60));
913 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", i);
914 QTRY_VERIFY(name != 0);
915 QTRY_COMPARE(name->text(), model.name(i));
916 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", i);
917 QTRY_VERIFY(number != 0);
918 QTRY_COMPARE(number->text(), model.number(i));
921 ctxt->setContextProperty("testRightToLeft", QVariant(true));
923 // Confirm items positioned correctly and indexes correct
924 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
925 for (int i = 0; i < model.count() && i < itemCount; ++i) {
926 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
927 if (!item) qWarning() << "Item" << i << "not found";
929 QTRY_COMPARE(item->x(), qreal(-(i/5)*80 - item->width()));
930 QTRY_COMPARE(item->y(), qreal((i%5)*60));
931 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", i);
932 QTRY_VERIFY(name != 0);
933 QTRY_COMPARE(name->text(), model.name(i));
934 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", i);
935 QTRY_VERIFY(number != 0);
936 QTRY_COMPARE(number->text(), model.number(i));
938 gridview->setContentX(100);
939 QTRY_COMPARE(gridview->contentX(), 100.);
940 ctxt->setContextProperty("testTopToBottom", QVariant(false));
941 QTRY_COMPARE(gridview->contentX(), 0.);
943 // Confirm items positioned correctly and indexes correct
944 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
945 for (int i = 0; i < model.count() && i < itemCount; ++i) {
946 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
947 if (!item) qWarning() << "Item" << i << "not found";
949 QTRY_COMPARE(item->x(), qreal(240 - (i%3+1)*80));
950 QTRY_COMPARE(item->y(), qreal((i/3)*60));
951 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", i);
952 QTRY_VERIFY(name != 0);
953 QTRY_COMPARE(name->text(), model.name(i));
954 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", i);
955 QTRY_VERIFY(number != 0);
956 QTRY_COMPARE(number->text(), model.number(i));
962 void tst_QDeclarative1GridView::defaultValues()
964 QDeclarativeEngine engine;
965 QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/gridview3.qml"));
966 QDeclarative1GridView *obj = qobject_cast<QDeclarative1GridView*>(c.create());
968 QTRY_VERIFY(obj != 0);
969 QTRY_VERIFY(obj->model() == QVariant());
970 QTRY_VERIFY(obj->delegate() == 0);
971 QTRY_COMPARE(obj->currentIndex(), -1);
972 QTRY_VERIFY(obj->currentItem() == 0);
973 QTRY_COMPARE(obj->count(), 0);
974 QTRY_VERIFY(obj->highlight() == 0);
975 QTRY_VERIFY(obj->highlightItem() == 0);
976 QTRY_COMPARE(obj->highlightFollowsCurrentItem(), true);
977 QTRY_VERIFY(obj->flow() == 0);
978 QTRY_COMPARE(obj->isWrapEnabled(), false);
979 QTRY_COMPARE(obj->cacheBuffer(), 0);
980 QTRY_COMPARE(obj->cellWidth(), 100); //### Should 100 be the default?
981 QTRY_COMPARE(obj->cellHeight(), 100);
985 void tst_QDeclarative1GridView::properties()
987 QDeclarativeEngine engine;
988 QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/gridview2.qml"));
989 QDeclarative1GridView *obj = qobject_cast<QDeclarative1GridView*>(c.create());
991 QTRY_VERIFY(obj != 0);
992 QTRY_VERIFY(obj->model() != QVariant());
993 QTRY_VERIFY(obj->delegate() != 0);
994 QTRY_COMPARE(obj->currentIndex(), 0);
995 QTRY_VERIFY(obj->currentItem() != 0);
996 QTRY_COMPARE(obj->count(), 4);
997 QTRY_VERIFY(obj->highlight() != 0);
998 QTRY_VERIFY(obj->highlightItem() != 0);
999 QTRY_COMPARE(obj->highlightFollowsCurrentItem(), false);
1000 QTRY_VERIFY(obj->flow() == 0);
1001 QTRY_COMPARE(obj->isWrapEnabled(), true);
1002 QTRY_COMPARE(obj->cacheBuffer(), 200);
1003 QTRY_COMPARE(obj->cellWidth(), 100);
1004 QTRY_COMPARE(obj->cellHeight(), 100);
1008 void tst_QDeclarative1GridView::propertyChanges()
1010 QDeclarativeView *canvas = createView();
1011 QTRY_VERIFY(canvas);
1012 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml"));
1014 QDeclarative1GridView *gridView = canvas->rootObject()->findChild<QDeclarative1GridView*>("gridView");
1015 QTRY_VERIFY(gridView);
1017 QSignalSpy keyNavigationWrapsSpy(gridView, SIGNAL(keyNavigationWrapsChanged()));
1018 QSignalSpy cacheBufferSpy(gridView, SIGNAL(cacheBufferChanged()));
1019 QSignalSpy layoutSpy(gridView, SIGNAL(layoutDirectionChanged()));
1020 QSignalSpy flowSpy(gridView, SIGNAL(flowChanged()));
1022 QTRY_COMPARE(gridView->isWrapEnabled(), true);
1023 QTRY_COMPARE(gridView->cacheBuffer(), 10);
1024 QTRY_COMPARE(gridView->flow(), QDeclarative1GridView::LeftToRight);
1026 gridView->setWrapEnabled(false);
1027 gridView->setCacheBuffer(3);
1028 gridView->setFlow(QDeclarative1GridView::TopToBottom);
1030 QTRY_COMPARE(gridView->isWrapEnabled(), false);
1031 QTRY_COMPARE(gridView->cacheBuffer(), 3);
1032 QTRY_COMPARE(gridView->flow(), QDeclarative1GridView::TopToBottom);
1034 QTRY_COMPARE(keyNavigationWrapsSpy.count(),1);
1035 QTRY_COMPARE(cacheBufferSpy.count(),1);
1036 QTRY_COMPARE(flowSpy.count(),1);
1038 gridView->setWrapEnabled(false);
1039 gridView->setCacheBuffer(3);
1040 gridView->setFlow(QDeclarative1GridView::TopToBottom);
1042 QTRY_COMPARE(keyNavigationWrapsSpy.count(),1);
1043 QTRY_COMPARE(cacheBufferSpy.count(),1);
1044 QTRY_COMPARE(flowSpy.count(),1);
1046 gridView->setFlow(QDeclarative1GridView::LeftToRight);
1047 QTRY_COMPARE(gridView->flow(), QDeclarative1GridView::LeftToRight);
1049 gridView->setWrapEnabled(true);
1050 gridView->setCacheBuffer(5);
1051 gridView->setLayoutDirection(Qt::RightToLeft);
1053 QTRY_COMPARE(gridView->isWrapEnabled(), true);
1054 QTRY_COMPARE(gridView->cacheBuffer(), 5);
1055 QTRY_COMPARE(gridView->layoutDirection(), Qt::RightToLeft);
1057 QTRY_COMPARE(keyNavigationWrapsSpy.count(),2);
1058 QTRY_COMPARE(cacheBufferSpy.count(),2);
1059 QTRY_COMPARE(layoutSpy.count(),1);
1060 QTRY_COMPARE(flowSpy.count(),2);
1062 gridView->setWrapEnabled(true);
1063 gridView->setCacheBuffer(5);
1064 gridView->setLayoutDirection(Qt::RightToLeft);
1066 QTRY_COMPARE(keyNavigationWrapsSpy.count(),2);
1067 QTRY_COMPARE(cacheBufferSpy.count(),2);
1068 QTRY_COMPARE(layoutSpy.count(),1);
1069 QTRY_COMPARE(flowSpy.count(),2);
1071 gridView->setFlow(QDeclarative1GridView::TopToBottom);
1072 QTRY_COMPARE(gridView->flow(), QDeclarative1GridView::TopToBottom);
1073 QTRY_COMPARE(flowSpy.count(),3);
1075 gridView->setFlow(QDeclarative1GridView::TopToBottom);
1076 QTRY_COMPARE(flowSpy.count(),3);
1081 void tst_QDeclarative1GridView::componentChanges()
1083 QDeclarativeView *canvas = createView();
1084 QTRY_VERIFY(canvas);
1085 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml"));
1087 QDeclarative1GridView *gridView = canvas->rootObject()->findChild<QDeclarative1GridView*>("gridView");
1088 QTRY_VERIFY(gridView);
1090 QDeclarativeComponent component(canvas->engine());
1091 component.setData("import QtQuick 1.0; Rectangle { color: \"blue\"; }", QUrl::fromLocalFile(""));
1093 QDeclarativeComponent delegateComponent(canvas->engine());
1094 delegateComponent.setData("import QtQuick 1.0; Text { text: '<b>Name:</b> ' + name }", QUrl::fromLocalFile(""));
1096 QSignalSpy highlightSpy(gridView, SIGNAL(highlightChanged()));
1097 QSignalSpy delegateSpy(gridView, SIGNAL(delegateChanged()));
1098 QSignalSpy headerSpy(gridView, SIGNAL(headerChanged()));
1099 QSignalSpy footerSpy(gridView, SIGNAL(footerChanged()));
1101 gridView->setHighlight(&component);
1102 gridView->setDelegate(&delegateComponent);
1103 gridView->setHeader(&component);
1104 gridView->setFooter(&component);
1106 QTRY_COMPARE(gridView->highlight(), &component);
1107 QTRY_COMPARE(gridView->delegate(), &delegateComponent);
1108 QTRY_COMPARE(gridView->header(), &component);
1109 QTRY_COMPARE(gridView->footer(), &component);
1111 QTRY_COMPARE(highlightSpy.count(),1);
1112 QTRY_COMPARE(delegateSpy.count(),1);
1113 QTRY_COMPARE(headerSpy.count(),1);
1114 QTRY_COMPARE(footerSpy.count(),1);
1116 gridView->setHighlight(&component);
1117 gridView->setDelegate(&delegateComponent);
1118 gridView->setHeader(&component);
1119 gridView->setFooter(&component);
1121 QTRY_COMPARE(highlightSpy.count(),1);
1122 QTRY_COMPARE(delegateSpy.count(),1);
1123 QTRY_COMPARE(headerSpy.count(),1);
1124 QTRY_COMPARE(footerSpy.count(),1);
1129 void tst_QDeclarative1GridView::modelChanges()
1131 QDeclarativeView *canvas = createView();
1132 QTRY_VERIFY(canvas);
1133 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml"));
1135 QDeclarative1GridView *gridView = canvas->rootObject()->findChild<QDeclarative1GridView*>("gridView");
1136 QTRY_VERIFY(gridView);
1138 QObject *alternateModel = canvas->rootObject()->findChild<QObject*>("alternateModel");
1139 QTRY_VERIFY(alternateModel);
1140 QVariant modelVariant = QVariant::fromValue(alternateModel);
1141 QSignalSpy modelSpy(gridView, SIGNAL(modelChanged()));
1143 gridView->setModel(modelVariant);
1144 QTRY_COMPARE(gridView->model(), modelVariant);
1145 QTRY_COMPARE(modelSpy.count(),1);
1147 gridView->setModel(modelVariant);
1148 QTRY_COMPARE(modelSpy.count(),1);
1150 gridView->setModel(QVariant());
1151 QTRY_COMPARE(modelSpy.count(),2);
1155 void tst_QDeclarative1GridView::positionViewAtIndex()
1157 QDeclarativeView *canvas = createView();
1160 for (int i = 0; i < 40; i++)
1161 model.addItem("Item" + QString::number(i), "");
1163 QDeclarativeContext *ctxt = canvas->rootContext();
1164 ctxt->setContextProperty("testModel", &model);
1165 ctxt->setContextProperty("testRightToLeft", QVariant(false));
1166 ctxt->setContextProperty("testTopToBottom", QVariant(false));
1168 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
1169 qApp->processEvents();
1171 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1172 QTRY_VERIFY(gridview != 0);
1174 QDeclarativeItem *contentItem = gridview->contentItem();
1175 QTRY_VERIFY(contentItem != 0);
1177 // Confirm items positioned correctly
1178 int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1179 for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
1180 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1181 if (!item) qWarning() << "Item" << i << "not found";
1183 QTRY_COMPARE(item->x(), (i%3)*80.);
1184 QTRY_COMPARE(item->y(), (i/3)*60.);
1187 // Position on a currently visible item
1188 gridview->positionViewAtIndex(4, QDeclarative1GridView::Beginning);
1189 QTRY_COMPARE(gridview->indexAt(120, 90), 4);
1190 QTRY_COMPARE(gridview->contentY(), 60.);
1192 // Confirm items positioned correctly
1193 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1194 for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) {
1195 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1196 if (!item) qWarning() << "Item" << i << "not found";
1198 QTRY_COMPARE(item->x(), (i%3)*80.);
1199 QTRY_COMPARE(item->y(), (i/3)*60.);
1202 // Position on an item beyond the visible items
1203 gridview->positionViewAtIndex(21, QDeclarative1GridView::Beginning);
1204 QTRY_COMPARE(gridview->indexAt(40, 450), 21);
1205 QTRY_COMPARE(gridview->contentY(), 420.);
1207 // Confirm items positioned correctly
1208 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1209 for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) {
1210 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1211 if (!item) qWarning() << "Item" << i << "not found";
1213 QTRY_COMPARE(item->x(), (i%3)*80.);
1214 QTRY_COMPARE(item->y(), (i/3)*60.);
1217 // Position on an item that would leave empty space if positioned at the top
1218 gridview->positionViewAtIndex(31, QDeclarative1GridView::Beginning);
1219 QTRY_COMPARE(gridview->indexAt(120, 630), 31);
1220 QTRY_COMPARE(gridview->contentY(), 520.);
1222 // Confirm items positioned correctly
1223 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1224 for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) {
1225 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1226 if (!item) qWarning() << "Item" << i << "not found";
1228 QTRY_COMPARE(item->x(), (i%3)*80.);
1229 QTRY_COMPARE(item->y(), (i/3)*60.);
1232 // Position at the beginning again
1233 gridview->positionViewAtIndex(0, QDeclarative1GridView::Beginning);
1234 QTRY_COMPARE(gridview->indexAt(0, 0), 0);
1235 QTRY_COMPARE(gridview->indexAt(40, 30), 0);
1236 QTRY_COMPARE(gridview->indexAt(80, 60), 4);
1237 QTRY_COMPARE(gridview->contentY(), 0.);
1239 // Confirm items positioned correctly
1240 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1241 for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
1242 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1243 if (!item) qWarning() << "Item" << i << "not found";
1245 QTRY_COMPARE(item->x(), (i%3)*80.);
1246 QTRY_COMPARE(item->y(), (i/3)*60.);
1250 gridview->positionViewAtIndex(30, QDeclarative1GridView::End);
1251 QTRY_COMPARE(gridview->contentY(), 340.);
1253 // Position in Center
1254 gridview->positionViewAtIndex(15, QDeclarative1GridView::Center);
1255 QTRY_COMPARE(gridview->contentY(), 170.);
1257 // Ensure at least partially visible
1258 gridview->positionViewAtIndex(15, QDeclarative1GridView::Visible);
1259 QTRY_COMPARE(gridview->contentY(), 170.);
1261 gridview->setContentY(302);
1262 gridview->positionViewAtIndex(15, QDeclarative1GridView::Visible);
1263 QTRY_COMPARE(gridview->contentY(), 302.);
1265 gridview->setContentY(360);
1266 gridview->positionViewAtIndex(15, QDeclarative1GridView::Visible);
1267 QTRY_COMPARE(gridview->contentY(), 300.);
1269 gridview->setContentY(60);
1270 gridview->positionViewAtIndex(20, QDeclarative1GridView::Visible);
1271 QTRY_COMPARE(gridview->contentY(), 60.);
1273 gridview->setContentY(20);
1274 gridview->positionViewAtIndex(20, QDeclarative1GridView::Visible);
1275 QTRY_COMPARE(gridview->contentY(), 100.);
1277 // Ensure completely visible
1278 gridview->setContentY(120);
1279 gridview->positionViewAtIndex(20, QDeclarative1GridView::Contain);
1280 QTRY_COMPARE(gridview->contentY(), 120.);
1282 gridview->setContentY(302);
1283 gridview->positionViewAtIndex(15, QDeclarative1GridView::Contain);
1284 QTRY_COMPARE(gridview->contentY(), 300.);
1286 gridview->setContentY(60);
1287 gridview->positionViewAtIndex(20, QDeclarative1GridView::Contain);
1288 QTRY_COMPARE(gridview->contentY(), 100.);
1290 // Test for Top To Bottom layout
1291 ctxt->setContextProperty("testTopToBottom", QVariant(true));
1293 // Confirm items positioned correctly
1294 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1295 for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
1296 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1297 if (!item) qWarning() << "Item" << i << "not found";
1299 QTRY_COMPARE(item->x(), (i/5)*80.);
1300 QTRY_COMPARE(item->y(), (i%5)*60.);
1304 gridview->positionViewAtIndex(30, QDeclarative1GridView::End);
1305 QTRY_COMPARE(gridview->contentX(), 320.);
1306 QTRY_COMPARE(gridview->contentY(), 0.);
1308 // Position in Center
1309 gridview->positionViewAtIndex(15, QDeclarative1GridView::Center);
1310 QTRY_COMPARE(gridview->contentX(), 160.);
1312 // Ensure at least partially visible
1313 gridview->positionViewAtIndex(15, QDeclarative1GridView::Visible);
1314 QTRY_COMPARE(gridview->contentX(), 160.);
1316 gridview->setContentX(170);
1317 gridview->positionViewAtIndex(25, QDeclarative1GridView::Visible);
1318 QTRY_COMPARE(gridview->contentX(), 170.);
1320 gridview->positionViewAtIndex(30, QDeclarative1GridView::Visible);
1321 QTRY_COMPARE(gridview->contentX(), 320.);
1323 gridview->setContentX(170);
1324 gridview->positionViewAtIndex(25, QDeclarative1GridView::Contain);
1325 QTRY_COMPARE(gridview->contentX(), 240.);
1327 // positionViewAtBeginning
1328 gridview->positionViewAtBeginning();
1329 QTRY_COMPARE(gridview->contentX(), 0.);
1331 gridview->setContentX(80);
1332 canvas->rootObject()->setProperty("showHeader", true);
1333 gridview->positionViewAtBeginning();
1334 QTRY_COMPARE(gridview->contentX(), -30.);
1336 // positionViewAtEnd
1337 gridview->positionViewAtEnd();
1338 QTRY_COMPARE(gridview->contentX(), 430.);
1340 gridview->setContentX(80);
1341 canvas->rootObject()->setProperty("showFooter", true);
1342 gridview->positionViewAtEnd();
1343 QTRY_COMPARE(gridview->contentX(), 460.);
1348 void tst_QDeclarative1GridView::snapping()
1350 QDeclarativeView *canvas = createView();
1353 for (int i = 0; i < 40; i++)
1354 model.addItem("Item" + QString::number(i), "");
1356 QDeclarativeContext *ctxt = canvas->rootContext();
1357 ctxt->setContextProperty("testModel", &model);
1358 ctxt->setContextProperty("testTopToBottom", QVariant(false));
1359 ctxt->setContextProperty("testRightToLeft", QVariant(false));
1361 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
1362 qApp->processEvents();
1364 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1365 QTRY_VERIFY(gridview != 0);
1367 gridview->setHeight(220);
1368 QCOMPARE(gridview->height(), 220.);
1370 gridview->positionViewAtIndex(12, QDeclarative1GridView::Visible);
1371 QCOMPARE(gridview->contentY(), 80.);
1373 gridview->setContentY(0);
1374 QCOMPARE(gridview->contentY(), 0.);
1376 gridview->setSnapMode(QDeclarative1GridView::SnapToRow);
1377 QCOMPARE(gridview->snapMode(), QDeclarative1GridView::SnapToRow);
1379 gridview->positionViewAtIndex(12, QDeclarative1GridView::Visible);
1380 QCOMPARE(gridview->contentY(), 60.);
1382 gridview->positionViewAtIndex(15, QDeclarative1GridView::End);
1383 QCOMPARE(gridview->contentY(), 120.);
1389 void tst_QDeclarative1GridView::mirroring()
1391 QDeclarativeView *canvasA = createView();
1392 canvasA->setSource(QUrl::fromLocalFile(SRCDIR "/data/mirroring.qml"));
1393 QDeclarative1GridView *gridviewA = findItem<QDeclarative1GridView>(canvasA->rootObject(), "view");
1394 QTRY_VERIFY(gridviewA != 0);
1396 QDeclarativeView *canvasB = createView();
1397 canvasB->setSource(QUrl::fromLocalFile(SRCDIR "/data/mirroring.qml"));
1398 QDeclarative1GridView *gridviewB = findItem<QDeclarative1GridView>(canvasB->rootObject(), "view");
1399 QTRY_VERIFY(gridviewA != 0);
1400 qApp->processEvents();
1402 QList<QString> objectNames;
1403 objectNames << "item1" << "item2"; // << "item3"
1405 gridviewA->setProperty("layoutDirection", Qt::LeftToRight);
1406 gridviewB->setProperty("layoutDirection", Qt::RightToLeft);
1407 QCOMPARE(gridviewA->layoutDirection(), gridviewA->effectiveLayoutDirection());
1410 foreach(const QString objectName, objectNames)
1411 QVERIFY(findItem<QDeclarativeItem>(gridviewA, objectName)->x() != findItem<QDeclarativeItem>(gridviewB, objectName)->x());
1413 gridviewA->setProperty("layoutDirection", Qt::LeftToRight);
1414 gridviewB->setProperty("layoutDirection", Qt::LeftToRight);
1417 foreach(const QString objectName, objectNames)
1418 QCOMPARE(findItem<QDeclarativeItem>(gridviewA, objectName)->x(), findItem<QDeclarativeItem>(gridviewB, objectName)->x());
1420 QVERIFY(gridviewB->layoutDirection() == gridviewB->effectiveLayoutDirection());
1421 QDeclarativeItemPrivate::get(gridviewB)->setLayoutMirror(true);
1422 QVERIFY(gridviewB->layoutDirection() != gridviewB->effectiveLayoutDirection());
1424 // LTR != LTR+mirror
1425 foreach(const QString objectName, objectNames)
1426 QVERIFY(findItem<QDeclarativeItem>(gridviewA, objectName)->x() != findItem<QDeclarativeItem>(gridviewB, objectName)->x());
1428 gridviewA->setProperty("layoutDirection", Qt::RightToLeft);
1430 // RTL == LTR+mirror
1431 foreach(const QString objectName, objectNames)
1432 QCOMPARE(findItem<QDeclarativeItem>(gridviewA, objectName)->x(), findItem<QDeclarativeItem>(gridviewB, objectName)->x());
1434 gridviewB->setProperty("layoutDirection", Qt::RightToLeft);
1436 // RTL != RTL+mirror
1437 foreach(const QString objectName, objectNames)
1438 QVERIFY(findItem<QDeclarativeItem>(gridviewA, objectName)->x() != findItem<QDeclarativeItem>(gridviewB, objectName)->x());
1440 gridviewA->setProperty("layoutDirection", Qt::LeftToRight);
1442 // LTR == RTL+mirror
1443 foreach(const QString objectName, objectNames)
1444 QCOMPARE(findItem<QDeclarativeItem>(gridviewA, objectName)->x(), findItem<QDeclarativeItem>(gridviewB, objectName)->x());
1450 void tst_QDeclarative1GridView::positionViewAtIndex_rightToLeft()
1452 QDeclarativeView *canvas = createView();
1455 for (int i = 0; i < 40; i++)
1456 model.addItem("Item" + QString::number(i), "");
1458 QDeclarativeContext *ctxt = canvas->rootContext();
1459 ctxt->setContextProperty("testModel", &model);
1460 ctxt->setContextProperty("testTopToBottom", QVariant(true));
1461 ctxt->setContextProperty("testRightToLeft", QVariant(true));
1463 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
1464 qApp->processEvents();
1466 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1467 QTRY_VERIFY(gridview != 0);
1469 QDeclarativeItem *contentItem = gridview->contentItem();
1470 QTRY_VERIFY(contentItem != 0);
1472 // Confirm items positioned correctly
1473 int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1474 for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
1475 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1476 if (!item) qWarning() << "Item" << i << "not found";
1478 QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
1479 QTRY_COMPARE(item->y(), qreal((i%5)*60));
1482 // Position on a currently visible item
1483 gridview->positionViewAtIndex(6, QDeclarative1GridView::Beginning);
1484 QTRY_COMPARE(gridview->contentX(), -320.);
1486 // Confirm items positioned correctly
1487 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1488 for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) {
1489 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1490 if (!item) qWarning() << "Item" << i << "not found";
1492 QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
1493 QTRY_COMPARE(item->y(), qreal((i%5)*60));
1496 // Position on an item beyond the visible items
1497 gridview->positionViewAtIndex(21, QDeclarative1GridView::Beginning);
1498 QTRY_COMPARE(gridview->contentX(), -560.);
1500 // Confirm items positioned correctly
1501 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1502 for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) {
1503 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1504 if (!item) qWarning() << "Item" << i << "not found";
1506 QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
1507 QTRY_COMPARE(item->y(), qreal((i%5)*60));
1510 // Position on an item that would leave empty space if positioned at the top
1511 gridview->positionViewAtIndex(31, QDeclarative1GridView::Beginning);
1512 QTRY_COMPARE(gridview->contentX(), -639.);
1514 // Confirm items positioned correctly
1515 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1516 for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) {
1517 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1518 if (!item) qWarning() << "Item" << i << "not found";
1520 QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
1521 QTRY_COMPARE(item->y(), qreal((i%5)*60));
1524 // Position at the beginning again
1525 gridview->positionViewAtIndex(0, QDeclarative1GridView::Beginning);
1526 QTRY_COMPARE(gridview->contentX(), -240.);
1528 // Confirm items positioned correctly
1529 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
1530 for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
1531 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
1532 if (!item) qWarning() << "Item" << i << "not found";
1534 QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width()));
1535 QTRY_COMPARE(item->y(), qreal((i%5)*60));
1539 gridview->positionViewAtIndex(30, QDeclarative1GridView::End);
1540 QTRY_COMPARE(gridview->contentX(), -560.);
1542 // Position in Center
1543 gridview->positionViewAtIndex(15, QDeclarative1GridView::Center);
1544 QTRY_COMPARE(gridview->contentX(), -400.);
1546 // Ensure at least partially visible
1547 gridview->positionViewAtIndex(15, QDeclarative1GridView::Visible);
1548 QTRY_COMPARE(gridview->contentX(), -400.);
1550 gridview->setContentX(-555.);
1551 gridview->positionViewAtIndex(15, QDeclarative1GridView::Visible);
1552 QTRY_COMPARE(gridview->contentX(), -555.);
1554 gridview->setContentX(-239);
1555 gridview->positionViewAtIndex(15, QDeclarative1GridView::Visible);
1556 QTRY_COMPARE(gridview->contentX(), -320.);
1558 gridview->setContentX(-239);
1559 gridview->positionViewAtIndex(20, QDeclarative1GridView::Visible);
1560 QTRY_COMPARE(gridview->contentX(), -400.);
1562 gridview->setContentX(-640);
1563 gridview->positionViewAtIndex(20, QDeclarative1GridView::Visible);
1564 QTRY_COMPARE(gridview->contentX(), -560.);
1566 // Ensure completely visible
1567 gridview->setContentX(-400);
1568 gridview->positionViewAtIndex(20, QDeclarative1GridView::Contain);
1569 QTRY_COMPARE(gridview->contentX(), -400.);
1571 gridview->setContentX(-315);
1572 gridview->positionViewAtIndex(15, QDeclarative1GridView::Contain);
1573 QTRY_COMPARE(gridview->contentX(), -320.);
1575 gridview->setContentX(-640);
1576 gridview->positionViewAtIndex(20, QDeclarative1GridView::Contain);
1577 QTRY_COMPARE(gridview->contentX(), -560.);
1582 void tst_QDeclarative1GridView::resetModel()
1584 QDeclarativeView *canvas = createView();
1586 QStringList strings;
1587 strings << "one" << "two" << "three";
1588 QStringListModel model(strings);
1590 QDeclarativeContext *ctxt = canvas->rootContext();
1591 ctxt->setContextProperty("testModel", &model);
1593 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaygrid.qml"));
1594 qApp->processEvents();
1596 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1597 QTRY_VERIFY(gridview != 0);
1599 QDeclarativeItem *contentItem = gridview->contentItem();
1600 QTRY_VERIFY(contentItem != 0);
1602 QTRY_COMPARE(gridview->count(), model.rowCount());
1604 for (int i = 0; i < model.rowCount(); ++i) {
1605 QDeclarative1Text *display = findItem<QDeclarative1Text>(contentItem, "displayText", i);
1606 QTRY_VERIFY(display != 0);
1607 QTRY_COMPARE(display->text(), strings.at(i));
1611 strings << "four" << "five" << "six" << "seven";
1612 model.setStringList(strings);
1614 QTRY_COMPARE(gridview->count(), model.rowCount());
1616 for (int i = 0; i < model.rowCount(); ++i) {
1617 QDeclarative1Text *display = findItem<QDeclarative1Text>(contentItem, "displayText", i);
1618 QTRY_VERIFY(display != 0);
1619 QTRY_COMPARE(display->text(), strings.at(i));
1625 void tst_QDeclarative1GridView::enforceRange()
1627 QDeclarativeView *canvas = createView();
1630 for (int i = 0; i < 30; i++)
1631 model.addItem("Item" + QString::number(i), "");
1633 QDeclarativeContext *ctxt = canvas->rootContext();
1634 ctxt->setContextProperty("testModel", &model);
1635 ctxt->setContextProperty("testRightToLeft", QVariant(false));
1636 ctxt->setContextProperty("testTopToBottom", QVariant(false));
1638 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview-enforcerange.qml"));
1639 qApp->processEvents();
1640 QVERIFY(canvas->rootObject() != 0);
1642 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1643 QTRY_VERIFY(gridview != 0);
1645 QTRY_COMPARE(gridview->preferredHighlightBegin(), 100.0);
1646 QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0);
1647 QTRY_COMPARE(gridview->highlightRangeMode(), QDeclarative1GridView::StrictlyEnforceRange);
1649 QDeclarativeItem *contentItem = gridview->contentItem();
1650 QTRY_VERIFY(contentItem != 0);
1652 // view should be positioned at the top of the range.
1653 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", 0);
1655 QTRY_COMPARE(gridview->contentY(), -100.0);
1657 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", 0);
1658 QTRY_VERIFY(name != 0);
1659 QTRY_COMPARE(name->text(), model.name(0));
1660 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", 0);
1661 QTRY_VERIFY(number != 0);
1662 QTRY_COMPARE(number->text(), model.number(0));
1664 // Check currentIndex is updated when contentItem moves
1665 gridview->setContentY(0);
1666 QTRY_COMPARE(gridview->currentIndex(), 2);
1668 gridview->setCurrentIndex(5);
1669 QTRY_COMPARE(gridview->contentY(), 100.);
1672 for (int i = 0; i < 5; i++)
1673 model2.addItem("Item" + QString::number(i), "");
1675 ctxt->setContextProperty("testModel", &model2);
1676 QCOMPARE(gridview->count(), 5);
1681 void tst_QDeclarative1GridView::enforceRange_rightToLeft()
1683 QDeclarativeView *canvas = createView();
1686 for (int i = 0; i < 30; i++)
1687 model.addItem("Item" + QString::number(i), "");
1689 QDeclarativeContext *ctxt = canvas->rootContext();
1690 ctxt->setContextProperty("testModel", &model);
1691 ctxt->setContextProperty("testRightToLeft", QVariant(true));
1692 ctxt->setContextProperty("testTopToBottom", QVariant(true));
1694 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview-enforcerange.qml"));
1695 qApp->processEvents();
1696 QVERIFY(canvas->rootObject() != 0);
1698 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1699 QTRY_VERIFY(gridview != 0);
1701 QTRY_COMPARE(gridview->preferredHighlightBegin(), 100.0);
1702 QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0);
1703 QTRY_COMPARE(gridview->highlightRangeMode(), QDeclarative1GridView::StrictlyEnforceRange);
1705 QDeclarativeItem *contentItem = gridview->contentItem();
1706 QTRY_VERIFY(contentItem != 0);
1708 // view should be positioned at the top of the range.
1709 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", 0);
1711 QTRY_COMPARE(gridview->contentX(), -100.);
1712 QTRY_COMPARE(gridview->contentY(), 0.0);
1714 QDeclarative1Text *name = findItem<QDeclarative1Text>(contentItem, "textName", 0);
1715 QTRY_VERIFY(name != 0);
1716 QTRY_COMPARE(name->text(), model.name(0));
1717 QDeclarative1Text *number = findItem<QDeclarative1Text>(contentItem, "textNumber", 0);
1718 QTRY_VERIFY(number != 0);
1719 QTRY_COMPARE(number->text(), model.number(0));
1721 // Check currentIndex is updated when contentItem moves
1722 gridview->setContentX(-200);
1723 QTRY_COMPARE(gridview->currentIndex(), 3);
1725 gridview->setCurrentIndex(7);
1726 QTRY_COMPARE(gridview->contentX(), -300.);
1727 QTRY_COMPARE(gridview->contentY(), 0.0);
1730 for (int i = 0; i < 5; i++)
1731 model2.addItem("Item" + QString::number(i), "");
1733 ctxt->setContextProperty("testModel", &model2);
1734 QCOMPARE(gridview->count(), 5);
1739 void tst_QDeclarative1GridView::QTBUG_8456()
1741 QDeclarativeView *canvas = createView();
1743 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/setindex.qml"));
1744 qApp->processEvents();
1746 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1747 QTRY_VERIFY(gridview != 0);
1749 QTRY_COMPARE(gridview->currentIndex(), 0);
1754 void tst_QDeclarative1GridView::manualHighlight()
1756 QDeclarativeView *canvas = createView();
1758 QString filename(SRCDIR "/data/manual-highlight.qml");
1759 canvas->setSource(QUrl::fromLocalFile(filename));
1761 qApp->processEvents();
1763 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1764 QTRY_VERIFY(gridview != 0);
1766 QDeclarativeItem *contentItem = gridview->contentItem();
1767 QTRY_VERIFY(contentItem != 0);
1769 QTRY_COMPARE(gridview->currentIndex(), 0);
1770 QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 0));
1771 QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
1772 QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
1774 gridview->setCurrentIndex(2);
1776 QTRY_COMPARE(gridview->currentIndex(), 2);
1777 QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 2));
1778 QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
1779 QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
1781 gridview->positionViewAtIndex(8, QDeclarative1GridView::Contain);
1783 QTRY_COMPARE(gridview->currentIndex(), 2);
1784 QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 2));
1785 QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
1786 QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
1788 gridview->setFlow(QDeclarative1GridView::TopToBottom);
1789 QTRY_COMPARE(gridview->flow(), QDeclarative1GridView::TopToBottom);
1791 gridview->setCurrentIndex(0);
1792 QTRY_COMPARE(gridview->currentIndex(), 0);
1793 QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 0));
1794 QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
1795 QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
1800 void tst_QDeclarative1GridView::footer()
1802 QDeclarativeView *canvas = createView();
1805 for (int i = 0; i < 7; i++)
1806 model.addItem("Item" + QString::number(i), "");
1808 QDeclarativeContext *ctxt = canvas->rootContext();
1809 ctxt->setContextProperty("testModel", &model);
1811 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/footer.qml"));
1812 qApp->processEvents();
1814 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1815 QTRY_VERIFY(gridview != 0);
1817 QDeclarativeItem *contentItem = gridview->contentItem();
1818 QTRY_VERIFY(contentItem != 0);
1820 QDeclarative1Text *footer = findItem<QDeclarative1Text>(contentItem, "footer");
1823 QCOMPARE(footer->y(), 180.0);
1824 QCOMPARE(footer->height(), 30.0);
1826 model.removeItem(2);
1827 QTRY_COMPARE(footer->y(), 120.0);
1830 QTRY_COMPARE(footer->y(), 0.0);
1832 for (int i = 0; i < 30; i++)
1833 model.addItem("Item" + QString::number(i), "");
1835 QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter");
1837 footer = findItem<QDeclarative1Text>(contentItem, "footer");
1839 footer = findItem<QDeclarative1Text>(contentItem, "footer2");
1842 QCOMPARE(footer->y(), 600.0);
1843 QCOMPARE(footer->height(), 20.0);
1844 QCOMPARE(gridview->contentY(), 0.0);
1849 void tst_QDeclarative1GridView::header()
1851 QDeclarativeView *canvas = createView();
1854 for (int i = 0; i < 30; i++)
1855 model.addItem("Item" + QString::number(i), "");
1857 QDeclarativeContext *ctxt = canvas->rootContext();
1858 ctxt->setContextProperty("testModel", &model);
1860 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml"));
1861 qApp->processEvents();
1863 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1864 QTRY_VERIFY(gridview != 0);
1866 QDeclarativeItem *contentItem = gridview->contentItem();
1867 QTRY_VERIFY(contentItem != 0);
1869 QDeclarative1Text *header = findItem<QDeclarative1Text>(contentItem, "header");
1872 QCOMPARE(header->y(), 0.0);
1873 QCOMPARE(header->height(), 30.0);
1874 QCOMPARE(gridview->contentY(), 0.0);
1876 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", 0);
1878 QCOMPARE(item->y(), 30.0);
1881 QTRY_COMPARE(header->y(), 0.0);
1883 for (int i = 0; i < 30; i++)
1884 model.addItem("Item" + QString::number(i), "");
1886 QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader");
1888 header = findItem<QDeclarative1Text>(contentItem, "header");
1890 header = findItem<QDeclarative1Text>(contentItem, "header2");
1893 QCOMPARE(header->y(), 10.0);
1894 QCOMPARE(header->height(), 20.0);
1895 QCOMPARE(gridview->contentY(), 10.0);
1900 void tst_QDeclarative1GridView::indexAt()
1902 QDeclarativeView *canvas = createView();
1905 model.addItem("Fred", "12345");
1906 model.addItem("John", "2345");
1907 model.addItem("Bob", "54321");
1908 model.addItem("Billy", "22345");
1909 model.addItem("Sam", "2945");
1910 model.addItem("Ben", "04321");
1911 model.addItem("Jim", "0780");
1913 QDeclarativeContext *ctxt = canvas->rootContext();
1914 ctxt->setContextProperty("testModel", &model);
1915 ctxt->setContextProperty("testRightToLeft", QVariant(false));
1916 ctxt->setContextProperty("testTopToBottom", QVariant(false));
1918 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
1919 qApp->processEvents();
1921 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
1922 QTRY_VERIFY(gridview != 0);
1924 QDeclarativeItem *contentItem = gridview->contentItem();
1925 QTRY_VERIFY(contentItem != 0);
1927 QTRY_COMPARE(gridview->count(), model.count());
1929 QCOMPARE(gridview->indexAt(0, 0), 0);
1930 QCOMPARE(gridview->indexAt(79, 59), 0);
1931 QCOMPARE(gridview->indexAt(80, 0), 1);
1932 QCOMPARE(gridview->indexAt(0, 60), 3);
1933 QCOMPARE(gridview->indexAt(240, 0), -1);
1938 void tst_QDeclarative1GridView::onAdd()
1940 QFETCH(int, initialItemCount);
1941 QFETCH(int, itemsToAdd);
1943 const int delegateWidth = 50;
1944 const int delegateHeight = 100;
1946 QDeclarativeView *canvas = createView();
1947 canvas->setFixedSize(5 * delegateWidth, 5 * delegateHeight); // just ensure all items fit
1949 // these initial items should not trigger GridView.onAdd
1950 for (int i=0; i<initialItemCount; i++)
1951 model.addItem("dummy value", "dummy value");
1953 QDeclarativeContext *ctxt = canvas->rootContext();
1954 ctxt->setContextProperty("testModel", &model);
1955 ctxt->setContextProperty("delegateWidth", delegateWidth);
1956 ctxt->setContextProperty("delegateHeight", delegateHeight);
1957 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
1959 QObject *object = canvas->rootObject();
1960 object->setProperty("width", canvas->width());
1961 object->setProperty("height", canvas->height());
1962 qApp->processEvents();
1964 QList<QPair<QString, QString> > items;
1965 for (int i=0; i<itemsToAdd; i++)
1966 items << qMakePair(QString("value %1").arg(i), QString::number(i));
1967 model.addItems(items);
1969 qApp->processEvents();
1971 QVariantList result = object->property("addedDelegates").toList();
1972 QCOMPARE(result.count(), items.count());
1973 for (int i=0; i<items.count(); i++)
1974 QCOMPARE(result[i].toString(), items[i].first);
1979 void tst_QDeclarative1GridView::onAdd_data()
1981 QTest::addColumn<int>("initialItemCount");
1982 QTest::addColumn<int>("itemsToAdd");
1984 QTest::newRow("0, add 1") << 0 << 1;
1985 QTest::newRow("0, add 2") << 0 << 2;
1986 QTest::newRow("0, add 10") << 0 << 10;
1988 QTest::newRow("1, add 1") << 1 << 1;
1989 QTest::newRow("1, add 2") << 1 << 2;
1990 QTest::newRow("1, add 10") << 1 << 10;
1992 QTest::newRow("5, add 1") << 5 << 1;
1993 QTest::newRow("5, add 2") << 5 << 2;
1994 QTest::newRow("5, add 10") << 5 << 10;
1997 void tst_QDeclarative1GridView::onRemove()
1999 QFETCH(int, initialItemCount);
2000 QFETCH(int, indexToRemove);
2001 QFETCH(int, removeCount);
2003 const int delegateWidth = 50;
2004 const int delegateHeight = 100;
2006 for (int i=0; i<initialItemCount; i++)
2007 model.addItem(QString("value %1").arg(i), "dummy value");
2009 QDeclarativeView *canvas = createView();
2010 QDeclarativeContext *ctxt = canvas->rootContext();
2011 ctxt->setContextProperty("testModel", &model);
2012 ctxt->setContextProperty("delegateWidth", delegateWidth);
2013 ctxt->setContextProperty("delegateHeight", delegateHeight);
2014 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
2015 QObject *object = canvas->rootObject();
2017 qApp->processEvents();
2019 model.removeItems(indexToRemove, removeCount);
2020 qApp->processEvents();
2021 QCOMPARE(object->property("removedDelegateCount"), QVariant(removeCount));
2026 void tst_QDeclarative1GridView::onRemove_data()
2028 QTest::addColumn<int>("initialItemCount");
2029 QTest::addColumn<int>("indexToRemove");
2030 QTest::addColumn<int>("removeCount");
2032 QTest::newRow("remove first") << 1 << 0 << 1;
2033 QTest::newRow("two items, remove first") << 2 << 0 << 1;
2034 QTest::newRow("two items, remove last") << 2 << 1 << 1;
2035 QTest::newRow("two items, remove all") << 2 << 0 << 2;
2037 QTest::newRow("four items, remove first") << 4 << 0 << 1;
2038 QTest::newRow("four items, remove 0-2") << 4 << 0 << 2;
2039 QTest::newRow("four items, remove 1-3") << 4 << 1 << 2;
2040 QTest::newRow("four items, remove 2-4") << 4 << 2 << 2;
2041 QTest::newRow("four items, remove last") << 4 << 3 << 1;
2042 QTest::newRow("four items, remove all") << 4 << 0 << 4;
2044 QTest::newRow("ten items, remove 1-8") << 10 << 0 << 8;
2045 QTest::newRow("ten items, remove 2-7") << 10 << 2 << 5;
2046 QTest::newRow("ten items, remove 4-10") << 10 << 4 << 6;
2049 void tst_QDeclarative1GridView::testQtQuick11Attributes()
2051 QFETCH(QString, code);
2052 QFETCH(QString, warning);
2053 QFETCH(QString, error);
2055 QDeclarativeEngine engine;
2058 QDeclarativeComponent valid(&engine);
2059 valid.setData("import QtQuick 1.1; GridView { " + code.toUtf8() + " }", QUrl(""));
2060 obj = valid.create();
2062 QVERIFY(valid.errorString().isEmpty());
2065 QDeclarativeComponent invalid(&engine);
2066 invalid.setData("import QtQuick 1.0; GridView { " + code.toUtf8() + " }", QUrl(""));
2067 QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
2068 obj = invalid.create();
2069 QCOMPARE(invalid.errorString(), error);
2073 void tst_QDeclarative1GridView::testQtQuick11Attributes_data()
2075 QTest::addColumn<QString>("code");
2076 QTest::addColumn<QString>("warning");
2077 QTest::addColumn<QString>("error");
2079 QTest::newRow("positionViewAtBeginning") << "Component.onCompleted: positionViewAtBeginning()"
2080 << "<Unknown File>:1: ReferenceError: Can't find variable: positionViewAtBeginning"
2083 QTest::newRow("positionViewAtEnd") << "Component.onCompleted: positionViewAtEnd()"
2084 << "<Unknown File>:1: ReferenceError: Can't find variable: positionViewAtEnd"
2088 void tst_QDeclarative1GridView::contentPosJump()
2090 QDeclarativeView *canvas = createView();
2093 for (int i = 0; i < 100; i++)
2094 model.addItem("Item" + QString::number(i), "");
2096 QDeclarativeContext *ctxt = canvas->rootContext();
2097 ctxt->setContextProperty("testModel", &model);
2098 ctxt->setContextProperty("testRightToLeft", QVariant(false));
2099 ctxt->setContextProperty("testTopToBottom", QVariant(false));
2101 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
2102 qApp->processEvents();
2104 QDeclarative1GridView *gridview = findItem<QDeclarative1GridView>(canvas->rootObject(), "grid");
2105 QVERIFY(gridview != 0);
2107 QDeclarativeItem *contentItem = gridview->contentItem();
2108 QVERIFY(contentItem != 0);
2110 // Test jumping more than a page of items.
2111 gridview->setContentY(500);
2113 // Confirm items positioned correctly
2114 int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
2115 for (int i = 24; i < model.count() && i < itemCount; ++i) {
2116 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
2117 if (!item) qWarning() << "Item" << i << "not found";
2119 QVERIFY(item->x() == (i%3)*80);
2120 QVERIFY(item->y() == (i/3)*60);
2123 gridview->setContentY(-100);
2124 itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
2125 QVERIFY(itemCount < 15);
2126 // Confirm items positioned correctly
2127 for (int i = 0; i < model.count() && i < itemCount; ++i) {
2128 QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
2129 if (!item) qWarning() << "Item" << i << "not found";
2131 QVERIFY(item->x() == (i%3)*80);
2132 QVERIFY(item->y() == (i/3)*60);
2138 QDeclarativeView *tst_QDeclarative1GridView::createView()
2140 QDeclarativeView *canvas = new QDeclarativeView(0);
2141 canvas->setFixedSize(240,320);
2147 Find an item with the specified objectName. If index is supplied then the
2148 item must also evaluate the {index} expression equal to index
2150 template<typename T>
2151 T *tst_QDeclarative1GridView::findItem(QGraphicsObject *parent, const QString &objectName, int index)
2153 const QMetaObject &mo = T::staticMetaObject;
2154 //qDebug() << parent->childItems().count() << "children";
2155 for (int i = 0; i < parent->childItems().count(); ++i) {
2156 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(parent->childItems().at(i));
2159 //qDebug() << "try" << item;
2160 if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
2162 QDeclarativeContext *context = QDeclarativeEngine::contextForObject(item);
2164 if (context->contextProperty("index").toInt() == index) {
2165 return static_cast<T*>(item);
2169 return static_cast<T*>(item);
2172 item = findItem<T>(item, objectName, index);
2174 return static_cast<T*>(item);
2180 template<typename T>
2181 QList<T*> tst_QDeclarative1GridView::findItems(QGraphicsObject *parent, const QString &objectName)
2184 const QMetaObject &mo = T::staticMetaObject;
2185 //qDebug() << parent->childItems().count() << "children";
2186 for (int i = 0; i < parent->childItems().count(); ++i) {
2187 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(parent->childItems().at(i));
2190 //qDebug() << "try" << item;
2191 if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
2192 items.append(static_cast<T*>(item));
2193 //qDebug() << " found:" << item;
2195 items += findItems<T>(item, objectName);
2201 void tst_QDeclarative1GridView::dumpTree(QDeclarativeItem *parent, int depth)
2203 static QString padding(" ");
2204 for (int i = 0; i < parent->childItems().count(); ++i) {
2205 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(parent->childItems().at(i));
2208 QDeclarativeContext *context = QDeclarativeEngine::contextForObject(item);
2209 qDebug() << padding.left(depth*2) << item << (context ? context->contextProperty("index").toInt() : -1);
2210 dumpTree(item, depth+1);
2215 QTEST_MAIN(tst_QDeclarative1GridView)
2217 #include "tst_qdeclarativegridview.moc"