diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2011-09-29 09:58:42 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-12 02:36:56 +0200 |
commit | ae623976b8920117e751448e2a65dab174731476 (patch) | |
tree | 21c1e44764a77e50f4fc7202d000c0670692bdee /tests | |
parent | 959778a2b750cbc211643929a6e85a8694d72891 (diff) |
Allow view items to be preserved.
Do not destroy items that are members of the VisualDataModel
persistedItems group when they are released by the view.
The create function on VisualDataGroup will return a reference to
an instantiated item within that group, any item returned by this
function is automatically added to the persistedItems group and can
be released by removing it from the group. Uninstantiated items added
to the persistedItems group by any other means are not instantiated
until requested by a view or create.
Task-number: QTBUG-21518
Task-number: QTBUG-20854
Change-Id: I59554711208504c8f20a3ebe783bddab9b21a558
Reviewed-on: http://codereview.qt-project.org/5831
Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/declarative/qsgvisualdatamodel/data/create.qml | 22 | ||||
-rw-r--r-- | tests/auto/declarative/qsgvisualdatamodel/tst_qsgvisualdatamodel.cpp | 114 |
2 files changed, 136 insertions, 0 deletions
diff --git a/tests/auto/declarative/qsgvisualdatamodel/data/create.qml b/tests/auto/declarative/qsgvisualdatamodel/data/create.qml new file mode 100644 index 0000000000..36ea3baf76 --- /dev/null +++ b/tests/auto/declarative/qsgvisualdatamodel/data/create.qml @@ -0,0 +1,22 @@ +import QtQuick 2.0 + +ListView { + width: 200 + height: 200 + + model: VisualDataModel { + id: visualModel + + model: myModel + delegate: Item { + id: delegate + objectName: "delegate" + width: 200 + height: 20 + + property bool destroyed: false + + Component.onDestruction: destroyed = true + } + } +} diff --git a/tests/auto/declarative/qsgvisualdatamodel/tst_qsgvisualdatamodel.cpp b/tests/auto/declarative/qsgvisualdatamodel/tst_qsgvisualdatamodel.cpp index 50e1b8f9df..63e40cdb60 100644 --- a/tests/auto/declarative/qsgvisualdatamodel/tst_qsgvisualdatamodel.cpp +++ b/tests/auto/declarative/qsgvisualdatamodel/tst_qsgvisualdatamodel.cpp @@ -135,6 +135,7 @@ private slots: void move(); void groups(); void get(); + void create(); private: template <int N> void groups_verify( @@ -1410,6 +1411,119 @@ void tst_qsgvisualdatamodel::get() } } +void tst_qsgvisualdatamodel::create() +{ + QSGView view; + + SingleRoleModel model; + model.list = QStringList() + << "one" + << "two" + << "three" + << "four" + << "five" + << "six" + << "seven" + << "eight" + << "nine" + << "ten" + << "eleven" + << "twelve" + << "thirteen" + << "fourteen" + << "fifteen" + << "sixteen" + << "seventeen" + << "eighteen" + << "nineteen" + << "twenty"; + + QDeclarativeContext *ctxt = view.rootContext(); + ctxt->setContextProperty("myModel", &model); + + view.setSource(QUrl::fromLocalFile(SRCDIR "/data/create.qml")); + + QSGListView *listview = qobject_cast<QSGListView*>(view.rootObject()); + QVERIFY(listview != 0); + + QSGItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QSGVisualDataModel *visualModel = qobject_cast<QSGVisualDataModel *>(qvariant_cast<QObject *>(listview->model())); + QVERIFY(visualModel); + + QCOMPARE(listview->count(), 20); + + QSGItem *delegate; + + // Request an item instantiated by the view. + QVERIFY(findItem<QSGItem>(contentItem, "delegate", 1)); + QVERIFY(delegate = qobject_cast<QSGItem *>(evaluate<QObject *>(visualModel, "items.create(1)"))); + QCOMPARE(delegate, findItem<QSGItem>(contentItem, "delegate", 1)); + QCOMPARE(evaluate<bool>(delegate, "VisualDataModel.inPersistedItems"), true); + QCOMPARE(evaluate<int>(visualModel, "persistedItems.count"), 1); + + evaluate<void>(delegate, "VisualDataModel.inPersistedItems = false"); + QCOMPARE(listview->count(), 20); + QCOMPARE(evaluate<bool>(delegate, "destroyed"), false); + QCOMPARE(evaluate<bool>(delegate, "VisualDataModel.inPersistedItems"), false); + QCOMPARE(evaluate<int>(visualModel, "persistedItems.count"), 0); + + // Request an item not instantiated by the view. + QVERIFY(!findItem<QSGItem>(contentItem, "delegate", 15)); + QVERIFY(delegate = qobject_cast<QSGItem *>(evaluate<QObject *>(visualModel, "items.create(15)"))); + QCOMPARE(delegate, findItem<QSGItem>(contentItem, "delegate", 15)); + QCOMPARE(evaluate<bool>(delegate, "VisualDataModel.inPersistedItems"), true); + QCOMPARE(evaluate<int>(visualModel, "persistedItems.count"), 1); + + evaluate<void>(visualModel, "persistedItems.remove(0)"); + QCOMPARE(evaluate<bool>(delegate, "destroyed"), true); + QCOMPARE(evaluate<int>(visualModel, "persistedItems.count"), 0); + + // Request an item not instantiated by the view, then scroll the view so it will request it. + QVERIFY(!findItem<QSGItem>(contentItem, "delegate", 16)); + QVERIFY(delegate = qobject_cast<QSGItem *>(evaluate<QObject *>(visualModel, "items.create(16)"))); + QCOMPARE(delegate, findItem<QSGItem>(contentItem, "delegate", 16)); + QCOMPARE(evaluate<bool>(delegate, "VisualDataModel.inPersistedItems"), true); + QCOMPARE(evaluate<int>(visualModel, "persistedItems.count"), 1); + + evaluate<void>(listview, "positionViewAtIndex(19, ListView.End)"); + QCOMPARE(listview->count(), 20); + evaluate<void>(delegate, "VisualDataModel.groups = [\"items\"]"); + QCOMPARE(evaluate<bool>(delegate, "destroyed"), false); + QCOMPARE(evaluate<bool>(delegate, "VisualDataModel.inPersistedItems"), false); + QCOMPARE(evaluate<int>(visualModel, "persistedItems.count"), 0); + + // Request and release an item instantiated by the view, then scroll the view so it releases it. + QVERIFY(findItem<QSGItem>(contentItem, "delegate", 17)); + QVERIFY(delegate = qobject_cast<QSGItem *>(evaluate<QObject *>(visualModel, "items.create(17)"))); + QCOMPARE(delegate, findItem<QSGItem>(contentItem, "delegate", 17)); + QCOMPARE(evaluate<bool>(delegate, "VisualDataModel.inPersistedItems"), true); + QCOMPARE(evaluate<int>(visualModel, "persistedItems.count"), 1); + + evaluate<void>(visualModel, "items.removeGroups(17, \"persistedItems\")"); + QCOMPARE(evaluate<bool>(delegate, "destroyed"), false); + QCOMPARE(evaluate<bool>(delegate, "VisualDataModel.inPersistedItems"), false); + QCOMPARE(evaluate<int>(visualModel, "persistedItems.count"), 0); + evaluate<void>(listview, "positionViewAtIndex(1, ListView.Beginning)"); + QCOMPARE(listview->count(), 20); + QCOMPARE(evaluate<bool>(delegate, "destroyed"), true); + + // Adding an item to the persistedItems group won't instantiate it, but if later requested by + // the view it will be persisted. + evaluate<void>(visualModel, "items.addGroups(18, \"persistedItems\")"); + QCOMPARE(evaluate<int>(visualModel, "persistedItems.count"), 1); + QVERIFY(!findItem<QSGItem>(contentItem, "delegate", 18)); + evaluate<void>(listview, "positionViewAtIndex(19, ListView.End)"); + QCOMPARE(listview->count(), 20); + QVERIFY(delegate = findItem<QSGItem>(contentItem, "delegate", 18)); + QCOMPARE(evaluate<bool>(delegate, "VisualDataModel.inPersistedItems"), true); + QCOMPARE(evaluate<bool>(delegate, "destroyed"), false); + evaluate<void>(listview, "positionViewAtIndex(1, ListView.Beginning)"); + QCOMPARE(listview->count(), 20); + QCOMPARE(evaluate<bool>(delegate, "destroyed"), false); +} + template<typename T> T *tst_qsgvisualdatamodel::findItem(QSGItem *parent, const QString &objectName, int index) { |