QmlDesigner: Fix getNodeAtPos for 3D view when the view is split

Fixes: QDS-11019
Change-Id: If18404204f9fd550c79cfa1f22d7adec5fac2595
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Miikka Heikkinen
2023-10-24 16:00:39 +03:00
parent 224a2564d6
commit 8e033db46f

View File

@@ -428,23 +428,26 @@ void Qt5InformationNodeInstanceServer::getNodeAtPos([[maybe_unused]] const QPoin
if (!helper)
return;
QQmlProperty editViewProp(m_editView3DData.rootItem, "activeEditView", context());
QObject *obj = qvariant_cast<QObject *>(editViewProp.read());
QQuick3DViewport *editView = qobject_cast<QQuick3DViewport *>(obj);
// Non-model nodes with icon gizmos are also valid results
// Non-model nodes with icon gizmos are also valid results.
QVariant gizmoVar;
QMetaObject::invokeMethod(m_editView3DData.rootItem, "gizmoAt", Qt::DirectConnection,
Q_RETURN_ARG(QVariant, gizmoVar),
Q_ARG(QVariant, pos.x()),
Q_ARG(QVariant, pos.y()));
QObject *gizmoObj = qvariant_cast<QObject *>(gizmoVar);
// gizmoAt() call above will update the activeEditView
QQmlProperty editViewProp(m_editView3DData.rootItem, "activeEditView", context());
QObject *obj = qvariant_cast<QObject *>(editViewProp.read());
QQuick3DViewport *editView = qobject_cast<QQuick3DViewport *>(obj);
QPointF mappedPos = m_editView3DData.rootItem->mapToItem(editView, pos);
qint32 instanceId = -1;
if (gizmoObj && hasInstanceForObject(gizmoObj)) {
instanceId = instanceForObject(gizmoObj).instanceId();
} else {
QQuick3DModel *hitModel = helper->pickViewAt(editView, pos.x(), pos.y()).objectHit();
QQuick3DModel *hitModel = helper->pickViewAt(editView, mappedPos.x(), mappedPos.y()).objectHit();
QObject *resolvedPick = helper->resolvePick(hitModel);
if (hasInstanceForObject(resolvedPick))
instanceId = instanceForObject(resolvedPick).instanceId();
@@ -456,7 +459,7 @@ void Qt5InformationNodeInstanceServer::getNodeAtPos([[maybe_unused]] const QPoin
Internal::MouseArea3D ma;
ma.setView3D(editView);
ma.setEulerRotation({90, 0, 0}); // Default grid plane (XZ plane)
QVector3D planePos = ma.getMousePosInPlane(nullptr, pos);
QVector3D planePos = ma.getMousePosInPlane(nullptr, mappedPos);
const float limit = 10000000; // Remove extremes on nearly parallel plane
if (!qFuzzyCompare(planePos.z(), -1.f) && qAbs(planePos.x()) < limit && qAbs(planePos.y()) < limit)
pos3d = {planePos.x(), 0, planePos.y()};