--- /dev/null
+import QtQuick 2.0
+
+Rectangle {
+ id: root
+ width: 240
+ height: 320
+ color: "#ffffff"
+
+ property int count: list.count
+ property bool showHeader: false
+ property bool showFooter: false
+ property real hr: list.visibleArea.heightRatio
+ function heightRatio() {
+ return list.visibleArea.heightRatio
+ }
+
+ function checkProperties() {
+ testObject.error = false;
+ if (visualModel.model != testModel) {
+ console.log("model property incorrect");
+ testObject.error = true;
+ }
+ if (!testObject.animate && visualModel.delegate != myDelegate) {
+ console.log("delegate property incorrect - expected myDelegate");
+ testObject.error = true;
+ }
+ if (testObject.animate && visualModel.delegate != animatedDelegate) {
+ console.log("delegate property incorrect - expected animatedDelegate");
+ testObject.error = true;
+ }
+ if (testObject.invalidHighlight && list.highlight != invalidHl) {
+ console.log("highlight property incorrect - expected invalidHl");
+ testObject.error = true;
+ }
+ if (!testObject.invalidHighlight && list.highlight != myHighlight) {
+ console.log("highlight property incorrect - expected myHighlight");
+ testObject.error = true;
+ }
+ }
+ resources: [
+ Component {
+ id: myDelegate
+ Package {
+ Rectangle {
+ id: wrapper
+ objectName: "wrapper"
+ height: 20
+ width: 240
+ Package.name: "package"
+ Text {
+ text: index
+ }
+ Text {
+ x: 30
+ id: textName
+ objectName: "textName"
+ text: name
+ }
+ Text {
+ x: 120
+ id: textNumber
+ objectName: "textNumber"
+ text: number
+ }
+ Text {
+ x: 200
+ text: wrapper.y
+ }
+ color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+ }
+ }
+ },
+ Component {
+ id: animatedDelegate
+ Package {
+ Rectangle {
+ id: wrapper
+ objectName: "wrapper"
+ height: 20
+ width: 240
+ Package.name: "package"
+ Text {
+ text: index
+ }
+ Text {
+ x: 30
+ id: textName
+ objectName: "textName"
+ text: name
+ }
+ Text {
+ x: 120
+ id: textNumber
+ objectName: "textNumber"
+ text: number
+ }
+ Text {
+ x: 200
+ text: wrapper.y
+ }
+ color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+ ListView.onRemove: SequentialAnimation {
+ PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: true }
+ NumberAnimation { target: wrapper; property: "scale"; to: 0; duration: 250; easing.type: "InOutQuad" }
+ PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: false }
+
+ }
+ }
+ }
+ },
+ Component {
+ id: myHighlight
+ Rectangle { color: "green" }
+ },
+ Component {
+ id: invalidHl
+ SmoothedAnimation {}
+ },
+ Component {
+ id: headerFooter
+ Rectangle { height: 30; width: 240; color: "blue" }
+ },
+ VisualDataModel {
+ id: visualModel
+
+ model: testModel
+ delegate: testObject.animate ? animatedDelegate : myDelegate
+ }
+
+ ]
+ ListView {
+ id: list
+ objectName: "list"
+ focus: true
+ width: 240
+ height: 320
+ model: visualModel.parts.package
+ highlight: testObject.invalidHighlight ? invalidHl : myHighlight
+ highlightMoveSpeed: 1000
+ highlightResizeSpeed: 1000
+ cacheBuffer: testObject.cacheBuffer
+ header: root.showHeader ? headerFooter : null
+ footer: root.showFooter ? headerFooter : null
+ }
+}
void cleanupTestCase();
// Test both QListModelInterface and QAbstractItemModel model types
void qListModelInterface_items();
+ void qListModelInterface_package_items();
void qAbstractItemModel_items();
void qListModelInterface_changed();
+ void qListModelInterface_package_changed();
void qAbstractItemModel_changed();
void qListModelInterface_inserted();
void qListModelInterface_inserted_more();
void qListModelInterface_inserted_more_data();
+ void qListModelInterface_package_inserted();
void qAbstractItemModel_inserted();
void qAbstractItemModel_inserted_more();
void qAbstractItemModel_inserted_more_data();
void qListModelInterface_removed();
+ void qListModelInterface_package_removed();
void qAbstractItemModel_removed();
void qListModelInterface_moved();
void qListModelInterface_moved_data();
+ void qListModelInterface_package_moved();
+ void qListModelInterface_package_moved_data();
void qAbstractItemModel_moved();
void qAbstractItemModel_moved_data();
void multipleChanges_data();
void qListModelInterface_clear();
+ void qListModelInterface_package_clear();
void qAbstractItemModel_clear();
void insertBeforeVisible();
void enforceRange();
void enforceRange_withoutHighlight();
void spacing();
- void sections();
+ void qListModelInterface_sections();
+ void qListModelInterface_package_sections();
+ void qAbstractItemModel_sections();
void sectionsPositioning();
void sectionsDelegate();
void cacheBuffer();
void asynchronous();
private:
- template <class T> void items();
- template <class T> void changed();
- template <class T> void inserted();
+ template <class T> void items(const QUrl &source, bool forceLayout);
+ template <class T> void changed(const QUrl &source, bool forceLayout);
+ template <class T> void inserted(const QUrl &source);
template <class T> void inserted_more();
- template <class T> void removed(bool animated);
- template <class T> void moved();
- template <class T> void clear();
+ template <class T> void removed(const QUrl &source, bool animated);
+ template <class T> void moved(const QUrl &source);
+ template <class T> void clear(const QUrl &source);
+ template <class T> void sections(const QUrl &source);
QQuickView *createView();
void flick(QQuickView *canvas, const QPoint &from, const QPoint &to, int duration);
QQuickItem *findVisibleChild(QQuickItem *parent, const QString &objectName);
}
template <class T>
-void tst_QQuickListView::items()
+void tst_QQuickListView::items(const QUrl &source, bool forceLayout)
{
QQuickView *canvas = createView();
TestObject *testObject = new TestObject;
ctxt->setContextProperty("testObject", testObject);
- canvas->setSource(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
+ canvas->setSource(source);
qApp->processEvents();
QQuickListView *listview = findItem<QQuickListView>(canvas->rootObject(), "list");
T model2;
ctxt->setContextProperty("testModel", &model2);
+ // Force a layout, necessary if ListView is completed before VisualDataModel.
+ if (forceLayout)
+ QCOMPARE(listview->property("count").toInt(), 0);
+
int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count();
QTRY_VERIFY(itemCount == 0);
template <class T>
-void tst_QQuickListView::changed()
+void tst_QQuickListView::changed(const QUrl &source, bool forceLayout)
{
QQuickView *canvas = createView();
TestObject *testObject = new TestObject;
ctxt->setContextProperty("testObject", testObject);
- canvas->setSource(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
+ canvas->setSource(source);
qApp->processEvents();
QQuickFlickable *listview = findItem<QQuickFlickable>(canvas->rootObject(), "list");
QQuickItem *contentItem = listview->contentItem();
QTRY_VERIFY(contentItem != 0);
+ // Force a layout, necessary if ListView is completed before VisualDataModel.
+ if (forceLayout)
+ QCOMPARE(listview->property("count").toInt(), model.count());
+
model.modifyItem(1, "Will", "9876");
QQuickText *name = findItem<QQuickText>(contentItem, "textName", 1);
QTRY_VERIFY(name != 0);
}
template <class T>
-void tst_QQuickListView::inserted()
+void tst_QQuickListView::inserted(const QUrl &source)
{
QQuickView *canvas = createView();
canvas->show();
TestObject *testObject = new TestObject;
ctxt->setContextProperty("testObject", testObject);
- canvas->setSource(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
+ canvas->setSource(source);
+ //canvas->setSource(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
qApp->processEvents();
QQuickListView *listview = findItem<QQuickListView>(canvas->rootObject(), "list");
}
template <class T>
-void tst_QQuickListView::removed(bool /* animated */)
+void tst_QQuickListView::removed(const QUrl &source, bool /* animated */)
{
QQuickView *canvas = createView();
TestObject *testObject = new TestObject;
ctxt->setContextProperty("testObject", testObject);
- canvas->setSource(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
+ canvas->setSource(source);
canvas->show();
qApp->processEvents();
}
template <class T>
-void tst_QQuickListView::clear()
+void tst_QQuickListView::clear(const QUrl &source)
{
QQuickView *canvas = createView();
TestObject *testObject = new TestObject;
ctxt->setContextProperty("testObject", testObject);
- canvas->setSource(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
+ canvas->setSource(source);
qApp->processEvents();
QQuickListView *listview = findItem<QQuickListView>(canvas->rootObject(), "list");
}
template <class T>
-void tst_QQuickListView::moved()
+void tst_QQuickListView::moved(const QUrl &source)
{
QFETCH(qreal, contentY);
QFETCH(int, from);
TestObject *testObject = new TestObject;
ctxt->setContextProperty("testObject", testObject);
- canvas->setSource(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
+ canvas->setSource(source);
qApp->processEvents();
QQuickListView *listview = findItem<QQuickListView>(canvas->rootObject(), "list");
delete testObject;
}
-void tst_QQuickListView::sections()
+template <typename T>
+void tst_QQuickListView::sections(const QUrl &source)
{
QQuickView *canvas = createView();
canvas->show();
- TestModel model;
+ T model;
for (int i = 0; i < 30; i++)
model.addItem("Item" + QString::number(i), QString::number(i/5));
QDeclarativeContext *ctxt = canvas->rootContext();
ctxt->setContextProperty("testModel", &model);
- canvas->setSource(QUrl::fromLocalFile(TESTDATA("listview-sections.qml")));
+ canvas->setSource(source);
qApp->processEvents();
QQuickListView *listview = findItem<QQuickListView>(canvas->rootObject(), "list");
void tst_QQuickListView::qListModelInterface_items()
{
- items<TestModel>();
+ items<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")), false);
+}
+
+void tst_QQuickListView::qListModelInterface_package_items()
+{
+ items<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest-package.qml")), true);
}
void tst_QQuickListView::qAbstractItemModel_items()
{
- items<TestModel2>();
+ items<TestModel2>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")), false);
}
void tst_QQuickListView::qListModelInterface_changed()
{
- changed<TestModel>();
+ changed<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")), false);
+}
+
+void tst_QQuickListView::qListModelInterface_package_changed()
+{
+ changed<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest-package.qml")), true);
}
void tst_QQuickListView::qAbstractItemModel_changed()
{
- changed<TestModel2>();
+ changed<TestModel2>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")), false);
}
void tst_QQuickListView::qListModelInterface_inserted()
{
- inserted<TestModel>();
+ inserted<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
+}
+
+void tst_QQuickListView::qListModelInterface_package_inserted()
+{
+ inserted<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest-package.qml")));
}
void tst_QQuickListView::qListModelInterface_inserted_more()
void tst_QQuickListView::qAbstractItemModel_inserted()
{
- inserted<TestModel2>();
+ inserted<TestModel2>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
}
void tst_QQuickListView::qAbstractItemModel_inserted_more()
void tst_QQuickListView::qListModelInterface_removed()
{
- removed<TestModel>(false);
- removed<TestModel>(true);
+ removed<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")), false);
+ removed<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")), true);
+}
+
+void tst_QQuickListView::qListModelInterface_package_removed()
+{
+ removed<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest-package.qml")), false);
+ removed<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest-package.qml")), true);
}
void tst_QQuickListView::qAbstractItemModel_removed()
{
- removed<TestModel2>(false);
- removed<TestModel2>(true);
+ removed<TestModel2>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")), false);
+ removed<TestModel2>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")), true);
}
void tst_QQuickListView::qListModelInterface_moved()
{
- moved<TestModel>();
+ moved<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
}
void tst_QQuickListView::qListModelInterface_moved_data()
moved_data();
}
+void tst_QQuickListView::qListModelInterface_package_moved()
+{
+ moved<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest-package.qml")));
+}
+
+void tst_QQuickListView::qListModelInterface_package_moved_data()
+{
+ moved_data();
+}
+
void tst_QQuickListView::qAbstractItemModel_moved()
{
- moved<TestModel2>();
+ moved<TestModel2>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
}
void tst_QQuickListView::qAbstractItemModel_moved_data()
void tst_QQuickListView::qListModelInterface_clear()
{
- clear<TestModel>();
+ clear<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
+}
+
+void tst_QQuickListView::qListModelInterface_package_clear()
+{
+ clear<TestModel>(QUrl::fromLocalFile(TESTDATA("listviewtest-package.qml")));
}
void tst_QQuickListView::qAbstractItemModel_clear()
{
- clear<TestModel2>();
+ clear<TestModel2>(QUrl::fromLocalFile(TESTDATA("listviewtest.qml")));
+}
+
+void tst_QQuickListView::qListModelInterface_sections()
+{
+ sections<TestModel>(QUrl::fromLocalFile(TESTDATA("listview-sections.qml")));
+}
+
+void tst_QQuickListView::qListModelInterface_package_sections()
+{
+ sections<TestModel>(QUrl::fromLocalFile(TESTDATA("listview-sections-package.qml")));
+}
+
+void tst_QQuickListView::qAbstractItemModel_sections()
+{
+ sections<TestModel2>(QUrl::fromLocalFile(TESTDATA("listview-sections.qml")));
}
void tst_QQuickListView::creationContext()