diff options
author | Mike Krus <mike.krus@kdab.com> | 2016-02-18 15:09:49 +0000 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2016-02-19 17:12:28 +0000 |
commit | 98e554e08b778307e51188bb01545ca0bf415325 (patch) | |
tree | 4acddd461f8d54f985ff1a5b22d4710343a23035 | |
parent | e235efeb4ab24b8041583f5ab4e74bb7fea7a45b (diff) |
Do picking on mouse move
If enabled (mouseTrackingEnabled), then do picking as the mouse
moves across an object (pick needs to succeed on mouse pressed)
Change-Id: I062d003c0461f48fa32e280543e41cea0a8668a8
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/render/jobs/pickboundingvolumejob.cpp | 7 | ||||
-rw-r--r-- | src/render/picking/objectpicker.cpp | 30 | ||||
-rw-r--r-- | src/render/picking/objectpicker_p.h | 5 | ||||
-rw-r--r-- | src/render/picking/pickeventfilter.cpp | 3 | ||||
-rw-r--r-- | src/render/picking/qobjectpicker.cpp | 48 | ||||
-rw-r--r-- | src/render/picking/qobjectpicker.h | 5 |
6 files changed, 93 insertions, 5 deletions
diff --git a/src/render/jobs/pickboundingvolumejob.cpp b/src/render/jobs/pickboundingvolumejob.cpp index 7d5432c02..6c3ee5e39 100644 --- a/src/render/jobs/pickboundingvolumejob.cpp +++ b/src/render/jobs/pickboundingvolumejob.cpp @@ -385,8 +385,13 @@ void PickBoundingVolumeJob::run() break; } - case QEvent::HoverMove: case QEvent::MouseMove: { + if (objectPicker->isPressed() && objectPicker->mouseTrackingEnabled()) { + objectPicker->onMoved(pickEvent); + } + // fallthrough + } + case QEvent::HoverMove: { if (!m_hoveredPickers.contains(objectPickerHandle)) { if (objectPicker->hoverEnabled()) { // Send entered event to objectPicker diff --git a/src/render/picking/objectpicker.cpp b/src/render/picking/objectpicker.cpp index dbcfa3878..a1343a204 100644 --- a/src/render/picking/objectpicker.cpp +++ b/src/render/picking/objectpicker.cpp @@ -53,7 +53,9 @@ namespace Render { ObjectPicker::ObjectPicker() : QBackendNode(QBackendNode::ReadWrite) , m_isDirty(false) + , m_isPressed(false) , m_hoverEnabled(false) + , m_mouseTrackingEnabled(false) { } @@ -64,7 +66,9 @@ ObjectPicker::~ObjectPicker() void ObjectPicker::cleanup() { m_isDirty = false; + m_isPressed = false; m_hoverEnabled = false; + m_mouseTrackingEnabled = false; } void ObjectPicker::updateFromPeer(Qt3DCore::QNode *peer) @@ -72,6 +76,7 @@ void ObjectPicker::updateFromPeer(Qt3DCore::QNode *peer) QObjectPicker *picker = static_cast<QObjectPicker *>(peer); if (picker) { m_hoverEnabled = picker->hoverEnabled(); + m_mouseTrackingEnabled = picker->mouseTrackingEnabled(); m_isDirty = true; } } @@ -86,6 +91,10 @@ void ObjectPicker::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_hoverEnabled = propertyChange->value().toBool(); m_isDirty = true; } + if (propertyName == QByteArrayLiteral("mouseTrackingEnabled")) { + m_mouseTrackingEnabled = propertyChange->value().toBool(); + m_isDirty = true; + } } } @@ -94,6 +103,11 @@ bool ObjectPicker::isDirty() const return m_isDirty; } +bool ObjectPicker::isPressed() const +{ + return m_isPressed; +} + void ObjectPicker::unsetDirty() { m_isDirty = false; @@ -109,6 +123,11 @@ bool ObjectPicker::hoverEnabled() const return m_hoverEnabled; } +bool ObjectPicker::mouseTrackingEnabled() const +{ + return m_mouseTrackingEnabled; +} + void ObjectPicker::onClicked(QPickEventPtr event) { Qt3DCore::QBackendScenePropertyChangePtr e(new Qt3DCore::QBackendScenePropertyChange(Qt3DCore::NodeUpdated, peerUuid())); @@ -118,12 +137,22 @@ void ObjectPicker::onClicked(QPickEventPtr event) notifyObservers(e); } +void ObjectPicker::onMoved(QPickEventPtr event) +{ + Qt3DCore::QBackendScenePropertyChangePtr e(new Qt3DCore::QBackendScenePropertyChange(Qt3DCore::NodeUpdated, peerUuid())); + e->setPropertyName("moved"); + e->setTargetNode(peerUuid()); + e->setValue(QVariant::fromValue(event)); + notifyObservers(e); +} + void ObjectPicker::onPressed(QPickEventPtr event) { Qt3DCore::QBackendScenePropertyChangePtr e(new Qt3DCore::QBackendScenePropertyChange(Qt3DCore::NodeUpdated, peerUuid())); e->setPropertyName("pressed"); e->setTargetNode(peerUuid()); e->setValue(QVariant::fromValue(event)); + m_isPressed = true; notifyObservers(e); } @@ -133,6 +162,7 @@ void ObjectPicker::onReleased(QPickEventPtr event) e->setPropertyName("released"); e->setTargetNode(peerUuid()); e->setValue(QVariant::fromValue(event)); + m_isPressed = false; notifyObservers(e); } diff --git a/src/render/picking/objectpicker_p.h b/src/render/picking/objectpicker_p.h index 264920844..e56fd6ba5 100644 --- a/src/render/picking/objectpicker_p.h +++ b/src/render/picking/objectpicker_p.h @@ -72,11 +72,14 @@ public: void updateFromPeer(Qt3DCore::QNode *peer) Q_DECL_FINAL; void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_FINAL; bool isDirty() const; + bool isPressed() const; void unsetDirty(); void makeDirty(); bool hoverEnabled() const; + bool mouseTrackingEnabled() const; void onClicked(QPickEventPtr event); + void onMoved(QPickEventPtr event); void onPressed(QPickEventPtr event); void onReleased(QPickEventPtr event); void onEntered(); @@ -84,7 +87,9 @@ public: private: bool m_isDirty; + bool m_isPressed; bool m_hoverEnabled; + bool m_mouseTrackingEnabled; }; } // Render diff --git a/src/render/picking/pickeventfilter.cpp b/src/render/picking/pickeventfilter.cpp index eff42a596..a1ae52068 100644 --- a/src/render/picking/pickeventfilter.cpp +++ b/src/render/picking/pickeventfilter.cpp @@ -80,8 +80,7 @@ bool PickEventFilter::eventFilter(QObject *obj, QEvent *e) case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseMove: - case QEvent::HoverMove: - case Qt::TapGesture: { + case QEvent::HoverMove: { QMutexLocker locker(&m_mutex); m_pendingEvents.push_back(QMouseEvent(*static_cast<QMouseEvent *>(e))); } diff --git a/src/render/picking/qobjectpicker.cpp b/src/render/picking/qobjectpicker.cpp index 5b2b1a96b..bb80d64fc 100644 --- a/src/render/picking/qobjectpicker.cpp +++ b/src/render/picking/qobjectpicker.cpp @@ -54,7 +54,7 @@ namespace Qt3DRender { \brief The QObjectPicker class instantiates a component that can be used to interact with a QEntity by a process known as picking. - The signals pressed(), released(), clicked(), entered(), and exited() are + The signals pressed(), released(), clicked(), moved(), entered(), and exited() are emitted when the bounding volume defined by the pickAttribute property intersects with a ray. @@ -77,6 +77,10 @@ namespace Qt3DRender { */ /*! + \qmlsignal Qt3D.Render::ObjectPicker::moved() +*/ + +/*! \qmlsignal Qt3D.Render::ObjectPicker::entered() */ @@ -90,6 +94,7 @@ public: QObjectPickerPrivate() : QComponentPrivate() , m_hoverEnabled(false) + , m_mouseTrackingEnabled(false) , m_pressed(false) , m_containsMouse(false) , m_acceptedLastPressedEvent(true) @@ -99,6 +104,7 @@ public: Q_DECLARE_PUBLIC(QObjectPicker) bool m_hoverEnabled; + bool m_mouseTrackingEnabled; bool m_pressed; bool m_containsMouse; bool m_acceptedLastPressedEvent; @@ -106,13 +112,15 @@ public: enum EventType { Pressed, Released, - Clicked + Clicked, + Moved }; void propagateEvent(QPickEvent *event, EventType type); void pressedEvent(QPickEvent *event); void clickedEvent(QPickEvent *event); + void movedEvent(QPickEvent *event); void releasedEvent(QPickEvent *event); }; @@ -144,6 +152,24 @@ bool QObjectPicker::hoverEnabled() const return d->m_hoverEnabled; } +void QObjectPicker::setMouseTrackingEnabled(bool mouseTrackingEnabled) +{ + Q_D(QObjectPicker); + if (mouseTrackingEnabled != d->m_mouseTrackingEnabled) { + d->m_mouseTrackingEnabled = mouseTrackingEnabled; + emit mouseTrackingEnabledChanged(mouseTrackingEnabled); + } +} + +/*! + \qmlproperty bool Qt3D.Render::ObjectPicker::mouseTrackingEnabled +*/ +bool QObjectPicker::mouseTrackingEnabled() const +{ + Q_D(const QObjectPicker); + return d->m_mouseTrackingEnabled; +} + /*! \qmlproperty bool Qt3D.Render::ObjectPicker::containsMouse */ @@ -167,6 +193,7 @@ void QObjectPicker::copy(const QNode *ref) QComponent::copy(ref); const QObjectPicker *picker = static_cast<const QObjectPicker *>(ref); d_func()->m_hoverEnabled = picker->d_func()->m_hoverEnabled; + d_func()->m_mouseTrackingEnabled = picker->d_func()->m_mouseTrackingEnabled; } void QObjectPicker::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) @@ -186,6 +213,9 @@ void QObjectPicker::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) } else if (propertyName == QByteArrayLiteral("clicked")) { QPickEventPtr ev = e->value().value<QPickEventPtr>(); d->clickedEvent(ev.data()); + } else if (propertyName == QByteArrayLiteral("moved")) { + QPickEventPtr ev = e->value().value<QPickEventPtr>(); + d->movedEvent(ev.data()); } else if (propertyName == QByteArrayLiteral("entered")) { emit entered(); setContainsMouse(true); @@ -242,6 +272,9 @@ void QObjectPickerPrivate::propagateEvent(QPickEvent *event, EventType type) case EventType::Clicked: objectPickerPrivate->clickedEvent(event); break; + case EventType::Moved: + objectPickerPrivate->movedEvent(event); + break; } break; } @@ -282,6 +315,17 @@ void QObjectPickerPrivate::clickedEvent(QPickEvent *event) /*! \internal */ +void QObjectPickerPrivate::movedEvent(QPickEvent *event) +{ + Q_Q(QObjectPicker); + emit q->moved(event); + if (!event->isAccepted()) + propagateEvent(event, EventType::Moved); +} + +/*! + \internal + */ void QObjectPickerPrivate::releasedEvent(QPickEvent *event) { Q_Q(QObjectPicker); diff --git a/src/render/picking/qobjectpicker.h b/src/render/picking/qobjectpicker.h index a0ebfeee6..af31297f7 100644 --- a/src/render/picking/qobjectpicker.h +++ b/src/render/picking/qobjectpicker.h @@ -55,6 +55,7 @@ class QT3DRENDERSHARED_EXPORT QObjectPicker : public Qt3DCore::QComponent { Q_OBJECT Q_PROPERTY(bool hoverEnabled READ hoverEnabled WRITE setHoverEnabled NOTIFY hoverEnabledChanged) + Q_PROPERTY(bool mouseTrackingEnabled READ mouseTrackingEnabled WRITE setMouseTrackingEnabled NOTIFY mouseTrackingEnabledChanged) Q_PROPERTY(bool pressed READ isPressed NOTIFY pressedChanged) Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged) @@ -63,20 +64,24 @@ public: ~QObjectPicker(); bool hoverEnabled() const; + bool mouseTrackingEnabled() const; bool containsMouse() const; bool isPressed() const; public Q_SLOTS: void setHoverEnabled(bool hoverEnabled); + void setMouseTrackingEnabled(bool mouseTrackingEnabled); Q_SIGNALS: void pressed(Qt3DRender::QPickEvent *pick); void released(Qt3DRender::QPickEvent *pick); void clicked(Qt3DRender::QPickEvent *pick); + void moved(Qt3DRender::QPickEvent *pick); void entered(); void exited(); void hoverEnabledChanged(bool hoverEnabled); + void mouseTrackingEnabledChanged(bool mouseTrackingEnabled); void pressedChanged(bool pressed); void containsMouseChanged(bool containsMouse); |