tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
changeset 33 3e2da88830cd
parent 30 5dc02b23752f
child 37 758a864f9613
equal deleted inserted replaced
30:5dc02b23752f 33:3e2da88830cd
    49 #include <QtDeclarative/private/qlistmodelinterface_p.h>
    49 #include <QtDeclarative/private/qlistmodelinterface_p.h>
    50 #include <QtDeclarative/private/qdeclarativegridview_p.h>
    50 #include <QtDeclarative/private/qdeclarativegridview_p.h>
    51 #include <QtDeclarative/private/qdeclarativetext_p.h>
    51 #include <QtDeclarative/private/qdeclarativetext_p.h>
    52 #include <QtDeclarative/private/qdeclarativelistmodel_p.h>
    52 #include <QtDeclarative/private/qdeclarativelistmodel_p.h>
    53 #include "../../../shared/util.h"
    53 #include "../../../shared/util.h"
       
    54 
       
    55 #ifdef Q_OS_SYMBIAN
       
    56 // In Symbian OS test data is located in applications private dir
       
    57 #define SRCDIR "."
       
    58 #endif
    54 
    59 
    55 class tst_QDeclarativeGridView : public QObject
    60 class tst_QDeclarativeGridView : public QObject
    56 {
    61 {
    57     Q_OBJECT
    62     Q_OBJECT
    58 public:
    63 public:
    74     void positionViewAtIndex();
    79     void positionViewAtIndex();
    75     void resetModel();
    80     void resetModel();
    76     void enforceRange();
    81     void enforceRange();
    77     void QTBUG_8456();
    82     void QTBUG_8456();
    78     void manualHighlight();
    83     void manualHighlight();
       
    84     void footer();
    79 
    85 
    80 private:
    86 private:
    81     QDeclarativeView *createView();
    87     QDeclarativeView *createView();
    82     template<typename T>
    88     template<typename T>
    83     T *findItem(QGraphicsObject *parent, const QString &id, int index=-1);
    89     T *findItem(QGraphicsObject *parent, const QString &id, int index=-1);
   140     void modifyItem(int idx, const QString &name, const QString &number) {
   146     void modifyItem(int idx, const QString &name, const QString &number) {
   141         list[idx] = QPair<QString,QString>(name, number);
   147         list[idx] = QPair<QString,QString>(name, number);
   142         emit dataChanged(index(idx,0), index(idx,0));
   148         emit dataChanged(index(idx,0), index(idx,0));
   143     }
   149     }
   144 
   150 
       
   151     void clear() {
       
   152         int count = list.count();
       
   153         emit beginRemoveRows(QModelIndex(), 0, count-1);
       
   154         list.clear();
       
   155         emit endRemoveRows();
       
   156     }
       
   157 
       
   158 
   145 private:
   159 private:
   146     QList<QPair<QString,QString> > list;
   160     QList<QPair<QString,QString> > list;
   147 };
   161 };
   148 
   162 
   149 tst_QDeclarativeGridView::tst_QDeclarativeGridView()
   163 tst_QDeclarativeGridView::tst_QDeclarativeGridView()
   171     qApp->processEvents();
   185     qApp->processEvents();
   172 
   186 
   173     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   187     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   174     QTRY_VERIFY(gridview != 0);
   188     QTRY_VERIFY(gridview != 0);
   175 
   189 
   176     QDeclarativeItem *viewport = gridview->viewport();
   190     QDeclarativeItem *contentItem = gridview->contentItem();
   177     QTRY_VERIFY(viewport != 0);
   191     QTRY_VERIFY(contentItem != 0);
   178 
   192 
   179     QTRY_COMPARE(gridview->count(), model.count());
   193     QTRY_COMPARE(gridview->count(), model.count());
   180     QTRY_COMPARE(viewport->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
   194     QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
   181 
   195 
   182     for (int i = 0; i < model.count(); ++i) {
   196     for (int i = 0; i < model.count(); ++i) {
   183         QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", i);
   197         QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", i);
   184         QTRY_VERIFY(name != 0);
   198         QTRY_VERIFY(name != 0);
   185         QTRY_COMPARE(name->text(), model.name(i));
   199         QTRY_COMPARE(name->text(), model.name(i));
   186         QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", i);
   200         QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
   187         QTRY_VERIFY(number != 0);
   201         QTRY_VERIFY(number != 0);
   188         QTRY_COMPARE(number->text(), model.number(i));
   202         QTRY_COMPARE(number->text(), model.number(i));
   189     }
   203     }
   190 
   204 
   191     // set an empty model and confirm that items are destroyed
   205     // set an empty model and confirm that items are destroyed
   192     TestModel model2;
   206     TestModel model2;
   193     ctxt->setContextProperty("testModel", &model2);
   207     ctxt->setContextProperty("testModel", &model2);
   194 
   208 
   195     int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   209     int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   196     QTRY_VERIFY(itemCount == 0);
   210     QTRY_VERIFY(itemCount == 0);
   197 
   211 
   198     delete canvas;
   212     delete canvas;
   199 }
   213 }
   200 
   214 
   219     qApp->processEvents();
   233     qApp->processEvents();
   220 
   234 
   221     QDeclarativeFlickable *gridview = findItem<QDeclarativeFlickable>(canvas->rootObject(), "grid");
   235     QDeclarativeFlickable *gridview = findItem<QDeclarativeFlickable>(canvas->rootObject(), "grid");
   222     QTRY_VERIFY(gridview != 0);
   236     QTRY_VERIFY(gridview != 0);
   223 
   237 
   224     QDeclarativeItem *viewport = gridview->viewport();
   238     QDeclarativeItem *contentItem = gridview->contentItem();
   225     QTRY_VERIFY(viewport != 0);
   239     QTRY_VERIFY(contentItem != 0);
   226 
   240 
   227     model.modifyItem(1, "Will", "9876");
   241     model.modifyItem(1, "Will", "9876");
   228     QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 1);
   242     QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 1);
   229     QTRY_VERIFY(name != 0);
   243     QTRY_VERIFY(name != 0);
   230     QTRY_COMPARE(name->text(), model.name(1));
   244     QTRY_COMPARE(name->text(), model.name(1));
   231     QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 1);
   245     QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 1);
   232     QTRY_VERIFY(number != 0);
   246     QTRY_VERIFY(number != 0);
   233     QTRY_COMPARE(number->text(), model.number(1));
   247     QTRY_COMPARE(number->text(), model.number(1));
   234 
   248 
   235     delete canvas;
   249     delete canvas;
   236 }
   250 }
   252     qApp->processEvents();
   266     qApp->processEvents();
   253 
   267 
   254     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   268     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   255     QTRY_VERIFY(gridview != 0);
   269     QTRY_VERIFY(gridview != 0);
   256 
   270 
   257     QDeclarativeItem *viewport = gridview->viewport();
   271     QDeclarativeItem *contentItem = gridview->contentItem();
   258     QTRY_VERIFY(viewport != 0);
   272     QTRY_VERIFY(contentItem != 0);
   259 
   273 
   260     model.insertItem(1, "Will", "9876");
   274     model.insertItem(1, "Will", "9876");
   261 
   275 
   262     QTRY_COMPARE(viewport->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
   276     QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
   263 
   277 
   264     QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 1);
   278     QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 1);
   265     QTRY_VERIFY(name != 0);
   279     QTRY_VERIFY(name != 0);
   266     QTRY_COMPARE(name->text(), model.name(1));
   280     QTRY_COMPARE(name->text(), model.name(1));
   267     QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 1);
   281     QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 1);
   268     QTRY_VERIFY(number != 0);
   282     QTRY_VERIFY(number != 0);
   269     QTRY_COMPARE(number->text(), model.number(1));
   283     QTRY_COMPARE(number->text(), model.number(1));
   270 
   284 
   271     // Checks that onAdd is called
   285     // Checks that onAdd is called
   272     int added = canvas->rootObject()->property("added").toInt();
   286     int added = canvas->rootObject()->property("added").toInt();
   273     QTRY_COMPARE(added, 1);
   287     QTRY_COMPARE(added, 1);
   274 
   288 
   275     // Confirm items positioned correctly
   289     // Confirm items positioned correctly
   276     for (int i = 0; i < model.count(); ++i) {
   290     for (int i = 0; i < model.count(); ++i) {
   277         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   291         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   278         QTRY_COMPARE(item->x(), (i%3)*80.0);
   292         QTRY_COMPARE(item->x(), (i%3)*80.0);
   279         QTRY_COMPARE(item->y(), (i/3)*60.0);
   293         QTRY_COMPARE(item->y(), (i/3)*60.0);
   280     }
   294     }
   281 
   295 
   282     model.insertItem(0, "Foo", "1111"); // zero index, and current item
   296     model.insertItem(0, "Foo", "1111"); // zero index, and current item
   283 
   297 
   284     QTRY_COMPARE(viewport->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
   298     QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
   285 
   299 
   286     name = findItem<QDeclarativeText>(viewport, "textName", 0);
   300     name = findItem<QDeclarativeText>(contentItem, "textName", 0);
   287     QTRY_VERIFY(name != 0);
   301     QTRY_VERIFY(name != 0);
   288     QTRY_COMPARE(name->text(), model.name(0));
   302     QTRY_COMPARE(name->text(), model.name(0));
   289     number = findItem<QDeclarativeText>(viewport, "textNumber", 0);
   303     number = findItem<QDeclarativeText>(contentItem, "textNumber", 0);
   290     QTRY_VERIFY(number != 0);
   304     QTRY_VERIFY(number != 0);
   291     QTRY_COMPARE(number->text(), model.number(0));
   305     QTRY_COMPARE(number->text(), model.number(0));
   292 
   306 
   293     QTRY_COMPARE(gridview->currentIndex(), 1);
   307     QTRY_COMPARE(gridview->currentIndex(), 1);
   294 
   308 
   295     // Confirm items positioned correctly
   309     // Confirm items positioned correctly
   296     for (int i = 0; i < model.count(); ++i) {
   310     for (int i = 0; i < model.count(); ++i) {
   297         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   311         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   298         QTRY_VERIFY(item->x() == (i%3)*80);
   312         QTRY_VERIFY(item->x() == (i%3)*80);
   299         QTRY_VERIFY(item->y() == (i/3)*60);
   313         QTRY_VERIFY(item->y() == (i/3)*60);
   300     }
   314     }
   301 
   315 
   302     for (int i = model.count(); i < 30; ++i)
   316     for (int i = model.count(); i < 30; ++i)
   328     qApp->processEvents();
   342     qApp->processEvents();
   329 
   343 
   330     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   344     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   331     QTRY_VERIFY(gridview != 0);
   345     QTRY_VERIFY(gridview != 0);
   332 
   346 
   333     QDeclarativeItem *viewport = gridview->viewport();
   347     QDeclarativeItem *contentItem = gridview->contentItem();
   334     QTRY_VERIFY(viewport != 0);
   348     QTRY_VERIFY(contentItem != 0);
   335 
   349 
   336     model.removeItem(1);
   350     model.removeItem(1);
   337 
   351 
   338     QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 1);
   352     QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 1);
   339     QTRY_VERIFY(name != 0);
   353     QTRY_VERIFY(name != 0);
   340     QTRY_COMPARE(name->text(), model.name(1));
   354     QTRY_COMPARE(name->text(), model.name(1));
   341     QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 1);
   355     QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 1);
   342     QTRY_VERIFY(number != 0);
   356     QTRY_VERIFY(number != 0);
   343     QTRY_COMPARE(number->text(), model.number(1));
   357     QTRY_COMPARE(number->text(), model.number(1));
   344 
   358 
   345     // Checks that onRemove is called
   359     // Checks that onRemove is called
   346     QString removed = canvas->rootObject()->property("removed").toString();
   360     QString removed = canvas->rootObject()->property("removed").toString();
   347     QTRY_COMPARE(removed, QString("Item1"));
   361     QTRY_COMPARE(removed, QString("Item1"));
   348 
   362 
   349     // Confirm items positioned correctly
   363     // Confirm items positioned correctly
   350     int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   364     int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   351     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   365     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   352         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   366         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   353         if (!item) qWarning() << "Item" << i << "not found";
   367         if (!item) qWarning() << "Item" << i << "not found";
   354         QTRY_VERIFY(item);
   368         QTRY_VERIFY(item);
   355         QTRY_VERIFY(item->x() == (i%3)*80);
   369         QTRY_VERIFY(item->x() == (i%3)*80);
   356         QTRY_VERIFY(item->y() == (i/3)*60);
   370         QTRY_VERIFY(item->y() == (i/3)*60);
   357     }
   371     }
   358 
   372 
   359     // Remove first item (which is the current item);
   373     // Remove first item (which is the current item);
   360     model.removeItem(0);
   374     model.removeItem(0);
   361 
   375 
   362     name = findItem<QDeclarativeText>(viewport, "textName", 0);
   376     name = findItem<QDeclarativeText>(contentItem, "textName", 0);
   363     QTRY_VERIFY(name != 0);
   377     QTRY_VERIFY(name != 0);
   364     QTRY_COMPARE(name->text(), model.name(0));
   378     QTRY_COMPARE(name->text(), model.name(0));
   365     number = findItem<QDeclarativeText>(viewport, "textNumber", 0);
   379     number = findItem<QDeclarativeText>(contentItem, "textNumber", 0);
   366     QTRY_VERIFY(number != 0);
   380     QTRY_VERIFY(number != 0);
   367     QTRY_COMPARE(number->text(), model.number(0));
   381     QTRY_COMPARE(number->text(), model.number(0));
   368 
   382 
   369     // Confirm items positioned correctly
   383     // Confirm items positioned correctly
   370     itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   384     itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   371     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   385     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   372         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   386         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   373         if (!item) qWarning() << "Item" << i << "not found";
   387         if (!item) qWarning() << "Item" << i << "not found";
   374         QTRY_VERIFY(item);
   388         QTRY_VERIFY(item);
   375         QTRY_VERIFY(item->x() == (i%3)*80);
   389         QTRY_VERIFY(item->x() == (i%3)*80);
   376         QTRY_VERIFY(item->y() == (i/3)*60);
   390         QTRY_VERIFY(item->y() == (i/3)*60);
   377     }
   391     }
   378 
   392 
   379     // Remove items not visible
   393     // Remove items not visible
   380     model.removeItem(25);
   394     model.removeItem(25);
   381 
   395 
   382     // Confirm items positioned correctly
   396     // Confirm items positioned correctly
   383     itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   397     itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   384     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   398     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   385         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   399         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   386         if (!item) qWarning() << "Item" << i << "not found";
   400         if (!item) qWarning() << "Item" << i << "not found";
   387         QTRY_VERIFY(item);
   401         QTRY_VERIFY(item);
   388         QTRY_VERIFY(item->x() == (i%3)*80);
   402         QTRY_VERIFY(item->x() == (i%3)*80);
   389         QTRY_VERIFY(item->y() == (i/3)*60);
   403         QTRY_VERIFY(item->y() == (i/3)*60);
   390     }
   404     }
   398 
   412 
   399     model.removeItem(1);
   413     model.removeItem(1);
   400 
   414 
   401     // Confirm items positioned correctly
   415     // Confirm items positioned correctly
   402     for (int i = 6; i < 18; ++i) {
   416     for (int i = 6; i < 18; ++i) {
   403         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   417         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   404         if (!item) qWarning() << "Item" << i << "not found";
   418         if (!item) qWarning() << "Item" << i << "not found";
   405         QTRY_VERIFY(item);
   419         QTRY_VERIFY(item);
   406         QTRY_VERIFY(item->x() == (i%3)*80);
   420         QTRY_VERIFY(item->x() == (i%3)*80);
   407         QTRY_VERIFY(item->y() == (i/3)*60);
   421         QTRY_VERIFY(item->y() == (i/3)*60);
   408     }
   422     }
   417     gridview->setContentY(0);
   431     gridview->setContentY(0);
   418     // let transitions settle.
   432     // let transitions settle.
   419     QTest::qWait(100);
   433     QTest::qWait(100);
   420 
   434 
   421     // Confirm items positioned correctly
   435     // Confirm items positioned correctly
   422     itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   436     itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   423     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   437     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   424         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   438         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   425         if (!item) qWarning() << "Item" << i << "not found";
   439         if (!item) qWarning() << "Item" << i << "not found";
   426         QTRY_VERIFY(item);
   440         QTRY_VERIFY(item);
   427         QTRY_VERIFY(item->x() == (i%3)*80);
   441         QTRY_VERIFY(item->x() == (i%3)*80);
   428         QTRY_VERIFY(item->y() == (i/3)*60);
   442         QTRY_VERIFY(item->y() == (i/3)*60);
   429     }
   443     }
   471     qApp->processEvents();
   485     qApp->processEvents();
   472 
   486 
   473     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   487     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   474     QTRY_VERIFY(gridview != 0);
   488     QTRY_VERIFY(gridview != 0);
   475 
   489 
   476     QDeclarativeItem *viewport = gridview->viewport();
   490     QDeclarativeItem *contentItem = gridview->contentItem();
   477     QTRY_VERIFY(viewport != 0);
   491     QTRY_VERIFY(contentItem != 0);
   478 
   492 
   479     model.moveItem(1, 8);
   493     model.moveItem(1, 8);
   480 
   494 
   481     QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 1);
   495     QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 1);
   482     QTRY_VERIFY(name != 0);
   496     QTRY_VERIFY(name != 0);
   483     QTRY_COMPARE(name->text(), model.name(1));
   497     QTRY_COMPARE(name->text(), model.name(1));
   484     QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 1);
   498     QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 1);
   485     QTRY_VERIFY(number != 0);
   499     QTRY_VERIFY(number != 0);
   486     QTRY_COMPARE(number->text(), model.number(1));
   500     QTRY_COMPARE(number->text(), model.number(1));
   487 
   501 
   488     name = findItem<QDeclarativeText>(viewport, "textName", 8);
   502     name = findItem<QDeclarativeText>(contentItem, "textName", 8);
   489     QTRY_VERIFY(name != 0);
   503     QTRY_VERIFY(name != 0);
   490     QTRY_COMPARE(name->text(), model.name(8));
   504     QTRY_COMPARE(name->text(), model.name(8));
   491     number = findItem<QDeclarativeText>(viewport, "textNumber", 8);
   505     number = findItem<QDeclarativeText>(contentItem, "textNumber", 8);
   492     QTRY_VERIFY(number != 0);
   506     QTRY_VERIFY(number != 0);
   493     QTRY_COMPARE(number->text(), model.number(8));
   507     QTRY_COMPARE(number->text(), model.number(8));
   494 
   508 
   495     // Confirm items positioned correctly
   509     // Confirm items positioned correctly
   496     int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   510     int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   497     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   511     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   498         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   512         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   499         if (!item) qWarning() << "Item" << i << "not found";
   513         if (!item) qWarning() << "Item" << i << "not found";
   500         QTRY_VERIFY(item);
   514         QTRY_VERIFY(item);
   501         QTRY_VERIFY(item->x() == (i%3)*80);
   515         QTRY_VERIFY(item->x() == (i%3)*80);
   502         QTRY_VERIFY(item->y() == (i/3)*60);
   516         QTRY_VERIFY(item->y() == (i/3)*60);
   503     }
   517     }
   506 
   520 
   507     // move outside visible area
   521     // move outside visible area
   508     model.moveItem(1, 25);
   522     model.moveItem(1, 25);
   509 
   523 
   510     // Confirm items positioned correctly and indexes correct
   524     // Confirm items positioned correctly and indexes correct
   511     itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count()-1;
   525     itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count()-1;
   512     for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
   526     for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
   513         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   527         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   514         if (!item) qWarning() << "Item" << i << "not found";
   528         if (!item) qWarning() << "Item" << i << "not found";
   515         QTRY_VERIFY(item);
   529         QTRY_VERIFY(item);
   516         QTRY_COMPARE(item->x(), qreal((i%3)*80));
   530         QTRY_COMPARE(item->x(), qreal((i%3)*80));
   517         QTRY_COMPARE(item->y(), qreal((i/3)*60));
   531         QTRY_COMPARE(item->y(), qreal((i/3)*60));
   518         name = findItem<QDeclarativeText>(viewport, "textName", i);
   532         name = findItem<QDeclarativeText>(contentItem, "textName", i);
   519         QTRY_VERIFY(name != 0);
   533         QTRY_VERIFY(name != 0);
   520         QTRY_COMPARE(name->text(), model.name(i));
   534         QTRY_COMPARE(name->text(), model.name(i));
   521         number = findItem<QDeclarativeText>(viewport, "textNumber", i);
   535         number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
   522         QTRY_VERIFY(number != 0);
   536         QTRY_VERIFY(number != 0);
   523         QTRY_COMPARE(number->text(), model.number(i));
   537         QTRY_COMPARE(number->text(), model.number(i));
   524     }
   538     }
   525 
   539 
   526     // move from outside visible into visible
   540     // move from outside visible into visible
   527     model.moveItem(28, 8);
   541     model.moveItem(28, 8);
   528 
   542 
   529     // Confirm items positioned correctly and indexes correct
   543     // Confirm items positioned correctly and indexes correct
   530     for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
   544     for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
   531         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   545         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   532         if (!item) qWarning() << "Item" << i << "not found";
   546         if (!item) qWarning() << "Item" << i << "not found";
   533         QTRY_VERIFY(item);
   547         QTRY_VERIFY(item);
   534         QTRY_VERIFY(item->x() == (i%3)*80);
   548         QTRY_VERIFY(item->x() == (i%3)*80);
   535         QTRY_VERIFY(item->y() == (i/3)*60);
   549         QTRY_VERIFY(item->y() == (i/3)*60);
   536         name = findItem<QDeclarativeText>(viewport, "textName", i);
   550         name = findItem<QDeclarativeText>(contentItem, "textName", i);
   537         QTRY_VERIFY(name != 0);
   551         QTRY_VERIFY(name != 0);
   538         QTRY_COMPARE(name->text(), model.name(i));
   552         QTRY_COMPARE(name->text(), model.name(i));
   539         number = findItem<QDeclarativeText>(viewport, "textNumber", i);
   553         number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
   540         QTRY_VERIFY(number != 0);
   554         QTRY_VERIFY(number != 0);
   541         QTRY_COMPARE(number->text(), model.number(i));
   555         QTRY_COMPARE(number->text(), model.number(i));
   542     }
   556     }
   543 
   557 
   544     // ensure content position is stable
   558     // ensure content position is stable
   550 }
   564 }
   551 
   565 
   552 void tst_QDeclarativeGridView::currentIndex()
   566 void tst_QDeclarativeGridView::currentIndex()
   553 {
   567 {
   554     TestModel model;
   568     TestModel model;
   555     for (int i = 0; i < 30; i++)
   569     for (int i = 0; i < 60; i++)
   556         model.addItem("Item" + QString::number(i), QString::number(i));
   570         model.addItem("Item" + QString::number(i), QString::number(i));
   557 
   571 
   558     QDeclarativeView *canvas = new QDeclarativeView(0);
   572     QDeclarativeView *canvas = new QDeclarativeView(0);
   559     canvas->setFixedSize(240,320);
   573     canvas->setFixedSize(240,320);
   560 
   574 
   565     canvas->setSource(QUrl::fromLocalFile(filename));
   579     canvas->setSource(QUrl::fromLocalFile(filename));
   566 
   580 
   567     qApp->processEvents();
   581     qApp->processEvents();
   568 
   582 
   569     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   583     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   570     QTRY_VERIFY(gridview != 0);
   584     QVERIFY(gridview != 0);
   571 
   585 
   572     QDeclarativeItem *viewport = gridview->viewport();
   586     QDeclarativeItem *contentItem = gridview->contentItem();
   573     QTRY_VERIFY(viewport != 0);
   587     QVERIFY(contentItem != 0);
   574 
   588 
   575     // current item should be third item
   589     // current item should be third item
   576     QTRY_COMPARE(gridview->currentIndex(), 5);
   590     QCOMPARE(gridview->currentIndex(), 35);
   577     QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(viewport, "wrapper", 5));
   591     QCOMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 35));
   578     QTRY_COMPARE(gridview->currentItem()->y(), gridview->highlightItem()->y());
   592     QCOMPARE(gridview->currentItem()->y(), gridview->highlightItem()->y());
       
   593     QCOMPARE(gridview->contentY(), 399.0);
   579 
   594 
   580     gridview->moveCurrentIndexRight();
   595     gridview->moveCurrentIndexRight();
   581     QTRY_COMPARE(gridview->currentIndex(), 6);
   596     QCOMPARE(gridview->currentIndex(), 36);
   582     gridview->moveCurrentIndexDown();
   597     gridview->moveCurrentIndexDown();
   583     QTRY_COMPARE(gridview->currentIndex(), 9);
   598     QCOMPARE(gridview->currentIndex(), 39);
   584     gridview->moveCurrentIndexUp();
   599     gridview->moveCurrentIndexUp();
   585     QTRY_COMPARE(gridview->currentIndex(), 6);
   600     QCOMPARE(gridview->currentIndex(), 36);
   586     gridview->moveCurrentIndexLeft();
   601     gridview->moveCurrentIndexLeft();
   587     QTRY_COMPARE(gridview->currentIndex(), 5);
   602     QCOMPARE(gridview->currentIndex(), 35);
   588 
   603 
   589     // no wrap
   604     // no wrap
   590     gridview->setCurrentIndex(0);
   605     gridview->setCurrentIndex(0);
   591     QTRY_COMPARE(gridview->currentIndex(), 0);
   606     QCOMPARE(gridview->currentIndex(), 0);
   592 
   607 
   593     gridview->moveCurrentIndexUp();
   608     gridview->moveCurrentIndexUp();
   594     QTRY_COMPARE(gridview->currentIndex(), 0);
   609     QCOMPARE(gridview->currentIndex(), 0);
   595 
   610 
   596     gridview->moveCurrentIndexLeft();
   611     gridview->moveCurrentIndexLeft();
   597     QTRY_COMPARE(gridview->currentIndex(), 0);
   612     QCOMPARE(gridview->currentIndex(), 0);
   598 
   613 
   599     gridview->setCurrentIndex(model.count()-1);
   614     gridview->setCurrentIndex(model.count()-1);
   600     QTRY_COMPARE(gridview->currentIndex(), model.count()-1);
   615     QCOMPARE(gridview->currentIndex(), model.count()-1);
   601 
   616 
   602     gridview->moveCurrentIndexRight();
   617     gridview->moveCurrentIndexRight();
   603     QTRY_COMPARE(gridview->currentIndex(), model.count()-1);
   618     QCOMPARE(gridview->currentIndex(), model.count()-1);
   604 
   619 
   605     gridview->moveCurrentIndexDown();
   620     gridview->moveCurrentIndexDown();
   606     QTRY_COMPARE(gridview->currentIndex(), model.count()-1);
   621     QCOMPARE(gridview->currentIndex(), model.count()-1);
   607 
   622 
   608     // with wrap
   623     // with wrap
   609     gridview->setWrapEnabled(true);
   624     gridview->setWrapEnabled(true);
   610 
   625 
   611     gridview->setCurrentIndex(0);
   626     gridview->setCurrentIndex(0);
   612     QTRY_COMPARE(gridview->currentIndex(), 0);
   627     QCOMPARE(gridview->currentIndex(), 0);
   613 
   628 
   614     gridview->moveCurrentIndexLeft();
   629     gridview->moveCurrentIndexLeft();
   615     QTRY_COMPARE(gridview->currentIndex(), model.count()-1);
   630     QCOMPARE(gridview->currentIndex(), model.count()-1);
   616 
   631 
   617     QTRY_COMPARE(gridview->contentY(), 279.0);
   632     QTRY_COMPARE(gridview->contentY(), 879.0);
   618 
   633 
   619     gridview->moveCurrentIndexRight();
   634     gridview->moveCurrentIndexRight();
   620     QTRY_COMPARE(gridview->currentIndex(), 0);
   635     QCOMPARE(gridview->currentIndex(), 0);
   621 
   636 
   622     QTRY_COMPARE(gridview->contentY(), 0.0);
   637     QTRY_COMPARE(gridview->contentY(), 0.0);
   623 
   638 
   624     // Test keys
   639     // Test keys
   625     canvas->show();
   640     canvas->show();
   631     QTRY_VERIFY(canvas->hasFocus());
   646     QTRY_VERIFY(canvas->hasFocus());
   632     QTRY_VERIFY(canvas->scene()->hasFocus());
   647     QTRY_VERIFY(canvas->scene()->hasFocus());
   633     qApp->processEvents();
   648     qApp->processEvents();
   634 
   649 
   635     QTest::keyClick(canvas, Qt::Key_Down);
   650     QTest::keyClick(canvas, Qt::Key_Down);
   636     QTRY_COMPARE(gridview->currentIndex(), 3);
   651     QCOMPARE(gridview->currentIndex(), 3);
   637 
   652 
   638     QTest::keyClick(canvas, Qt::Key_Up);
   653     QTest::keyClick(canvas, Qt::Key_Up);
   639     QTRY_COMPARE(gridview->currentIndex(), 0);
   654     QCOMPARE(gridview->currentIndex(), 0);
   640 
   655 
   641     gridview->setFlow(QDeclarativeGridView::TopToBottom);
   656     gridview->setFlow(QDeclarativeGridView::TopToBottom);
   642 
   657 
   643     QTest::keyClick(canvas, Qt::Key_Right);
   658     QTest::keyClick(canvas, Qt::Key_Right);
   644     QTRY_COMPARE(gridview->currentIndex(), 5);
   659     QCOMPARE(gridview->currentIndex(), 5);
   645 
   660 
   646     QTest::keyClick(canvas, Qt::Key_Left);
   661     QTest::keyClick(canvas, Qt::Key_Left);
   647     QTRY_COMPARE(gridview->currentIndex(), 0);
   662     QCOMPARE(gridview->currentIndex(), 0);
   648 
   663 
   649     QTest::keyClick(canvas, Qt::Key_Down);
   664     QTest::keyClick(canvas, Qt::Key_Down);
   650     QTRY_COMPARE(gridview->currentIndex(), 1);
   665     QCOMPARE(gridview->currentIndex(), 1);
   651 
   666 
   652     QTest::keyClick(canvas, Qt::Key_Up);
   667     QTest::keyClick(canvas, Qt::Key_Up);
   653     QTRY_COMPARE(gridview->currentIndex(), 0);
   668     QCOMPARE(gridview->currentIndex(), 0);
   654 
   669 
   655 
   670 
   656     // turn off auto highlight
   671     // turn off auto highlight
   657     gridview->setHighlightFollowsCurrentItem(false);
   672     gridview->setHighlightFollowsCurrentItem(false);
   658     QTRY_VERIFY(gridview->highlightFollowsCurrentItem() == false);
   673     QVERIFY(gridview->highlightFollowsCurrentItem() == false);
   659     QTRY_VERIFY(gridview->highlightItem());
   674     QVERIFY(gridview->highlightItem());
   660     qreal hlPosX = gridview->highlightItem()->x();
   675     qreal hlPosX = gridview->highlightItem()->x();
   661     qreal hlPosY = gridview->highlightItem()->y();
   676     qreal hlPosY = gridview->highlightItem()->y();
   662 
   677 
   663     gridview->setCurrentIndex(5);
   678     gridview->setCurrentIndex(5);
   664     QTRY_COMPARE(gridview->highlightItem()->x(), hlPosX);
   679     QTRY_COMPARE(gridview->highlightItem()->x(), hlPosX);
   688     qApp->processEvents();
   703     qApp->processEvents();
   689 
   704 
   690     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   705     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   691     QTRY_VERIFY(gridview != 0);
   706     QTRY_VERIFY(gridview != 0);
   692 
   707 
   693     QDeclarativeItem *viewport = gridview->viewport();
   708     QDeclarativeItem *contentItem = gridview->contentItem();
   694     QTRY_VERIFY(viewport != 0);
   709     QTRY_VERIFY(contentItem != 0);
   695 
   710 
   696     // Confirm items positioned correctly and indexes correct
   711     // Confirm items positioned correctly and indexes correct
   697     int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   712     int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   698     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   713     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   699         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   714         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   700         if (!item) qWarning() << "Item" << i << "not found";
   715         if (!item) qWarning() << "Item" << i << "not found";
   701         QTRY_VERIFY(item);
   716         QTRY_VERIFY(item);
   702         QTRY_COMPARE(item->x(), qreal((i%3)*80));
   717         QTRY_COMPARE(item->x(), qreal((i%3)*80));
   703         QTRY_COMPARE(item->y(), qreal((i/3)*60));
   718         QTRY_COMPARE(item->y(), qreal((i/3)*60));
   704         QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", i);
   719         QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", i);
   705         QTRY_VERIFY(name != 0);
   720         QTRY_VERIFY(name != 0);
   706         QTRY_COMPARE(name->text(), model.name(i));
   721         QTRY_COMPARE(name->text(), model.name(i));
   707         QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", i);
   722         QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
   708         QTRY_VERIFY(number != 0);
   723         QTRY_VERIFY(number != 0);
   709         QTRY_COMPARE(number->text(), model.number(i));
   724         QTRY_COMPARE(number->text(), model.number(i));
   710     }
   725     }
   711 
   726 
   712     ctxt->setContextProperty("testTopToBottom", QVariant(true));
   727     ctxt->setContextProperty("testTopToBottom", QVariant(true));
   713 
   728 
   714     // Confirm items positioned correctly and indexes correct
   729     // Confirm items positioned correctly and indexes correct
   715     itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   730     itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   716     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   731     for (int i = 0; i < model.count() && i < itemCount; ++i) {
   717         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   732         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   718         if (!item) qWarning() << "Item" << i << "not found";
   733         if (!item) qWarning() << "Item" << i << "not found";
   719         QTRY_VERIFY(item);
   734         QTRY_VERIFY(item);
   720         QTRY_COMPARE(item->x(), qreal((i/5)*80));
   735         QTRY_COMPARE(item->x(), qreal((i/5)*80));
   721         QTRY_COMPARE(item->y(), qreal((i%5)*60));
   736         QTRY_COMPARE(item->y(), qreal((i%5)*60));
   722         QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", i);
   737         QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", i);
   723         QTRY_VERIFY(name != 0);
   738         QTRY_VERIFY(name != 0);
   724         QTRY_COMPARE(name->text(), model.name(i));
   739         QTRY_COMPARE(name->text(), model.name(i));
   725         QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", i);
   740         QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
   726         QTRY_VERIFY(number != 0);
   741         QTRY_VERIFY(number != 0);
   727         QTRY_COMPARE(number->text(), model.number(i));
   742         QTRY_COMPARE(number->text(), model.number(i));
   728     }
   743     }
   729 
   744 
   730     delete canvas;
   745     delete canvas;
   831     QDeclarativeComponent delegateComponent(canvas->engine());
   846     QDeclarativeComponent delegateComponent(canvas->engine());
   832     delegateComponent.setData("import Qt 4.7; Text { text: '<b>Name:</b> ' + name }", QUrl::fromLocalFile(""));
   847     delegateComponent.setData("import Qt 4.7; Text { text: '<b>Name:</b> ' + name }", QUrl::fromLocalFile(""));
   833 
   848 
   834     QSignalSpy highlightSpy(gridView, SIGNAL(highlightChanged()));
   849     QSignalSpy highlightSpy(gridView, SIGNAL(highlightChanged()));
   835     QSignalSpy delegateSpy(gridView, SIGNAL(delegateChanged()));
   850     QSignalSpy delegateSpy(gridView, SIGNAL(delegateChanged()));
       
   851     QSignalSpy headerSpy(gridView, SIGNAL(headerChanged()));
       
   852     QSignalSpy footerSpy(gridView, SIGNAL(footerChanged()));
   836 
   853 
   837     gridView->setHighlight(&component);
   854     gridView->setHighlight(&component);
   838     gridView->setDelegate(&delegateComponent);
   855     gridView->setDelegate(&delegateComponent);
       
   856     gridView->setHeader(&component);
       
   857     gridView->setFooter(&component);
   839 
   858 
   840     QTRY_COMPARE(gridView->highlight(), &component);
   859     QTRY_COMPARE(gridView->highlight(), &component);
   841     QTRY_COMPARE(gridView->delegate(), &delegateComponent);
   860     QTRY_COMPARE(gridView->delegate(), &delegateComponent);
       
   861     QTRY_COMPARE(gridView->header(), &component);
       
   862     QTRY_COMPARE(gridView->footer(), &component);
   842 
   863 
   843     QTRY_COMPARE(highlightSpy.count(),1);
   864     QTRY_COMPARE(highlightSpy.count(),1);
   844     QTRY_COMPARE(delegateSpy.count(),1);
   865     QTRY_COMPARE(delegateSpy.count(),1);
       
   866     QTRY_COMPARE(headerSpy.count(),1);
       
   867     QTRY_COMPARE(footerSpy.count(),1);
   845 
   868 
   846     gridView->setHighlight(&component);
   869     gridView->setHighlight(&component);
   847     gridView->setDelegate(&delegateComponent);
   870     gridView->setDelegate(&delegateComponent);
       
   871     gridView->setHeader(&component);
       
   872     gridView->setFooter(&component);
   848 
   873 
   849     QTRY_COMPARE(highlightSpy.count(),1);
   874     QTRY_COMPARE(highlightSpy.count(),1);
   850     QTRY_COMPARE(delegateSpy.count(),1);
   875     QTRY_COMPARE(delegateSpy.count(),1);
       
   876     QTRY_COMPARE(headerSpy.count(),1);
       
   877     QTRY_COMPARE(footerSpy.count(),1);
       
   878 
   851     delete canvas;
   879     delete canvas;
   852 }
   880 }
   853 
   881 
   854 void tst_QDeclarativeGridView::modelChanges()
   882 void tst_QDeclarativeGridView::modelChanges()
   855 {
   883 {
   893     qApp->processEvents();
   921     qApp->processEvents();
   894 
   922 
   895     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   923     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
   896     QTRY_VERIFY(gridview != 0);
   924     QTRY_VERIFY(gridview != 0);
   897 
   925 
   898     QDeclarativeItem *viewport = gridview->viewport();
   926     QDeclarativeItem *contentItem = gridview->contentItem();
   899     QTRY_VERIFY(viewport != 0);
   927     QTRY_VERIFY(contentItem != 0);
   900 
   928 
   901     // Confirm items positioned correctly
   929     // Confirm items positioned correctly
   902     int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   930     int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   903     for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
   931     for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
   904         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   932         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   905         if (!item) qWarning() << "Item" << i << "not found";
   933         if (!item) qWarning() << "Item" << i << "not found";
   906         QTRY_VERIFY(item);
   934         QTRY_VERIFY(item);
   907         QTRY_COMPARE(item->x(), (i%3)*80.);
   935         QTRY_COMPARE(item->x(), (i%3)*80.);
   908         QTRY_COMPARE(item->y(), (i/3)*60.);
   936         QTRY_COMPARE(item->y(), (i/3)*60.);
   909     }
   937     }
   911     // Position on a currently visible item
   939     // Position on a currently visible item
   912     gridview->positionViewAtIndex(4, QDeclarativeGridView::Beginning);
   940     gridview->positionViewAtIndex(4, QDeclarativeGridView::Beginning);
   913     QTRY_COMPARE(gridview->contentY(), 60.);
   941     QTRY_COMPARE(gridview->contentY(), 60.);
   914 
   942 
   915     // Confirm items positioned correctly
   943     // Confirm items positioned correctly
   916     itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   944     itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   917     for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) {
   945     for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) {
   918         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   946         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   919         if (!item) qWarning() << "Item" << i << "not found";
   947         if (!item) qWarning() << "Item" << i << "not found";
   920         QTRY_VERIFY(item);
   948         QTRY_VERIFY(item);
   921         QTRY_COMPARE(item->x(), (i%3)*80.);
   949         QTRY_COMPARE(item->x(), (i%3)*80.);
   922         QTRY_COMPARE(item->y(), (i/3)*60.);
   950         QTRY_COMPARE(item->y(), (i/3)*60.);
   923     }
   951     }
   925     // Position on an item beyond the visible items
   953     // Position on an item beyond the visible items
   926     gridview->positionViewAtIndex(21, QDeclarativeGridView::Beginning);
   954     gridview->positionViewAtIndex(21, QDeclarativeGridView::Beginning);
   927     QTRY_COMPARE(gridview->contentY(), 420.);
   955     QTRY_COMPARE(gridview->contentY(), 420.);
   928 
   956 
   929     // Confirm items positioned correctly
   957     // Confirm items positioned correctly
   930     itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   958     itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   931     for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) {
   959     for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) {
   932         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   960         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   933         if (!item) qWarning() << "Item" << i << "not found";
   961         if (!item) qWarning() << "Item" << i << "not found";
   934         QTRY_VERIFY(item);
   962         QTRY_VERIFY(item);
   935         QTRY_COMPARE(item->x(), (i%3)*80.);
   963         QTRY_COMPARE(item->x(), (i%3)*80.);
   936         QTRY_COMPARE(item->y(), (i/3)*60.);
   964         QTRY_COMPARE(item->y(), (i/3)*60.);
   937     }
   965     }
   939     // Position on an item that would leave empty space if positioned at the top
   967     // Position on an item that would leave empty space if positioned at the top
   940     gridview->positionViewAtIndex(31, QDeclarativeGridView::Beginning);
   968     gridview->positionViewAtIndex(31, QDeclarativeGridView::Beginning);
   941     QTRY_COMPARE(gridview->contentY(), 520.);
   969     QTRY_COMPARE(gridview->contentY(), 520.);
   942 
   970 
   943     // Confirm items positioned correctly
   971     // Confirm items positioned correctly
   944     itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   972     itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   945     for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) {
   973     for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) {
   946         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   974         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   947         if (!item) qWarning() << "Item" << i << "not found";
   975         if (!item) qWarning() << "Item" << i << "not found";
   948         QTRY_VERIFY(item);
   976         QTRY_VERIFY(item);
   949         QTRY_COMPARE(item->x(), (i%3)*80.);
   977         QTRY_COMPARE(item->x(), (i%3)*80.);
   950         QTRY_COMPARE(item->y(), (i/3)*60.);
   978         QTRY_COMPARE(item->y(), (i/3)*60.);
   951     }
   979     }
   953     // Position at the beginning again
   981     // Position at the beginning again
   954     gridview->positionViewAtIndex(0, QDeclarativeGridView::Beginning);
   982     gridview->positionViewAtIndex(0, QDeclarativeGridView::Beginning);
   955     QTRY_COMPARE(gridview->contentY(), 0.);
   983     QTRY_COMPARE(gridview->contentY(), 0.);
   956 
   984 
   957     // Confirm items positioned correctly
   985     // Confirm items positioned correctly
   958     itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
   986     itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
   959     for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
   987     for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
   960         QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
   988         QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
   961         if (!item) qWarning() << "Item" << i << "not found";
   989         if (!item) qWarning() << "Item" << i << "not found";
   962         QTRY_VERIFY(item);
   990         QTRY_VERIFY(item);
   963         QTRY_COMPARE(item->x(), (i%3)*80.);
   991         QTRY_COMPARE(item->x(), (i%3)*80.);
   964         QTRY_COMPARE(item->y(), (i/3)*60.);
   992         QTRY_COMPARE(item->y(), (i/3)*60.);
   965     }
   993     }
  1023     qApp->processEvents();
  1051     qApp->processEvents();
  1024 
  1052 
  1025     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
  1053     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
  1026     QTRY_VERIFY(gridview != 0);
  1054     QTRY_VERIFY(gridview != 0);
  1027 
  1055 
  1028     QDeclarativeItem *viewport = gridview->viewport();
  1056     QDeclarativeItem *contentItem = gridview->contentItem();
  1029     QTRY_VERIFY(viewport != 0);
  1057     QTRY_VERIFY(contentItem != 0);
  1030 
  1058 
  1031     QTRY_COMPARE(gridview->count(), model.rowCount());
  1059     QTRY_COMPARE(gridview->count(), model.rowCount());
  1032 
  1060 
  1033     for (int i = 0; i < model.rowCount(); ++i) {
  1061     for (int i = 0; i < model.rowCount(); ++i) {
  1034         QDeclarativeText *display = findItem<QDeclarativeText>(viewport, "displayText", i);
  1062         QDeclarativeText *display = findItem<QDeclarativeText>(contentItem, "displayText", i);
  1035         QTRY_VERIFY(display != 0);
  1063         QTRY_VERIFY(display != 0);
  1036         QTRY_COMPARE(display->text(), strings.at(i));
  1064         QTRY_COMPARE(display->text(), strings.at(i));
  1037     }
  1065     }
  1038 
  1066 
  1039     strings.clear();
  1067     strings.clear();
  1041     model.setStringList(strings);
  1069     model.setStringList(strings);
  1042 
  1070 
  1043     QTRY_COMPARE(gridview->count(), model.rowCount());
  1071     QTRY_COMPARE(gridview->count(), model.rowCount());
  1044 
  1072 
  1045     for (int i = 0; i < model.rowCount(); ++i) {
  1073     for (int i = 0; i < model.rowCount(); ++i) {
  1046         QDeclarativeText *display = findItem<QDeclarativeText>(viewport, "displayText", i);
  1074         QDeclarativeText *display = findItem<QDeclarativeText>(contentItem, "displayText", i);
  1047         QTRY_VERIFY(display != 0);
  1075         QTRY_VERIFY(display != 0);
  1048         QTRY_COMPARE(display->text(), strings.at(i));
  1076         QTRY_COMPARE(display->text(), strings.at(i));
  1049     }
  1077     }
  1050 }
  1078 }
  1051 
  1079 
  1068 
  1096 
  1069     QTRY_COMPARE(gridview->preferredHighlightBegin(), 100.0);
  1097     QTRY_COMPARE(gridview->preferredHighlightBegin(), 100.0);
  1070     QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0);
  1098     QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0);
  1071     QTRY_COMPARE(gridview->highlightRangeMode(), QDeclarativeGridView::StrictlyEnforceRange);
  1099     QTRY_COMPARE(gridview->highlightRangeMode(), QDeclarativeGridView::StrictlyEnforceRange);
  1072 
  1100 
  1073     QDeclarativeItem *viewport = gridview->viewport();
  1101     QDeclarativeItem *contentItem = gridview->contentItem();
  1074     QTRY_VERIFY(viewport != 0);
  1102     QTRY_VERIFY(contentItem != 0);
  1075 
  1103 
  1076     // view should be positioned at the top of the range.
  1104     // view should be positioned at the top of the range.
  1077     QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", 0);
  1105     QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", 0);
  1078     QTRY_VERIFY(item);
  1106     QTRY_VERIFY(item);
  1079     QTRY_COMPARE(gridview->contentY(), -100.0);
  1107     QTRY_COMPARE(gridview->contentY(), -100.0);
  1080 
  1108 
  1081     QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 0);
  1109     QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 0);
  1082     QTRY_VERIFY(name != 0);
  1110     QTRY_VERIFY(name != 0);
  1083     QTRY_COMPARE(name->text(), model.name(0));
  1111     QTRY_COMPARE(name->text(), model.name(0));
  1084     QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 0);
  1112     QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 0);
  1085     QTRY_VERIFY(number != 0);
  1113     QTRY_VERIFY(number != 0);
  1086     QTRY_COMPARE(number->text(), model.number(0));
  1114     QTRY_COMPARE(number->text(), model.number(0));
  1087 
  1115 
  1088     // Check currentIndex is updated when viewport moves
  1116     // Check currentIndex is updated when contentItem moves
  1089     gridview->setContentY(0);
  1117     gridview->setContentY(0);
  1090     QTRY_COMPARE(gridview->currentIndex(), 2);
  1118     QTRY_COMPARE(gridview->currentIndex(), 2);
  1091 
  1119 
  1092     gridview->setCurrentIndex(5);
  1120     gridview->setCurrentIndex(5);
  1093     QTRY_COMPARE(gridview->contentY(), 100.);
  1121     QTRY_COMPARE(gridview->contentY(), 100.);
  1094 
  1122 
       
  1123     TestModel model2;
       
  1124     for (int i = 0; i < 5; i++)
       
  1125         model2.addItem("Item" + QString::number(i), "");
       
  1126 
       
  1127     ctxt->setContextProperty("testModel", &model2);
       
  1128     QCOMPARE(gridview->count(), 5);
       
  1129 
  1095     delete canvas;
  1130     delete canvas;
  1096 }
  1131 }
  1097 
  1132 
  1098 void tst_QDeclarativeGridView::QTBUG_8456()
  1133 void tst_QDeclarativeGridView::QTBUG_8456()
  1099 {
  1134 {
  1118     qApp->processEvents();
  1153     qApp->processEvents();
  1119 
  1154 
  1120     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
  1155     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
  1121     QTRY_VERIFY(gridview != 0);
  1156     QTRY_VERIFY(gridview != 0);
  1122 
  1157 
  1123     QDeclarativeItem *viewport = gridview->viewport();
  1158     QDeclarativeItem *contentItem = gridview->contentItem();
  1124     QTRY_VERIFY(viewport != 0);
  1159     QTRY_VERIFY(contentItem != 0);
  1125 
  1160 
  1126     QTRY_COMPARE(gridview->currentIndex(), 0);
  1161     QTRY_COMPARE(gridview->currentIndex(), 0);
  1127     QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(viewport, "wrapper", 0));
  1162     QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 0));
  1128     QTRY_COMPARE(gridview->highlightItem()->y(), gridview->currentItem()->y());
  1163     QTRY_COMPARE(gridview->highlightItem()->y(), gridview->currentItem()->y());
  1129     QTRY_COMPARE(gridview->highlightItem()->x(), gridview->currentItem()->x());
  1164     QTRY_COMPARE(gridview->highlightItem()->x(), gridview->currentItem()->x());
  1130 
  1165 
  1131     gridview->setCurrentIndex(2);
  1166     gridview->setCurrentIndex(2);
  1132 
  1167 
  1133     QTRY_COMPARE(gridview->currentIndex(), 2);
  1168     QTRY_COMPARE(gridview->currentIndex(), 2);
  1134     QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(viewport, "wrapper", 2));
  1169     QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 2));
  1135     QTRY_COMPARE(gridview->highlightItem()->y(), gridview->currentItem()->y());
  1170     QTRY_COMPARE(gridview->highlightItem()->y(), gridview->currentItem()->y());
  1136     QTRY_COMPARE(gridview->highlightItem()->x(), gridview->currentItem()->x());
  1171     QTRY_COMPARE(gridview->highlightItem()->x(), gridview->currentItem()->x());
       
  1172 }
       
  1173 
       
  1174 void tst_QDeclarativeGridView::footer()
       
  1175 {
       
  1176     QDeclarativeView *canvas = createView();
       
  1177 
       
  1178     TestModel model;
       
  1179     for (int i = 0; i < 7; i++)
       
  1180         model.addItem("Item" + QString::number(i), "");
       
  1181 
       
  1182     QDeclarativeContext *ctxt = canvas->rootContext();
       
  1183     ctxt->setContextProperty("testModel", &model);
       
  1184 
       
  1185     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/footer.qml"));
       
  1186     qApp->processEvents();
       
  1187 
       
  1188     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
       
  1189     QTRY_VERIFY(gridview != 0);
       
  1190 
       
  1191     QDeclarativeItem *contentItem = gridview->contentItem();
       
  1192     QTRY_VERIFY(contentItem != 0);
       
  1193 
       
  1194     QDeclarativeText *footer = findItem<QDeclarativeText>(contentItem, "footer");
       
  1195     QVERIFY(footer);
       
  1196 
       
  1197     QCOMPARE(footer->y(), 180.0);
       
  1198 
       
  1199     model.removeItem(2);
       
  1200     QTRY_COMPARE(footer->y(), 120.0);
       
  1201 
       
  1202     model.clear();
       
  1203     QTRY_COMPARE(footer->y(), 0.0);
  1137 }
  1204 }
  1138 
  1205 
  1139 
  1206 
  1140 QDeclarativeView *tst_QDeclarativeGridView::createView()
  1207 QDeclarativeView *tst_QDeclarativeGridView::createView()
  1141 {
  1208 {