aboutsummaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2021-12-03 16:30:35 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2021-12-07 08:18:35 +0000
commiteba2a0520bb322be7e9c5e5612edc44b1fe6e6a5 (patch)
treeac58855ef39ee82d9f00946d1e578a921673d947 /share
parent9b4e68dd842618ab96f8a63f75ee65f5756283b7 (diff)
QmlDesigner: Fix picking issues
We now check also the parent chain for pickability, because a node is not pickable if one of the ancestors is not pickable, as all properties picking depends on (visibility, locked state) are implicitly inherited by descendants. Rotate gizmo rings default to regular View3D picking when the angle is so steep that the plane intersection is not reliable. With new global picking enabled handling we need to check all hits instead of just the first one. Change-Id: Ib1aa604b06f7db1041f5d4c3019cc2badf29a20f Fixes: QDS-5679 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Diffstat (limited to 'share')
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp18
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h6
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp12
3 files changed, 27 insertions, 9 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
index 8c63262514..4d6c87a901 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
@@ -337,7 +337,7 @@ void GeneralHelper::unregisterGizmoTarget(QQuick3DNode *node)
}
}
-bool GeneralHelper::isLocked(QQuick3DNode *node)
+bool GeneralHelper::isLocked(QQuick3DNode *node) const
{
if (node) {
QVariant lockValue = node->property("_edit3dLocked");
@@ -346,7 +346,7 @@ bool GeneralHelper::isLocked(QQuick3DNode *node)
return false;
}
-bool GeneralHelper::isHidden(QQuick3DNode *node)
+bool GeneralHelper::isHidden(QQuick3DNode *node) const
{
if (node) {
QVariant hideValue = node->property("_edit3dHidden");
@@ -355,8 +355,18 @@ bool GeneralHelper::isHidden(QQuick3DNode *node)
return false;
}
-bool GeneralHelper::isPickable(QQuick3DNode *node) {
- return (node && !isLocked(node) && !isHidden(node) && node->visible());
+bool GeneralHelper::isPickable(QQuick3DNode *node) const
+{
+ if (!node)
+ return false;
+
+ QQuick3DNode *n = node;
+ while (n) {
+ if (!n->visible() || isLocked(n) || isHidden(n))
+ return false;
+ n = n->parentNode();
+ }
+ return true;
}
void GeneralHelper::storeToolState(const QString &sceneId, const QString &tool, const QVariant &state,
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
index 381082415b..4751bb3d31 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
@@ -80,9 +80,9 @@ public:
Q_INVOKABLE void registerGizmoTarget(QQuick3DNode *node);
Q_INVOKABLE void unregisterGizmoTarget(QQuick3DNode *node);
- Q_INVOKABLE bool isLocked(QQuick3DNode *node);
- Q_INVOKABLE bool isHidden(QQuick3DNode *node);
- Q_INVOKABLE bool isPickable(QQuick3DNode *node);
+ Q_INVOKABLE bool isLocked(QQuick3DNode *node) const;
+ Q_INVOKABLE bool isHidden(QQuick3DNode *node) const;
+ Q_INVOKABLE bool isPickable(QQuick3DNode *node) const;
Q_INVOKABLE void storeToolState(const QString &sceneId, const QString &tool,
const QVariant &state, int delayEmit = 0);
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
index ef0dd33fba..4182dcadf1 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
@@ -898,8 +898,16 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
// a problem
onCircle = false;
if (m_pickNode) {
- QQuick3DPickResult pr = m_view3D->pick(float(mousePos.x()), float(mousePos.y()));
- pickSuccess = pr.objectHit() == m_pickNode;
+ // We need to pick all as various other geometries can often be the first
+ // pick result, such as camera frustum or light geometry
+ const QList<QQuick3DPickResult> results = m_view3D->pickAll(float(mousePos.x()),
+ float(mousePos.y()));
+ for (const auto &pr : results) {
+ if (pr.objectHit() == m_pickNode) {
+ pickSuccess = true;
+ break;
+ }
+ }
}
}
}