From ae478b557a31abbf2cd04df09ea9b74418e5dcf6 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 Change-Id: Ib00c26989b0400d3aad48882f5c9f8fc1b5bef40 Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri (cherry picked from commit 472b888112acc40fe3f7a02387d12cd58dde224f) Reviewed-by: Tim Jenssen --- .../libs/designercore/include/model.h | 1 + .../libs/designercore/include/nodemetainfo.h | 64 +++++++++++++++++++ .../designercore/metainfo/nodemetainfo.cpp | 23 +++++++ .../metainfo/subcomponentmanager.cpp | 10 +++ .../libs/designercore/model/model.cpp | 10 +++ .../projectstorage/commontypecache.h | 2 + 6 files changed, 110 insertions(+) diff --git a/src/plugins/qmldesigner/libs/designercore/include/model.h b/src/plugins/qmldesigner/libs/designercore/include/model.h index 9c8bcd10827..3771ba00689 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/model.h +++ b/src/plugins/qmldesigner/libs/designercore/include/model.h @@ -173,6 +173,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 fa867cce033..9d7e0c7d4d0 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h @@ -189,6 +189,7 @@ public: bool isQtQuickListView() const; bool isQtQuickGridView() const; bool isQtQuick3DMaterial() const; +<<<<<<< HEAD (8777d4 qds: increase version to 4.7.2) bool isQtQuick3DModel() const; bool isQtQuick3DNode() const; bool isQtQuick3DParticlesAbstractShape() const; @@ -249,6 +250,69 @@ public: bool isVector4D() const; bool isView() const; bool usesCustomParser() 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; + bool isQtQuick3DParticles3DParticle3D(SL sl = {}) const; + bool isQtQuick3DParticles3DParticleEmitter3D(SL sl = {}) const; + bool isQtQuick3DParticles3DSpriteParticle3D(SL sl = {}) const; + bool isQtQuick3DPass(SL sl = {}) const; + bool isQtQuick3DPrincipledMaterial(SL sl = {}) const; + bool isQtQuick3DSpecularGlossyMaterial(SL sl = {}) const; + bool isQtQuick3DSceneEnvironment(SL sl = {}) const; + bool isQtQuick3DShader(SL sl = {}) const; + bool isQtQuick3DTexture(SL sl = {}) const; + bool isQtQuick3DTextureInput(SL sl = {}) const; + bool isQtQuick3DCubeMapTexture(SL sl = {}) const; + bool isQtQuick3DView3D(SL sl = {}) const; + bool isQtQuickBorderImage(SL sl = {}) const; + bool isQtQuickControlsLabel(SL sl = {}) const; + bool isQtQuickControlsSwipeView(SL sl = {}) const; + bool isQtQuickControlsTabBar(SL sl = {}) const; + bool isQtQuickExtrasPicture(SL sl = {}) const; + bool isQtQuickGradient(SL sl = {}) const; + bool isQtQuickImage(SL sl = {}) const; + bool isQtQuickItem(SL sl = {}) const; + bool isQtQuickLayoutsLayout(SL sl = {}) const; + bool isQtQuickLoader(SL sl = {}) const; + bool isQtQuickPath(SL sl = {}) const; + bool isQtQuickPauseAnimation(SL sl = {}) const; + bool isQtQuickPositioner(SL sl = {}) const; + bool isQtQuickPropertyAnimation(SL sl = {}) const; + bool isQtQuickPropertyChanges(SL sl = {}) const; + bool isQtQuickRectangle(SL sl = {}) const; + bool isQtQuickRepeater(SL sl = {}) const; + bool isQtQuickShapesShape(SL sl = {}) const; + bool isQtQuickState(SL sl = {}) const; + bool isQtQuickStateGroup(SL sl = {}) const; + bool isQtQuickStateOperation(SL sl = {}) const; + bool isQtQuickStudioComponentsArcItem(SL sl = {}) const; + bool isQtQuickStudioComponentsGroupItem(SL sl = {}) const; + bool isQtQuickStudioComponentsSvgPathItem(SL sl = {}) const; + bool isQtQuickStudioUtilsJsonListModel(SL sl = {}) const; + bool isQtQuickText(SL sl = {}) const; + bool isQtQuickTimelineKeyframe(SL sl = {}) const; + bool isQtQuickTimelineKeyframeGroup(SL sl = {}) const; + bool isQtQuickTimelineTimeline(SL sl = {}) const; + bool isQtQuickTimelineTimelineAnimation(SL sl = {}) const; + bool isQtQuickTransition(SL sl = {}) const; + bool isQtQuickWindowWindow(SL sl = {}) const; + bool isQtSafeRendererSafePicture(SL sl = {}) const; + bool isQtSafeRendererSafeRendererPicture(SL sl = {}) const; + bool isString(SL sl = {}) const; + bool isSuitableForMouseAreaFill(SL sl = {}) const; + bool isUrl(SL sl = {}) const; + bool isVariant(SL sl = {}) const; + bool isVector2D(SL sl = {}) const; + bool isVector3D(SL sl = {}) const; + bool isVector4D(SL sl = {}) const; + bool isView(SL sl = {}) const; + bool usesCustomParser(SL sl = {}) const; +>>>>>>> CHANGE (472b88 QmlDesigner: Fix drag & drop 3D components into 2D/3D view) bool isEnumeration() const; #ifndef QDS_USE_PROJECTSTORAGE diff --git a/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp index b0320704fc9..5221797a8c5 100644 --- a/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp @@ -4156,7 +4156,30 @@ bool NodeMetaInfo::isQtQuick3DNode() const } } +<<<<<<< HEAD (8777d4 qds: increase version to 4.7.2) bool NodeMetaInfo::isQtQuick3DParticles3DAffector3D() 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 +>>>>>>> CHANGE (472b88 QmlDesigner: Fix drag & drop 3D components into 2D/3D view) { if constexpr (useProjectStorage()) { if (!isValid()) 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 eac261eca8c..2d2c9cbebc6 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/model.cpp @@ -2544,6 +2544,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,