From b156b5d8c313f3b3711b1da6e06768473db3cf12 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Thu, 8 Dec 2011 17:52:35 +1000 Subject: [PATCH] Fix package items not being destroyed when a package is destroyed. The views parent the delegate items to themselves on creation, before we delete the package we need to reparent them back to it or they'll persist indefinately. Change-Id: I01a36fadb2b0ff1035de46ec2b84a54d73c49bcf Reviewed-by: Bea Lam --- src/quick/items/qquickvisualdatamodel.cpp | 6 +- .../qquickvisualdatamodel/data/packageView.qml | 65 ++++++++++++++++++ .../tst_qquickvisualdatamodel.cpp | 70 +++++++++++++++++++- 3 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 tests/auto/qtquick2/qquickvisualdatamodel/data/packageView.qml diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp index 4bb061f..990353a 100644 --- a/src/quick/items/qquickvisualdatamodel.cpp +++ b/src/quick/items/qquickvisualdatamodel.cpp @@ -2602,10 +2602,8 @@ QQuickVisualModel::ReleaseFlags QQuickVisualPartsModel::release(QQuickItem *item m_packaged.erase(it); if (!m_packaged.contains(item)) flags &= ~Referenced; - if (flags & Destroyed) { + if (flags & Destroyed) QQuickVisualDataModelPrivate::get(m_model)->emitDestroyingPackage(package); - item->setParentItem(0); - } } return flags; } @@ -2652,6 +2650,8 @@ void QQuickVisualPartsModel::destroyingPackage(QDeclarativePackage *package) if (QQuickItem *item = qobject_cast(package->part(m_part))) { Q_ASSERT(!m_packaged.contains(item)); emit destroyingItem(item); + item->setParentItem(0); + QDeclarative_setParent_noEvent(item, package); } } diff --git a/tests/auto/qtquick2/qquickvisualdatamodel/data/packageView.qml b/tests/auto/qtquick2/qquickvisualdatamodel/data/packageView.qml new file mode 100644 index 0000000..e7efcbe --- /dev/null +++ b/tests/auto/qtquick2/qquickvisualdatamodel/data/packageView.qml @@ -0,0 +1,65 @@ +import QtQuick 2.0 + +Item { + width: 240 + height: 320 + + Component { + id: myDelegate + + Package { + Rectangle { + id: leftWrapper + objectName: "wrapper" + Package.name: "left" + height: 20 + width: 120 + Text { + text: index + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + } + Rectangle { + id: rightWrapper + objectName: "wrapper" + Package.name: "right" + height: 20 + width: 120 + Text { + text: index + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + } + } + + } + + VisualDataModel { + id: visualModel + + delegate: myDelegate + model: testModel + } + + ListView { + id: leftList + objectName: "leftList" + anchors { + left: parent.left; top: parent.top; + right: parent.horizontalCenter; bottom: parent.bottom + } + model: visualModel.parts.left + currentIndex: 0 + } + + ListView { + id: rightList + objectName: "rightList" + anchors { + left: parent.horizontalCenter; top: parent.top; + right: parent.right; bottom: parent.bottom + } + model: visualModel.parts.right + currentIndex: 20 + } +} diff --git a/tests/auto/qtquick2/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp b/tests/auto/qtquick2/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp index af3af57..1389a53 100644 --- a/tests/auto/qtquick2/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp +++ b/tests/auto/qtquick2/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp @@ -133,6 +133,7 @@ private slots: void noDelegate(); void itemsDestroyed_data(); void itemsDestroyed(); + void packagesDestroyed(); void qaimRowsMoved(); void qaimRowsMoved_data(); void remove_data(); @@ -174,7 +175,7 @@ private: bool failed; QDeclarativeEngine engine; template - T *findItem(QQuickItem *parent, const QString &objectName, int index); + T *findItem(QQuickItem *parent, const QString &objectName, int index = -1); }; Q_DECLARE_METATYPE(QDeclarativeChangeSet) @@ -663,6 +664,73 @@ void tst_qquickvisualdatamodel::itemsDestroyed() QVERIFY(!delegate); } +void tst_qquickvisualdatamodel::packagesDestroyed() +{ + SingleRoleModel model; + model.list.clear(); + for (int i=0; i<30; i++) + model.list << ("item " + i); + + QQuickView view; + view.rootContext()->setContextProperty("testModel", &model); + + QString filename(TESTDATA("packageView.qml")); + view.setSource(QUrl::fromLocalFile(filename)); + + qApp->processEvents(); + + QQuickListView *leftview = findItem(view.rootObject(), "leftList"); + QTRY_VERIFY(leftview != 0); + + QQuickListView *rightview = findItem(view.rootObject(), "rightList"); + QTRY_VERIFY(rightview != 0); + + QQuickItem *leftContent = leftview->contentItem(); + QTRY_VERIFY(leftContent != 0); + + QQuickItem *rightContent = rightview->contentItem(); + QTRY_VERIFY(rightContent != 0); + + QCOMPARE(leftview->currentIndex(), 0); + QCOMPARE(rightview->currentIndex(), 20); + + QDeclarativeGuard left; + QDeclarativeGuard right; + + QVERIFY(findItem(leftContent, "wrapper", 1)); + QVERIFY(findItem(rightContent, "wrapper", 1)); + + QVERIFY(left = findItem(leftContent, "wrapper", 19)); + QVERIFY(right = findItem(rightContent, "wrapper", 19)); + + rightview->setCurrentIndex(0); + QCOMPARE(rightview->currentIndex(), 0); + + QTRY_COMPARE(rightview->contentY(), 0.0); + QCoreApplication::sendPostedEvents(); + + QVERIFY(!left); + QVERIFY(!right); + + QVERIFY(left = findItem(leftContent, "wrapper", 1)); + QVERIFY(right = findItem(rightContent, "wrapper", 1)); + + rightview->setCurrentIndex(20); + QTRY_COMPARE(rightview->contentY(), 100.0); + + QVERIFY(left); + QVERIFY(right); + + QVERIFY(findItem(leftContent, "wrapper", 19)); + QVERIFY(findItem(rightContent, "wrapper", 19)); + + leftview->setCurrentIndex(20); + QTRY_COMPARE(leftview->contentY(), 100.0); + + QVERIFY(!left); + QVERIFY(!right); +} + void tst_qquickvisualdatamodel::qaimRowsMoved() { // Test parameters passed in QAIM::rowsMoved() signal are converted correctly -- 1.7.2.5