From ac84f8a45717ce65f11be7e71190edd3425a85c8 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 17 Oct 2019 18:27:57 +0200 Subject: [PATCH] QmlDesigner: Implement Quick3DNodeInstance wrapper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We use Quick3DNodeInstance as a proxy class to wrap QQuick3DNode. The access to private API like QQuick3DNodePrivate::setIsHiddenInEditor() is restriced by such proxy classes. Change-Id: If5191c3b730359000cf983c3af206dcffa07be74 Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri Reviewed-by: Pasi Keränen Reviewed-by: Thomas Hartmann --- .../qml2puppet/instances/instances.pri | 7 ++ .../instances/nodeinstanceserver.cpp | 10 +-- .../instances/objectnodeinstance.cpp | 4 + .../qml2puppet/instances/objectnodeinstance.h | 2 + .../instances/quick3dnodeinstance.cpp | 83 +++++++++++++++++++ .../instances/quick3dnodeinstance.h | 57 +++++++++++++ .../instances/servernodeinstance.cpp | 8 ++ .../qml2puppet/instances/servernodeinstance.h | 2 + src/tools/qml2puppet/CMakeLists.txt | 8 ++ src/tools/qml2puppet/qml2puppet.qbs | 2 + 10 files changed, 177 insertions(+), 6 deletions(-) create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.h diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri index 300f80d2b3f..50c0bd41bb9 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri @@ -1,5 +1,10 @@ INCLUDEPATH += $$PWD/ +qtHaveModule(quick3d) { + QT *= quick3d-private + DEFINES *= QUICK3D_MODULE +} + HEADERS += $$PWD/qt5nodeinstanceserver.h HEADERS += $$PWD/qt5testnodeinstanceserver.h HEADERS += $$PWD/qt5informationnodeinstanceserver.h @@ -23,6 +28,7 @@ HEADERS += $$PWD/anchorchangesnodeinstance.h HEADERS += $$PWD/positionernodeinstance.h HEADERS += $$PWD/layoutnodeinstance.h HEADERS += $$PWD/qt3dpresentationnodeinstance.h +HEADERS += $$PWD/quick3dnodeinstance.h SOURCES += $$PWD/qt5nodeinstanceserver.cpp SOURCES += $$PWD/qt5testnodeinstanceserver.cpp @@ -47,3 +53,4 @@ SOURCES += $$PWD/anchorchangesnodeinstance.cpp SOURCES += $$PWD/positionernodeinstance.cpp SOURCES += $$PWD/layoutnodeinstance.cpp SOURCES += $$PWD/qt3dpresentationnodeinstance.cpp +SOURCES += $$PWD/quick3dnodeinstance.cpp diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 356d173e09a..bd293488f19 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -985,12 +985,10 @@ void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer & } else if (auxiliaryContainer.name() == "invisible") { if (hasInstanceForId(auxiliaryContainer.instanceId())) { ServerNodeInstance instance = instanceForId(auxiliaryContainer.instanceId()); - if (instance.isSubclassOf("QQuick3DNode")) { - if (!auxiliaryContainer.value().isNull()) - instance.setPropertyVariant("visible", !auxiliaryContainer.value().toBool()); - else - instance.resetProperty("visible"); - } + if (!auxiliaryContainer.value().isNull()) + instance.setHideInEditor(auxiliaryContainer.value().toBool()); + else + instance.setHideInEditor(false); } } } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index 7fa0e316b6e..2f0244ddeba 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -392,6 +392,10 @@ PropertyNameList ObjectNodeInstance::ignoredProperties() const return PropertyNameList(); } +void ObjectNodeInstance::setHideInEditor(bool) +{ +} + QVariant ObjectNodeInstance::convertEnumToValue(const QVariant &value, const PropertyName &name) { Q_ASSERT(value.canConvert()); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h index 55114e872a6..8aa7ce4ad4d 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h @@ -193,6 +193,8 @@ public: virtual PropertyNameList ignoredProperties() const; + void virtual setHideInEditor(bool b); + protected: explicit ObjectNodeInstance(QObject *object); void doResetProperty(const PropertyName &propertyName); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp new file mode 100644 index 00000000000..472d560e099 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "quick3dnodeinstance.h" +#include "qt5nodeinstanceserver.h" + +#include + +#include +#include +#include +#include + +#include + +#ifdef QUICK3D_MODULE +#include +#include +#endif + +namespace QmlDesigner { +namespace Internal { + +Quick3DNodeInstance::Quick3DNodeInstance(QObject *node) + : ObjectNodeInstance(node) +{ +} + +Quick3DNodeInstance::~Quick3DNodeInstance() +{ +} + +Qt5NodeInstanceServer *Quick3DNodeInstance::qt5NodeInstanceServer() const +{ + return qobject_cast(nodeInstanceServer()); +} + +QQuick3DNode *Quick3DNodeInstance::quick3DNode() const +{ + return qobject_cast(object()); +} + +Quick3DNodeInstance::Pointer Quick3DNodeInstance::create(QObject *object) +{ + Pointer instance(new Quick3DNodeInstance(object)); + instance->populateResetHashes(); + return instance; +} + +void Quick3DNodeInstance::setHideInEditor(bool b) +{ +#ifdef QUICK3D_MODULE + QQuick3DNodePrivate *privateNode = QQuick3DNodePrivate::get(quick3DNode()); + if (privateNode) + privateNode->setIsHiddenInEditor(b); +#endif +} + +} // namespace Internal +} // namespace QmlDesigner + diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.h new file mode 100644 index 00000000000..6bfc2a02a19 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include + +#include "objectnodeinstance.h" + +#include + +QT_FORWARD_DECLARE_CLASS(QQuick3DNode) + +namespace QmlDesigner { +namespace Internal { + +class Quick3DNodeInstance : public ObjectNodeInstance +{ +public: + using Pointer = QSharedPointer; + + ~Quick3DNodeInstance() override; + static Pointer create(QObject *objectToBeWrapped); + void setHideInEditor(bool b) override; + +protected: + explicit Quick3DNodeInstance(QObject *node); + +private: + Qt5NodeInstanceServer *qt5NodeInstanceServer() const; + QQuick3DNode *quick3DNode() const; +}; + +} // namespace Internal +} // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp index 87aea97d8de..376ca29524f 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp @@ -39,6 +39,7 @@ #include "qt3dpresentationnodeinstance.h" #include "quickitemnodeinstance.h" +#include "quick3dnodeinstance.h" #include "nodeinstanceserver.h" #include "instancecontainer.h" @@ -170,6 +171,8 @@ Internal::ObjectNodeInstance::Pointer ServerNodeInstance::createInstance(QObject instance = Internal::LayoutNodeInstance::create(objectToBeWrapped); else if (isSubclassOf(objectToBeWrapped, "QQuickItem")) instance = Internal::QuickItemNodeInstance::create(objectToBeWrapped); + else if (isSubclassOf(objectToBeWrapped, "QQuick3DNode")) + instance = Internal::Quick3DNodeInstance::create(objectToBeWrapped); else if (isSubclassOf(objectToBeWrapped, "QQmlComponent")) instance = Internal::ComponentNodeInstance::create(objectToBeWrapped); else if (objectToBeWrapped->inherits("QQmlAnchorChanges")) @@ -312,6 +315,11 @@ void ServerNodeInstance::setPropertyBinding(const PropertyName &name, const QStr m_nodeInstance->setPropertyBinding(name, expression); } +void ServerNodeInstance::setHideInEditor(bool b) +{ + m_nodeInstance->setHideInEditor(b); +} + void ServerNodeInstance::resetProperty(const PropertyName &name) { m_nodeInstance->resetProperty(name); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h index 2bfc5147a72..7e72878dca4 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h @@ -172,6 +172,8 @@ private: // functions void setPropertyBinding(const PropertyName &name, const QString &expression); + void setHideInEditor(bool b); + void resetProperty(const PropertyName &name); void refreshProperty(const PropertyName &name); diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 1ff67919318..bbad0967613 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -87,6 +87,14 @@ extend_qtc_executable(qml2puppet nodeinstanceclientproxy.cpp nodeinstanceclientproxy.h ) +find_package(Qt5 COMPONENTS Quick3D QUIET) +extend_qtc_executable(qml2puppet + CONDITION TARGET Qt5::Quick3 + FEATURE_INFO "Qt Quick 3D" + DEPENDS Qt5::Quick3D + DEFINES QUICK3D_MODULE +) + extend_qtc_executable(qml2puppet SOURCES_PREFIX "${SRCDIR}/interfaces" SOURCES diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index 9dd7baa8bd9..995c29eac04 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -175,6 +175,8 @@ QtcTool { "instances/qmlpropertychangesnodeinstance.h", "instances/qmlstatenodeinstance.cpp", "instances/qmlstatenodeinstance.h", + "instances/quick3dnodeinstance.cpp", + "instances/quick3dnodeinstance.h", "instances/qmltransitionnodeinstance.cpp", "instances/qmltransitionnodeinstance.h", "instances/qt3dpresentationnodeinstance.cpp",