summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2016-02-18 15:09:49 +0000
committerMike Krus <mike.krus@kdab.com>2016-02-19 17:12:28 +0000
commit98e554e08b778307e51188bb01545ca0bf415325 (patch)
tree4acddd461f8d54f985ff1a5b22d4710343a23035
parente235efeb4ab24b8041583f5ab4e74bb7fea7a45b (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.cpp7
-rw-r--r--src/render/picking/objectpicker.cpp30
-rw-r--r--src/render/picking/objectpicker_p.h5
-rw-r--r--src/render/picking/pickeventfilter.cpp3
-rw-r--r--src/render/picking/qobjectpicker.cpp48
-rw-r--r--src/render/picking/qobjectpicker.h5
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);