aboutsummaryrefslogtreecommitdiffstats
path: root/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2021-09-06 14:24:23 +0300
committerKaj Grönholm <kaj.gronholm@qt.io>2021-10-14 04:08:33 +0000
commitd8a7c97fcb644a90991904dc7be1f612e2d35ef7 (patch)
tree879e920d3678a3489c4ce35d9157c54c30380874 /share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d
parent7c2121bcfdff8a652b9cb6d190829af0be62cf5f (diff)
Use global picking API
When gobal picking is available (Qt 6.2+), use that instead of toggling models pickable properties. Task-number: QDS-4978 Change-Id: Id2a501ae97955128874447fa8a3b8afab3d1f2c7 Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d')
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp29
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h3
2 files changed, 32 insertions, 0 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
index 02e6f2df59..d3a8b4e8f5 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
@@ -267,6 +267,31 @@ void GeneralHelper::delayedPropertySet(QObject *obj, int delay, const QString &p
});
}
+// Returns the first valid QQuick3DPickResult from view at (posX, PosY).
+QQuick3DPickResult GeneralHelper::pickViewAt(QQuick3DViewport *view, float posX, float posY)
+{
+ if (!view)
+ return QQuick3DPickResult();
+
+#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 1)
+ // Make sure global picking is on
+ view->setGlobalPickingEnabled(true);
+
+ // With Qt 6.2+, select first suitable result from all picked objects
+ auto pickResults = view->pickAll(posX, posY);
+ for (auto pickResult : pickResults) {
+ if (isPickable(pickResult.objectHit()))
+ return pickResult;
+ }
+#else
+ // With older Qt version we'll just pick the single object
+ auto pickResult = view->pick(posX, posY);
+ if (isPickable(pickResult.objectHit()))
+ return pickResult;
+#endif
+ return QQuick3DPickResult();
+}
+
QQuick3DNode *GeneralHelper::resolvePick(QQuick3DNode *pickNode)
{
if (pickNode) {
@@ -315,6 +340,10 @@ bool GeneralHelper::isHidden(QQuick3DNode *node)
return false;
}
+bool GeneralHelper::isPickable(QQuick3DNode *node) {
+ return (node && !isLocked(node) && !isHidden(node) && node->visible());
+}
+
void GeneralHelper::storeToolState(const QString &sceneId, const QString &tool, const QVariant &state,
int delay)
{
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
index 6e888980f8..c22f310edd 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
@@ -35,6 +35,7 @@
#include <QTimer>
#include <QVariant>
#include <QVector3D>
+#include <QtQuick3D/private/qquick3dpickresult_p.h>
QT_BEGIN_NAMESPACE
class QQuick3DCamera;
@@ -74,12 +75,14 @@ public:
Q_INVOKABLE bool fuzzyCompare(double a, double b);
Q_INVOKABLE void delayedPropertySet(QObject *obj, int delay, const QString &property,
const QVariant& value);
+ Q_INVOKABLE QQuick3DPickResult pickViewAt(QQuick3DViewport *view, float posX, float posY);
Q_INVOKABLE QQuick3DNode *resolvePick(QQuick3DNode *pickNode);
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 void storeToolState(const QString &sceneId, const QString &tool,
const QVariant &state, int delayEmit = 0);