summaryrefslogtreecommitdiffstats
path: root/src/render/picking/qobjectpicker.cpp
diff options
context:
space:
mode:
authorGiulio Camuffo <giulio.camuffo@kdab.com>2019-02-14 17:02:20 +0100
committerGiulio Camuffo <giulio.camuffo@kdab.com>2019-02-25 12:34:36 +0000
commit6cb3fa6f4d7b3a504bba063d964a8a5868559ba5 (patch)
treee3353d12174a8a2ad84b4ceb8ee705ef6900c372 /src/render/picking/qobjectpicker.cpp
parente1f81585c21582abe3b3d0c295b25ef4e3270c14 (diff)
Add a viewport property to QPickEvent
The new property will contain the viewport in which the input event originated. This is useful in cases where an entity with an ObjectPicker visible in multiple viewports wants to react differently based on which viewport was clicked. Change-Id: Ic5fb6393f3c3087cc3f54cd68c025d0e59ec2f20 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/picking/qobjectpicker.cpp')
-rw-r--r--src/render/picking/qobjectpicker.cpp28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/render/picking/qobjectpicker.cpp b/src/render/picking/qobjectpicker.cpp
index a0b6d8dcd..8e9195145 100644
--- a/src/render/picking/qobjectpicker.cpp
+++ b/src/render/picking/qobjectpicker.cpp
@@ -41,8 +41,10 @@
#include "qobjectpicker_p.h"
#include <Qt3DCore/qentity.h>
#include <Qt3DCore/private/qcomponent_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
+#include <Qt3DCore/private/qscene_p.h>
#include <Qt3DRender/qpickevent.h>
+#include <Qt3DRender/QViewport>
+#include <Qt3DRender/private/qpickevent_p.h>
QT_BEGIN_NAMESPACE
@@ -358,17 +360,17 @@ void QObjectPicker::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change)
// to emit the correct signals
const QByteArray propertyName = e->propertyName();
if (propertyName == QByteArrayLiteral("pressed")) {
- QPickEventPtr ev = e->value().value<QPickEventPtr>();
- d->pressedEvent(ev.data());
+ QObjectPickerEvent ev = e->value().value<QObjectPickerEvent>();
+ d->pressedEvent(d->resolvePickEvent(e));
} else if (propertyName == QByteArrayLiteral("released")) {
- QPickEventPtr ev = e->value().value<QPickEventPtr>();
- d->releasedEvent(ev.data());
+ QObjectPickerEvent ev = e->value().value<QObjectPickerEvent>();
+ d->releasedEvent(d->resolvePickEvent(e));
} else if (propertyName == QByteArrayLiteral("clicked")) {
- QPickEventPtr ev = e->value().value<QPickEventPtr>();
- d->clickedEvent(ev.data());
+ QObjectPickerEvent ev = e->value().value<QObjectPickerEvent>();
+ d->clickedEvent(d->resolvePickEvent(e));
} else if (propertyName == QByteArrayLiteral("moved")) {
- QPickEventPtr ev = e->value().value<QPickEventPtr>();
- d->movedEvent(ev.data());
+ QObjectPickerEvent ev = e->value().value<QObjectPickerEvent>();
+ d->movedEvent(d->resolvePickEvent(e));
} else if (propertyName == QByteArrayLiteral("entered")) {
emit entered();
d->setContainsMouse(true);
@@ -407,6 +409,14 @@ void QObjectPickerPrivate::setContainsMouse(bool containsMouse)
}
}
+QPickEvent *QObjectPickerPrivate::resolvePickEvent(Qt3DCore::QPropertyUpdatedChangePtr e)
+{
+ QObjectPickerEvent ev = e->value().value<QObjectPickerEvent>();
+ QPickEvent *pickEvent = ev.event.data();
+ pickEvent->d_func()->m_viewport = static_cast<QViewport *>(scene()->lookupNode(ev.viewportNodeId));
+ return pickEvent;
+}
+
void QObjectPickerPrivate::propagateEvent(QPickEvent *event, EventType type)
{
if (!m_entities.isEmpty()) {