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,