summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Persano <mauro.persano@kdab.com>2017-06-15 19:35:42 -0300
committerMauro Persano <mauro.persano@kdab.com>2017-06-16 12:53:49 +0000
commit01a6bcd086cecef3169e5d79bd72dbb0d1393a0f (patch)
treeff1df20d85c15dc6f35e82f0e2df7ae9f3b6d19d
parentc804e393e7b0e66c03ebe5ca3d7c5a246e5fcda8 (diff)
Update NodeInstantiator's children on parent update
Currently the parent for elements created by NodeInstantiator are set to the instantiator's parent. This doesn't work for nested instantiators, since at the time the inner instantiator's children are being created the instantiator itself doesn't yet have a parent node yet. Update the parent of elements created by the instantiator when the instantiator's parent changes. Change-Id: I6f260ad2a8a81af5551799e6c643d8849f46e342 Reviewed-by: Sean Harmer <sean.harmer@kdab.com> Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
-rw-r--r--src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp12
-rw-r--r--src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h3
-rw-r--r--tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml15
-rw-r--r--tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro1
-rw-r--r--tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp29
5 files changed, 60 insertions, 0 deletions
diff --git a/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp b/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp
index c6e8aa7c1..b99f6ae75 100644
--- a/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp
+++ b/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp
@@ -245,6 +245,7 @@ void Quick3DNodeInstantiatorPrivate::makeModel()
Quick3DNodeInstantiator::Quick3DNodeInstantiator(QNode *parent)
: QNode(*new Quick3DNodeInstantiatorPrivate, parent)
{
+ connect(this, &QNode::parentChanged, this, &Quick3DNodeInstantiator::onParentChanged);
}
/*!
@@ -501,6 +502,17 @@ void Quick3DNodeInstantiator::componentComplete()
}
}
+/*!
+ \internal
+*/
+void Quick3DNodeInstantiator::onParentChanged(QObject *parent)
+{
+ Q_D(const Quick3DNodeInstantiator);
+ auto parentNode = static_cast<QNode *>(parent);
+ for (auto obj : d->m_objects)
+ static_cast<QNode *>(obj.data())->setParent(parentNode);
+}
+
// TODO: Avoid cloning here
//void Quick3DNodeInstantiator::copy(const QNode *ref)
//{
diff --git a/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h b/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h
index fd7a1d83d..a79cb4f90 100644
--- a/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h
+++ b/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h
@@ -113,6 +113,9 @@ Q_SIGNALS:
void objectAdded(int index, QObject *object);
void objectRemoved(int index, QObject *object);
+private slots:
+ void onParentChanged(QObject *parent);
+
private:
Q_DISABLE_COPY(Quick3DNodeInstantiator)
Q_DECLARE_PRIVATE(Quick3DNodeInstantiator)
diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml
new file mode 100644
index 000000000..55be54297
--- /dev/null
+++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml
@@ -0,0 +1,15 @@
+import QtQml 2.1
+import Qt3D.Core 2.0
+
+Entity {
+ NodeInstantiator {
+ model: 3
+ delegate: NodeInstantiator {
+ model: 4
+ delegate: Entity {
+ property bool success: true
+ property int idx: index
+ }
+ }
+ }
+}
diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro b/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro
index 15435d13e..9026f91ff 100644
--- a/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro
+++ b/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro
@@ -12,6 +12,7 @@ OTHER_FILES = \
data/createMultiple.qml \
data/createNone.qml \
data/createSingle.qml \
+ data/createNested.qml \
data/inactive.qml \
data/stringModel.qml
diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp
index acaba6690..d4d0d56e2 100644
--- a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp
+++ b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp
@@ -50,6 +50,7 @@ private slots:
void createNone();
void createSingle();
void createMultiple();
+ void createNested();
void stringModel();
void activeProperty();
void intModelChange();
@@ -109,6 +110,34 @@ void tst_quick3dnodeinstantiator::createMultiple()
}
}
+void tst_quick3dnodeinstantiator::createNested()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("createNested.qml"));
+ const auto root = qobject_cast<Qt3DCore::QNode*>(component.create());
+ QVERIFY(root != 0);
+
+ auto instantiators = root->findChildren<Quick3DNodeInstantiator*>();
+ QCOMPARE(instantiators.count(), 4);
+
+ const auto outerInstantiator = instantiators.takeFirst();
+ QCOMPARE(outerInstantiator->isActive(), true);
+ QCOMPARE(outerInstantiator->count(), 3);
+
+ for (const auto instantiator : instantiators) {
+ QCOMPARE(instantiator->isActive(), true);
+ QCOMPARE(instantiator->count(), 4);
+
+ for (int i = 0; i < 4; i++) {
+ auto object = instantiator->objectAt(i);
+ QVERIFY(object);
+ QCOMPARE(object->parent(), root);
+ QCOMPARE(object->property("success").toBool(), true);
+ QCOMPARE(object->property("idx").toInt(), i);
+ }
+ }
+}
+
void tst_quick3dnodeinstantiator::stringModel()
{
QQmlEngine engine;