diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-06-10 11:21:51 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-06-29 11:09:46 +0000 |
commit | ad49c7059caa72343fe85d3e8b7acf3f6264d50f (patch) | |
tree | 242c9b5ce887155b091420737ad6787483798c00 /src/input | |
parent | b70cf23d8ccc09419c57d0856f47eb3019c4b22b (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.cpp | 30 | ||||
-rw-r--r-- | src/input/frontend/qmousehandler_p.h | 7 |
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) }; |