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 <miikka.heikkinen@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
(cherry picked from commit 472b888112)
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Rafal Andrusieczko
2025-04-25 19:19:16 +02:00
committed by Tim Jenssen
parent 3d7e76b3ad
commit ae478b557a
6 changed files with 110 additions and 0 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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<QtQuick3D, Object3D>(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())

View File

@@ -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<QString, QString> 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});
}

View File

@@ -2544,6 +2544,16 @@ NodeMetaInfo Model::qtQuick3DNodeMetaInfo() const
}
}
NodeMetaInfo Model::qtQuick3DObject3DMetaInfo() const
{
if constexpr (useProjectStorage()) {
using namespace Storage::Info;
return createNodeMetaInfo<QtQuick3D, Object3D>();
} else {
return metaInfo("QtQuick3D.Object3D");
}
}
NodeMetaInfo Model::qtQuick3DPointLightMetaInfo() const
{
if constexpr (useProjectStorage()) {

View File

@@ -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<QtQuick3D, ModuleKind::QmlLibrary, Material>,
CacheType<QtQuick3D, ModuleKind::QmlLibrary, Model>,
CacheType<QtQuick3D, ModuleKind::QmlLibrary, Node>,
CacheType<QtQuick3D, ModuleKind::QmlLibrary, Object3D>,
CacheType<QtQuick3D, ModuleKind::QmlLibrary, OrthographicCamera>,
CacheType<QtQuick3D, ModuleKind::QmlLibrary, Pass>,
CacheType<QtQuick3D, ModuleKind::QmlLibrary, PerspectiveCamera>,