aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-01-05 08:31:25 +0100
committerJ-P Nurmi <jpnurmi@qt.io>2017-01-24 11:53:00 +0000
commit3ac5f0c795a91efa975935d889c99052b8bc2137 (patch)
treecac6376556969ca008ba1e53b063a71cb429aeca /src
parentc9902439780ce197b1e8c75d1c8bd7f97f3f43ae (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.cpp60
-rw-r--r--src/quicktemplates2/qquickabstractbutton_p.h2
-rw-r--r--src/quicktemplates2/qquickabstractbutton_p_p.h3
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;