summaryrefslogtreecommitdiffstats
path: root/src/input
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-06-10 11:21:51 +0200
committerSean Harmer <sean.harmer@kdab.com>2016-06-29 11:09:46 +0000
commitad49c7059caa72343fe85d3e8b7acf3f6264d50f (patch)
tree242c9b5ce887155b091420737ad6787483798c00 /src/input
parentb70cf23d8ccc09419c57d0856f47eb3019c4b22b (diff)
QMouseHandler: fix onPressed/onPressAndHold
wasHeld always returned through on touchpads which resulted in all press event being emitted as pressAndHold events. Change-Id: I0eca2cd123d672f788bea3c7ec52afe44a0383c6 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/input')
-rw-r--r--src/input/frontend/qmousehandler.cpp30
-rw-r--r--src/input/frontend/qmousehandler_p.h7
2 files changed, 25 insertions, 12 deletions
diff --git a/src/input/frontend/qmousehandler.cpp b/src/input/frontend/qmousehandler.cpp
index 969e4db39..c36c550ee 100644
--- a/src/input/frontend/qmousehandler.cpp
+++ b/src/input/frontend/qmousehandler.cpp
@@ -42,6 +42,7 @@
#include "qmousedevice.h"
#include "qmouseevent.h"
#include <Qt3DCore/qpropertyupdatedchange.h>
+#include <QTimer>
QT_BEGIN_NAMESPACE
@@ -53,35 +54,42 @@ QMouseHandlerPrivate::QMouseHandlerPrivate()
: QComponentPrivate()
, m_mouseDevice(nullptr)
, m_containsMouse(false)
+ , m_pressAndHoldTimer(new QTimer)
{
m_shareable = false;
+ m_pressAndHoldTimer->setSingleShot(true);
+ m_pressAndHoldTimer->setInterval(500);
+ QObject::connect(m_pressAndHoldTimer.data(), &QTimer::timeout, [this] {
+ emit q_func()->pressAndHold(m_lastPressedEvent.data());
+ });
}
QMouseHandlerPrivate::~QMouseHandlerPrivate()
{
}
-void QMouseHandlerPrivate::mouseEvent(QMouseEvent *event)
+void QMouseHandlerPrivate::mouseEvent(const QMouseEventPtr &event)
{
Q_Q(QMouseHandler);
switch (event->type()) {
- case QEvent::MouseButtonPress:
- if (event->wasHeld())
- emit q->pressAndHold(event);
- else
- emit q->pressed(event);
+ case QEvent::MouseButtonPress: {
+ m_lastPressedEvent = event;
+ m_pressAndHoldTimer->start();
+ emit q->pressed(event.data());
break;
+ }
case QEvent::MouseButtonRelease:
- emit q->released(event);
+ m_pressAndHoldTimer->stop();
+ emit q->released(event.data());
break;
case Qt::TapGesture:
- emit q->clicked(event);
+ emit q->clicked(event.data());
break;
case QEvent::MouseButtonDblClick:
- emit q->doubleClicked(event);
+ emit q->doubleClicked(event.data());
break;
case QEvent::MouseMove:
- emit q->positionChanged(event);
+ emit q->positionChanged(event.data());
break;
default:
break;
@@ -285,7 +293,7 @@ void QMouseHandler::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change)
if (e->type() == PropertyUpdated) {
if (e->propertyName() == QByteArrayLiteral("mouse")) {
QMouseEventPtr ev = e->value().value<QMouseEventPtr>();
- d->mouseEvent(ev.data());
+ d->mouseEvent(ev);
} else if (e->propertyName() == QByteArrayLiteral("wheel")) {
QWheelEventPtr ev = e->value().value<QWheelEventPtr>();
emit wheel(ev.data());
diff --git a/src/input/frontend/qmousehandler_p.h b/src/input/frontend/qmousehandler_p.h
index a35fcb5d7..2d82ca1ad 100644
--- a/src/input/frontend/qmousehandler_p.h
+++ b/src/input/frontend/qmousehandler_p.h
@@ -52,9 +52,12 @@
//
#include <private/qcomponent_p.h>
+#include <Qt3DInput/qmouseevent.h>
QT_BEGIN_NAMESPACE
+class QTimer;
+
namespace Qt3DInput {
class QMouseHandler;
@@ -68,8 +71,10 @@ public:
QMouseDevice *m_mouseDevice;
bool m_containsMouse;
+ QScopedPointer<QTimer> m_pressAndHoldTimer;
+ QMouseEventPtr m_lastPressedEvent;
- void mouseEvent(Qt3DInput::QMouseEvent *event);
+ void mouseEvent(const QMouseEventPtr &event);
Q_DECLARE_PUBLIC(QMouseHandler)
};