From 0eac16fbda846c951f9b3887199e72b66f5aacd7 Mon Sep 17 00:00:00 2001 From: Kevin Ottens Date: Wed, 12 Oct 2016 12:08:26 +0200 Subject: NodeInstantiator created nodes go to its parent Currently, elements created by the NodeInstantiator are children of the instantiator itself. Change that to parent them in the instantiator parent instead. Rationale for that is that it will behave similarly to Repeater this way, and gives a chance of using NodeInstantiator in frame graphs. Indeed, anything which is not a FrameGraphNode gets pruned in that context that would include branches starting from NodeInstantiator. Change-Id: I651a51471d92fcf466c9abd5dbbbfa2960ef1247 Task-Id: QTBUG-55908 Reviewed-by: Sean Harmer --- .../quick3d/items/quick3dnodeinstantiator.cpp | 2 +- .../data/createMultiple.qml | 12 ++++---- .../quick3dnodeinstantiator/data/createNone.qml | 16 +++++----- .../quick3dnodeinstantiator/data/createSingle.qml | 10 ++++--- .../quick3dnodeinstantiator/data/inactive.qml | 12 ++++---- .../quick3dnodeinstantiator/data/stringModel.qml | 12 ++++---- .../tst_quick3dnodeinstantiator.cpp | 34 +++++++++++++++------- 7 files changed, 60 insertions(+), 38 deletions(-) diff --git a/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp b/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp index b95290a3c..41daf0921 100644 --- a/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp +++ b/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp @@ -148,7 +148,7 @@ void Quick3DNodeInstantiatorPrivate::_q_createdItem(int idx, QObject *item) Q_Q(Quick3DNodeInstantiator); if (m_objects.contains(item)) //Case when it was created synchronously in regenerate return; - static_cast(item)->setParent(q); + static_cast(item)->setParent(q->parentNode()); m_objects.insert(idx, item); if (m_objects.count() == 1) q->objectChanged(); diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultiple.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultiple.qml index 67c1e4fe7..c1f3b21ed 100644 --- a/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultiple.qml +++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultiple.qml @@ -1,10 +1,12 @@ import QtQml 2.1 import Qt3D.Core 2.0 -NodeInstantiator { - model: 10 - delegate: Entity { - property bool success: true - property int idx: index +Entity { + NodeInstantiator { + model: 10 + delegate: Entity { + property bool success: true + property int idx: index + } } } diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/createNone.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/createNone.qml index 736a02b45..eef31cb8c 100644 --- a/tests/auto/quick3d/quick3dnodeinstantiator/data/createNone.qml +++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/createNone.qml @@ -1,13 +1,15 @@ import QtQml 2.1 import Qt3D.Core 2.0 -NodeInstantiator { - model: 0 - property bool success: true - Entity { +Entity { + NodeInstantiator { + model: 0 property bool success: true - property int idx: index + Entity { + property bool success: true + property int idx: index + } + onObjectChanged: success = false;//Don't create intermediate objects + onCountChanged: success = false;//Don't create intermediate objects } - onObjectChanged: success = false;//Don't create intermediate objects - onCountChanged: success = false;//Don't create intermediate objects } diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/createSingle.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/createSingle.qml index 630da9940..5a79d6105 100644 --- a/tests/auto/quick3d/quick3dnodeinstantiator/data/createSingle.qml +++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/createSingle.qml @@ -1,9 +1,11 @@ import QtQml 2.1 import Qt3D.Core 2.0 -NodeInstantiator { - Entity { - property bool success: true - property int idx: index +Entity { + NodeInstantiator { + Entity { + property bool success: true + property int idx: index + } } } diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/inactive.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/inactive.qml index 178229059..8ae6994db 100644 --- a/tests/auto/quick3d/quick3dnodeinstantiator/data/inactive.qml +++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/inactive.qml @@ -1,10 +1,12 @@ import QtQml 2.1 import Qt3D.Core 2.0 -NodeInstantiator { - active: false - Entity { - property bool success: true - property int idx: index +Entity { + NodeInstantiator { + active: false + Entity { + property bool success: true + property int idx: index + } } } diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/stringModel.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/stringModel.qml index 431c1ebd8..5aa4d399a 100644 --- a/tests/auto/quick3d/quick3dnodeinstantiator/data/stringModel.qml +++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/stringModel.qml @@ -1,10 +1,12 @@ import QtQml 2.1 import Qt3D.Core 2.0 -NodeInstantiator { - model: ["alpha", "beta", "gamma", "delta"] - delegate: Entity { - property bool success: index == 1 ? datum.length == 4 : datum.length == 5 - property string datum: modelData +Entity { + NodeInstantiator { + model: ["alpha", "beta", "gamma", "delta"] + delegate: Entity { + property bool success: index == 1 ? datum.length == 4 : datum.length == 5 + property string datum: modelData + } } } diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp index fd7f0eb0c..acaba6690 100644 --- a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp +++ b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp @@ -60,7 +60,9 @@ void tst_quick3dnodeinstantiator::createNone() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("createNone.qml")); - Quick3DNodeInstantiator *instantiator = qobject_cast(component.create()); + const auto root = qobject_cast(component.create()); + QVERIFY(root != 0); + const auto instantiator = root->findChild(); QVERIFY(instantiator != 0); QCOMPARE(instantiator->isActive(), true); QCOMPARE(instantiator->count(), 0); @@ -72,7 +74,9 @@ void tst_quick3dnodeinstantiator::createSingle() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("createSingle.qml")); - Quick3DNodeInstantiator *instantiator = qobject_cast(component.create()); + const auto root = qobject_cast(component.create()); + QVERIFY(root != 0); + const auto instantiator = root->findChild(); QVERIFY(instantiator != 0); QCOMPARE(instantiator->isActive(), true); QCOMPARE(instantiator->count(), 1); @@ -80,7 +84,7 @@ void tst_quick3dnodeinstantiator::createSingle() QObject *object = instantiator->object(); QVERIFY(object); - QCOMPARE(object->parent(), instantiator); + QCOMPARE(object->parent(), root); QCOMPARE(object->property("success").toBool(), true); QCOMPARE(object->property("idx").toInt(), 0); } @@ -89,7 +93,9 @@ void tst_quick3dnodeinstantiator::createMultiple() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("createMultiple.qml")); - Quick3DNodeInstantiator *instantiator = qobject_cast(component.create()); + const auto root = qobject_cast(component.create()); + QVERIFY(root != 0); + const auto instantiator = root->findChild(); QVERIFY(instantiator != 0); QCOMPARE(instantiator->isActive(), true); QCOMPARE(instantiator->count(), 10); @@ -97,7 +103,7 @@ void tst_quick3dnodeinstantiator::createMultiple() for (int i = 0; i < 10; i++) { QObject *object = instantiator->objectAt(i); QVERIFY(object); - QCOMPARE(object->parent(), instantiator); + QCOMPARE(object->parent(), root); QCOMPARE(object->property("success").toBool(), true); QCOMPARE(object->property("idx").toInt(), i); } @@ -107,7 +113,9 @@ void tst_quick3dnodeinstantiator::stringModel() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("stringModel.qml")); - Quick3DNodeInstantiator *instantiator = qobject_cast(component.create()); + const auto root = qobject_cast(component.create()); + QVERIFY(root != 0); + const auto instantiator = root->findChild(); QVERIFY(instantiator != 0); QCOMPARE(instantiator->isActive(), true); QCOMPARE(instantiator->count(), 4); @@ -115,7 +123,7 @@ void tst_quick3dnodeinstantiator::stringModel() for (int i = 0; i < 4; i++) { QObject *object = instantiator->objectAt(i); QVERIFY(object); - QCOMPARE(object->parent(), instantiator); + QCOMPARE(object->parent(), root); QCOMPARE(object->property("success").toBool(), true); } } @@ -124,7 +132,9 @@ void tst_quick3dnodeinstantiator::activeProperty() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("inactive.qml")); - Quick3DNodeInstantiator *instantiator = qobject_cast(component.create()); + const auto root = qobject_cast(component.create()); + QVERIFY(root != 0); + const auto instantiator = root->findChild(); QVERIFY(instantiator != 0); QSignalSpy activeSpy(instantiator, SIGNAL(activeChanged())); QSignalSpy countSpy(instantiator, SIGNAL(countChanged())); @@ -150,7 +160,7 @@ void tst_quick3dnodeinstantiator::activeProperty() QObject *object = instantiator->object(); QVERIFY(object); - QCOMPARE(object->parent(), instantiator); + QCOMPARE(object->parent(), root); QCOMPARE(object->property("success").toBool(), true); QCOMPARE(object->property("idx").toInt(), 0); } @@ -159,7 +169,9 @@ void tst_quick3dnodeinstantiator::intModelChange() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("createMultiple.qml")); - Quick3DNodeInstantiator *instantiator = qobject_cast(component.create()); + const auto root = qobject_cast(component.create()); + QVERIFY(root != 0); + const auto instantiator = root->findChild(); QVERIFY(instantiator != 0); QSignalSpy activeSpy(instantiator, SIGNAL(activeChanged())); QSignalSpy countSpy(instantiator, SIGNAL(countChanged())); @@ -183,7 +195,7 @@ void tst_quick3dnodeinstantiator::intModelChange() for (int i = 0; i < 2; i++) { QObject *object = instantiator->objectAt(i); QVERIFY(object); - QCOMPARE(object->parent(), instantiator); + QCOMPARE(object->parent(), root); QCOMPARE(object->property("success").toBool(), true); QCOMPARE(object->property("idx").toInt(), i); } -- cgit v1.2.3