From 472b888112acc40fe3f7a02387d12cd58dde224f Mon Sep 17 00:00:00 2001 From: Rafal Andrusieczko Date: Fri, 25 Apr 2025 19:19:16 +0200 Subject: [PATCH] QmlDesigner: Fix drag & drop 3D components into 2D/3D view The created components do not have metadata files that contain the node's hints. With their help, a decision is made whether the item can be placed in the view. The fix is to add two hints that allow to create an item in the proper view. In addition, a metainfo has been added to check if an object is based on Object3D. This allows to check if the element is from QtQuick3D. This fix solves issues for non-project storage builds only. Task-number: QDS-15237 Pick-to: qds/4.7 Change-Id: Ib00c26989b0400d3aad48882f5c9f8fc1b5bef40 Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri --- .../libs/designercore/include/model.h | 1 + .../libs/designercore/include/nodemetainfo.h | 1 + .../designercore/metainfo/nodemetainfo.cpp | 19 +++++++++++++++++++ .../metainfo/subcomponentmanager.cpp | 10 ++++++++++ .../libs/designercore/model/model.cpp | 10 ++++++++++ .../projectstorage/commontypecache.h | 2 ++ 6 files changed, 43 insertions(+) diff --git a/src/plugins/qmldesigner/libs/designercore/include/model.h b/src/plugins/qmldesigner/libs/designercore/include/model.h index 9f16e312585..a9ed64415da 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/model.h +++ b/src/plugins/qmldesigner/libs/designercore/include/model.h @@ -194,6 +194,7 @@ public: NodeMetaInfo qtQuick3DMaterialMetaInfo() const; NodeMetaInfo qtQuick3DModelMetaInfo() const; NodeMetaInfo qtQuick3DNodeMetaInfo() const; + NodeMetaInfo qtQuick3DObject3DMetaInfo() const; NodeMetaInfo qtQuick3DOrthographicCameraMetaInfo() const; NodeMetaInfo qtQuick3DParticles3DSpriteParticle3DMetaInfo() const; NodeMetaInfo qtQuick3DPerspectiveCameraMetaInfo() const; diff --git a/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h index dff76039d28..9f10cf1506c 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h @@ -233,6 +233,7 @@ public: bool isQtQuick3DMaterial() const; bool isQtQuick3DModel(SL sl = {}) const; bool isQtQuick3DNode(SL sl = {}) const; + bool isQtQuick3DObject3D(SL sl = {}) const; bool isQtQuick3DParticlesAbstractShape(SL sl = {}) const; bool isQtQuick3DParticles3DAffector3D(SL sl = {}) const; bool isQtQuick3DParticles3DAttractor3D(SL sl = {}) const; diff --git a/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp index 1436b4d13d2..9fc87f9d9a4 100644 --- a/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp @@ -4650,6 +4650,25 @@ bool NodeMetaInfo::isQtQuick3DNode(SL sl) const } } +bool NodeMetaInfo::isQtQuick3DObject3D(SL sl) const +{ + if constexpr (useProjectStorage()) { + if (!isValid()) + return false; + + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"is QtQuick3D.Object3D", + category(), + keyValue("type id", m_typeId), + keyValue("caller location", sl)}; + + using namespace Storage::Info; + return isBasedOnCommonType(m_projectStorage, m_typeId); + } else { + return isValid() && isSubclassOf("QtQuick3D.Object3D"); + } +} + bool NodeMetaInfo::isQtQuick3DParticles3DAffector3D(SL sl) const { if constexpr (useProjectStorage()) { diff --git a/src/plugins/qmldesigner/libs/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/libs/designercore/metainfo/subcomponentmanager.cpp index 82ea48900aa..51571429e2e 100644 --- a/src/plugins/qmldesigner/libs/designercore/metainfo/subcomponentmanager.cpp +++ b/src/plugins/qmldesigner/libs/designercore/metainfo/subcomponentmanager.cpp @@ -372,6 +372,16 @@ void SubComponentManager::registerQmlFile(const QFileInfo &fileInfo, const QStri if (!qualifier.isEmpty()) itemLibraryEntry.setRequiredImport(fixedQualifier); + const NodeMetaInfo nodeMetaInfo = model()->metaInfo(baseComponentName.toUtf8()); + if (nodeMetaInfo.isValid()) { + QHash hints; + if (nodeMetaInfo.isBasedOn(model()->qtQuick3DObject3DMetaInfo())) + hints["canBeDroppedInFormEditor"] = "false"; + if (nodeMetaInfo.isBasedOn(model()->qtQuick3DNodeMetaInfo())) + hints["canBeDroppedInView3D"] = "true"; + itemLibraryEntry.addHints(hints); + } + if (!model()->metaInfo().itemLibraryInfo()->containsEntry(itemLibraryEntry)) model()->metaInfo().itemLibraryInfo()->addEntries({itemLibraryEntry}); } diff --git a/src/plugins/qmldesigner/libs/designercore/model/model.cpp b/src/plugins/qmldesigner/libs/designercore/model/model.cpp index 0bb7621ac2b..331fff52150 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/model.cpp @@ -2787,6 +2787,16 @@ NodeMetaInfo Model::qtQuick3DNodeMetaInfo() const } } +NodeMetaInfo Model::qtQuick3DObject3DMetaInfo() const +{ + if constexpr (useProjectStorage()) { + using namespace Storage::Info; + return createNodeMetaInfo(); + } else { + return metaInfo("QtQuick3D.Object3D"); + } +} + NodeMetaInfo Model::qtQuick3DPointLightMetaInfo() const { if constexpr (useProjectStorage()) { diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/commontypecache.h b/src/plugins/qmldesigner/libs/designercore/projectstorage/commontypecache.h index c979052a676..a69251db2fe 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/commontypecache.h +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/commontypecache.h @@ -71,6 +71,7 @@ inline constexpr char Material[] = "Material"; inline constexpr char Model[] = "Model"; inline constexpr char MouseArea[] = "MouseArea"; inline constexpr char Node[] = "Node"; +inline constexpr char Object3D[] = "Object3D"; inline constexpr char OrthographicCamera[] = "OrthographicCamera"; inline constexpr char Particle3D[] = "Particle3D"; inline constexpr char ParticleEmitter3D[] = "ParticleEmitter3D"; @@ -223,6 +224,7 @@ class CommonTypeCache CacheType, CacheType, CacheType, + CacheType, CacheType, CacheType, CacheType,