diff options
author | Giulio Camuffo <giulio.camuffo@kdab.com> | 2019-02-14 17:02:20 +0100 |
---|---|---|
committer | Giulio Camuffo <giulio.camuffo@kdab.com> | 2019-02-25 12:34:36 +0000 |
commit | 6cb3fa6f4d7b3a504bba063d964a8a5868559ba5 (patch) | |
tree | e3353d12174a8a2ad84b4ceb8ee705ef6900c372 /src/render/picking/qobjectpicker.cpp | |
parent | e1f81585c21582abe3b3d0c295b25ef4e3270c14 (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.cpp | 28 |
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()) { |