aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2019-10-15 13:59:25 +0200
committerThomas Hartmann <thomas.hartmann@qt.io>2019-10-15 13:08:57 +0000
commit18ff97581a0bbc961a0f12829e22466f901998e2 (patch)
tree1993793d6245b92393968edd4f32e85f2ed22069
parentdb3dc34a126b7ef5a5ac60b0c3313d6e4e8d7db1 (diff)
QmlDesigner: Show 3D scene with multiple objects
A View3D can have multiple root nodes, which are automatically aggregated in a single root node. Change-Id: I3ad11eff5a8beadbd53f0fc8cdcaecd78772768b Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp27
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h1
2 files changed, 19 insertions, 9 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
index 6b6ddadeae..257ff92dac 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
@@ -147,6 +147,22 @@ bool Qt5InformationNodeInstanceServer::isDirtyRecursiveForParentInstances(QQuick
return false;
}
+QObject *Qt5InformationNodeInstanceServer::findRootNodeOf3DViewport(
+ const QList<ServerNodeInstance> &instanceList) const
+{
+ for (const ServerNodeInstance &instance : instanceList) {
+ if (instance.isSubclassOf("QQuick3DViewport")) {
+ for (const ServerNodeInstance &child : instanceList) { /* Look for scene node */
+ /* The QQuick3DViewport always creates a root node.
+ * This root node contains the complete scene. */
+ if (child.isSubclassOf("QQuick3DNode") && child.parent() == instance)
+ return child.internalObject()->property("parent").value<QObject *>();
+ }
+ }
+ }
+ return nullptr;
+}
+
void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeInstance> &instanceList)
{
ServerNodeInstance root = rootNodeInstance();
@@ -157,15 +173,8 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeIns
if (root.isSubclassOf("QQuick3DNode")) {
node = root.internalObject();
showCustomLight = true; // Pure node scene we should add a custom light
- } else { // Look for QQuick3DView
- for (const ServerNodeInstance &instance : instanceList) {
- if (instance.isSubclassOf("QQuick3DViewport")) {
- for (const ServerNodeInstance &child : instanceList) { /* Look for scene node */
- if (child.isSubclassOf("QQuick3DNode") && child.parent() == instance)
- node = child.internalObject();
- }
- }
- }
+ } else {
+ node = findRootNodeOf3DViewport(instanceList);
}
if (node) { // If we found a scene we create the edit view
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
index c9e7ad0dbc..9254cb4157 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
@@ -52,6 +52,7 @@ protected:
private:
void setup3DEditView(const QList<ServerNodeInstance> &instanceList);
+ QObject *findRootNodeOf3DViewport(const QList<ServerNodeInstance> &instanceList) const;
QSet<ServerNodeInstance> m_parentChangedSet;
QList<ServerNodeInstance> m_completedComponentList;