diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-01-05 08:31:25 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-01-24 11:53:00 +0000 |
commit | 3ac5f0c795a91efa975935d889c99052b8bc2137 (patch) | |
tree | cac6376556969ca008ba1e53b063a71cb429aeca /src | |
parent | c9902439780ce197b1e8c75d1c8bd7f97f3f43ae (diff) |
QQuickAbstractButton: handle touch events
This makes it possible to interact with multiple buttons at the same
time.
Change-Id: Ice17efcb8b6dc5337455cd38ee88c39dfef2baae
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/quicktemplates2/qquickabstractbutton.cpp | 60 | ||||
-rw-r--r-- | src/quicktemplates2/qquickabstractbutton_p.h | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickabstractbutton_p_p.h | 3 |
3 files changed, 64 insertions, 1 deletions
diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp index d8810fcd..17e0abea 100644 --- a/src/quicktemplates2/qquickabstractbutton.cpp +++ b/src/quicktemplates2/qquickabstractbutton.cpp @@ -121,6 +121,7 @@ QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate() autoExclusive(false), autoRepeat(false), wasHeld(false), + touchId(-1), holdTimer(0), delayTimer(0), repeatTimer(0), @@ -164,6 +165,7 @@ void QQuickAbstractButtonPrivate::handleRelease(const QPointF &point) Q_Q(QQuickAbstractButton); bool wasPressed = pressed; q->setPressed(false); + touchId = -1; if (!wasHeld && (keepPressed || q->contains(point))) q->nextCheckState(); @@ -189,6 +191,7 @@ void QQuickAbstractButtonPrivate::handleCancel() return; q->setPressed(false); + touchId = -1; stopPressRepeat(); stopPressAndHold(); emit q->canceled(); @@ -659,6 +662,63 @@ void QQuickAbstractButton::timerEvent(QTimerEvent *event) } } +void QQuickAbstractButton::touchEvent(QTouchEvent *event) +{ + Q_D(QQuickAbstractButton); + switch (event->type()) { + case QEvent::TouchBegin: + if (d->touchId == -1) { + const QTouchEvent::TouchPoint point = event->touchPoints().first(); + d->touchId = point.id(); + d->handlePress(point.pos()); + } + break; + + case QEvent::TouchUpdate: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (point.id() != d->touchId) + continue; + + switch (point.state()) { + case Qt::TouchPointPressed: + d->handlePress(point.pos()); + break; + case Qt::TouchPointMoved: + d->handleMove(point.pos()); + break; + case Qt::TouchPointReleased: + d->handleRelease(point.pos()); + break; + default: + break; + } + } + break; + + case QEvent::TouchEnd: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (point.id() == d->touchId) + d->handleRelease(point.pos()); + } + break; + + case QEvent::TouchCancel: + d->handleCancel(); + break; + + default: + QQuickControl::touchEvent(event); + break; + } +} + +void QQuickAbstractButton::touchUngrabEvent() +{ + Q_D(QQuickAbstractButton); + QQuickControl::touchUngrabEvent(); + d->handleCancel(); +} + void QQuickAbstractButton::buttonChange(ButtonChange change) { Q_D(QQuickAbstractButton); diff --git a/src/quicktemplates2/qquickabstractbutton_p.h b/src/quicktemplates2/qquickabstractbutton_p.h index 31b306af..82da94bd 100644 --- a/src/quicktemplates2/qquickabstractbutton_p.h +++ b/src/quicktemplates2/qquickabstractbutton_p.h @@ -125,6 +125,8 @@ protected: void mouseDoubleClickEvent(QMouseEvent *event) override; void mouseUngrabEvent() override; void timerEvent(QTimerEvent *event) override; + void touchEvent(QTouchEvent *event) override; + void touchUngrabEvent() override; enum ButtonChange { ButtonAutoRepeatChange, diff --git a/src/quicktemplates2/qquickabstractbutton_p_p.h b/src/quicktemplates2/qquickabstractbutton_p_p.h index cca7d200..e27f5c82 100644 --- a/src/quicktemplates2/qquickabstractbutton_p_p.h +++ b/src/quicktemplates2/qquickabstractbutton_p_p.h @@ -67,7 +67,7 @@ public: return button->d_func(); } - virtual void handlePress(const QPointF &point, Qt::MouseButton button, Qt::MouseButtons buttons); + virtual void handlePress(const QPointF &point, Qt::MouseButton button = Qt::LeftButton, Qt::MouseButtons buttons = Qt::LeftButton); virtual void handleMove(const QPointF &point); virtual void handleRelease(const QPointF &point); virtual void handleCancel(); @@ -95,6 +95,7 @@ public: bool autoExclusive; bool autoRepeat; bool wasHeld; + int touchId; int holdTimer; int delayTimer; int repeatTimer; |