forked from qt-creator/qt-creator
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:
@@ -428,23 +428,26 @@ void Qt5InformationNodeInstanceServer::getNodeAtPos([[maybe_unused]] const QPoin
|
|||||||
if (!helper)
|
if (!helper)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QQmlProperty editViewProp(m_editView3DData.rootItem, "activeEditView", context());
|
// Non-model nodes with icon gizmos are also valid results.
|
||||||
QObject *obj = qvariant_cast<QObject *>(editViewProp.read());
|
|
||||||
QQuick3DViewport *editView = qobject_cast<QQuick3DViewport *>(obj);
|
|
||||||
|
|
||||||
// Non-model nodes with icon gizmos are also valid results
|
|
||||||
QVariant gizmoVar;
|
QVariant gizmoVar;
|
||||||
QMetaObject::invokeMethod(m_editView3DData.rootItem, "gizmoAt", Qt::DirectConnection,
|
QMetaObject::invokeMethod(m_editView3DData.rootItem, "gizmoAt", Qt::DirectConnection,
|
||||||
Q_RETURN_ARG(QVariant, gizmoVar),
|
Q_RETURN_ARG(QVariant, gizmoVar),
|
||||||
Q_ARG(QVariant, pos.x()),
|
Q_ARG(QVariant, pos.x()),
|
||||||
Q_ARG(QVariant, pos.y()));
|
Q_ARG(QVariant, pos.y()));
|
||||||
QObject *gizmoObj = qvariant_cast<QObject *>(gizmoVar);
|
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;
|
qint32 instanceId = -1;
|
||||||
|
|
||||||
if (gizmoObj && hasInstanceForObject(gizmoObj)) {
|
if (gizmoObj && hasInstanceForObject(gizmoObj)) {
|
||||||
instanceId = instanceForObject(gizmoObj).instanceId();
|
instanceId = instanceForObject(gizmoObj).instanceId();
|
||||||
} else {
|
} 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);
|
QObject *resolvedPick = helper->resolvePick(hitModel);
|
||||||
if (hasInstanceForObject(resolvedPick))
|
if (hasInstanceForObject(resolvedPick))
|
||||||
instanceId = instanceForObject(resolvedPick).instanceId();
|
instanceId = instanceForObject(resolvedPick).instanceId();
|
||||||
@@ -456,7 +459,7 @@ void Qt5InformationNodeInstanceServer::getNodeAtPos([[maybe_unused]] const QPoin
|
|||||||
Internal::MouseArea3D ma;
|
Internal::MouseArea3D ma;
|
||||||
ma.setView3D(editView);
|
ma.setView3D(editView);
|
||||||
ma.setEulerRotation({90, 0, 0}); // Default grid plane (XZ plane)
|
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
|
const float limit = 10000000; // Remove extremes on nearly parallel plane
|
||||||
if (!qFuzzyCompare(planePos.z(), -1.f) && qAbs(planePos.x()) < limit && qAbs(planePos.y()) < limit)
|
if (!qFuzzyCompare(planePos.z(), -1.f) && qAbs(planePos.x()) < limit && qAbs(planePos.y()) < limit)
|
||||||
pos3d = {planePos.x(), 0, planePos.y()};
|
pos3d = {planePos.x(), 0, planePos.y()};
|
||||||
|
|||||||
Reference in New Issue
Block a user