diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-01-24 11:26:08 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-01-24 15:02:57 +0000 |
commit | 5d1e3348c1e65f78e70be0c7a6dad58b57da33d9 (patch) | |
tree | 86178c0d2f29a379c87bf19284481179d62c360a | |
parent | 13c0330511a54ad44a5f8bcad92738d6d652119b (diff) |
QQuickSpinBox: handle touch events
This makes it possible to interact with multiple spin boxes at the same
time.
Change-Id: I7161a05303384711c30651b495851d7e953e9e3f
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r-- | src/quicktemplates2/qquickspinbox.cpp | 107 | ||||
-rw-r--r-- | src/quicktemplates2/qquickspinbox_p.h | 3 |
2 files changed, 73 insertions, 37 deletions
diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index d8d34d28..e74c0497 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -114,6 +114,7 @@ public: stepSize(1), delayTimer(0), repeatTimer(0), + touchId(-1), up(nullptr), down(nullptr), validator(nullptr), @@ -137,10 +138,10 @@ public: void startPressRepeat(); void stopPressRepeat(); - bool handleMousePressEvent(QQuickItem *child, QMouseEvent *event); - bool handleMouseMoveEvent(QQuickItem *child, QMouseEvent *event); - bool handleMouseReleaseEvent(QQuickItem *child, QMouseEvent *event); - bool handleMouseUngrabEvent(QQuickItem *child); + bool handlePress(const QPointF &point); + bool handleMove(const QPointF &point); + bool handleRelease(const QPointF &point); + bool handleUngrab(); bool editable; int from; @@ -149,6 +150,7 @@ public: int stepSize; int delayTimer; int repeatTimer; + int touchId; QQuickSpinButton *up; QQuickSpinButton *down; QValidator *validator; @@ -271,13 +273,13 @@ void QQuickSpinBoxPrivate::stopPressRepeat() } } -bool QQuickSpinBoxPrivate::handleMousePressEvent(QQuickItem *child, QMouseEvent *event) +bool QQuickSpinBoxPrivate::handlePress(const QPointF &point) { Q_Q(QQuickSpinBox); QQuickItem *ui = up->indicator(); QQuickItem *di = down->indicator(); - up->setPressed(ui && ui->isEnabled() && ui->contains(ui->mapFromItem(child, event->pos()))); - down->setPressed(di && di->isEnabled() && di->contains(di->mapFromItem(child, event->pos()))); + up->setPressed(ui && ui->isEnabled() && ui->contains(ui->mapFromItem(q, point))); + down->setPressed(di && di->isEnabled() && di->contains(di->mapFromItem(q, point))); bool pressed = up->isPressed() || down->isPressed(); q->setAccessibleProperty("pressed", pressed); @@ -286,13 +288,13 @@ bool QQuickSpinBoxPrivate::handleMousePressEvent(QQuickItem *child, QMouseEvent return pressed; } -bool QQuickSpinBoxPrivate::handleMouseMoveEvent(QQuickItem *child, QMouseEvent *event) +bool QQuickSpinBoxPrivate::handleMove(const QPointF &point) { Q_Q(QQuickSpinBox); QQuickItem *ui = up->indicator(); QQuickItem *di = down->indicator(); - up->setPressed(ui && ui->isEnabled() && ui->contains(ui->mapFromItem(child, event->pos()))); - down->setPressed(di && di->isEnabled() && di->contains(di->mapFromItem(child, event->pos()))); + up->setPressed(ui && ui->isEnabled() && ui->contains(ui->mapFromItem(q, point))); + down->setPressed(di && di->isEnabled() && di->contains(di->mapFromItem(q, point))); bool pressed = up->isPressed() || down->isPressed(); q->setAccessibleProperty("pressed", pressed); @@ -301,7 +303,7 @@ bool QQuickSpinBoxPrivate::handleMouseMoveEvent(QQuickItem *child, QMouseEvent * return pressed; } -bool QQuickSpinBoxPrivate::handleMouseReleaseEvent(QQuickItem *child, QMouseEvent *event) +bool QQuickSpinBoxPrivate::handleRelease(const QPointF &point) { Q_Q(QQuickSpinBox); QQuickItem *ui = up->indicator(); @@ -311,27 +313,29 @@ bool QQuickSpinBoxPrivate::handleMouseReleaseEvent(QQuickItem *child, QMouseEven bool wasPressed = up->isPressed() || down->isPressed(); if (up->isPressed()) { up->setPressed(false); - if (repeatTimer <= 0 && ui && ui->contains(ui->mapFromItem(child, event->pos()))) + if (repeatTimer <= 0 && ui && ui->contains(ui->mapFromItem(q, point))) q->increase(); } else if (down->isPressed()) { down->setPressed(false); - if (repeatTimer <= 0 && di && di->contains(di->mapFromItem(child, event->pos()))) + if (repeatTimer <= 0 && di && di->contains(di->mapFromItem(q, point))) q->decrease(); } if (value != oldValue) emit q->valueModified(); + touchId = -1; q->setAccessibleProperty("pressed", false); stopPressRepeat(); return wasPressed; } -bool QQuickSpinBoxPrivate::handleMouseUngrabEvent(QQuickItem *) +bool QQuickSpinBoxPrivate::handleUngrab() { Q_Q(QQuickSpinBox); up->setPressed(false); down->setPressed(false); + touchId = -1; q->setAccessibleProperty("pressed", false); stopPressRepeat(); return false; @@ -775,49 +779,32 @@ void QQuickSpinBox::keyReleaseEvent(QKeyEvent *event) setAccessibleProperty("pressed", false); } -bool QQuickSpinBox::childMouseEventFilter(QQuickItem *child, QEvent *event) -{ - Q_D(QQuickSpinBox); - switch (event->type()) { - case QEvent::MouseButtonPress: - return d->handleMousePressEvent(child, static_cast<QMouseEvent *>(event)); - case QEvent::MouseMove: - return d->handleMouseMoveEvent(child, static_cast<QMouseEvent *>(event)); - case QEvent::MouseButtonRelease: - return d->handleMouseReleaseEvent(child, static_cast<QMouseEvent *>(event)); - case QEvent::UngrabMouse: - return d->handleMouseUngrabEvent(child); - default: - return false; - } -} - void QQuickSpinBox::mousePressEvent(QMouseEvent *event) { Q_D(QQuickSpinBox); QQuickControl::mousePressEvent(event); - d->handleMousePressEvent(this, event); + d->handlePress(event->localPos()); } void QQuickSpinBox::mouseMoveEvent(QMouseEvent *event) { Q_D(QQuickSpinBox); QQuickControl::mouseMoveEvent(event); - d->handleMouseMoveEvent(this, event); + d->handleMove(event->localPos()); } void QQuickSpinBox::mouseReleaseEvent(QMouseEvent *event) { Q_D(QQuickSpinBox); QQuickControl::mouseReleaseEvent(event); - d->handleMouseReleaseEvent(this, event); + d->handleRelease(event->localPos()); } void QQuickSpinBox::mouseUngrabEvent() { Q_D(QQuickSpinBox); QQuickControl::mouseUngrabEvent(); - d->handleMouseUngrabEvent(this); + d->handleUngrab(); } void QQuickSpinBox::timerEvent(QTimerEvent *event) @@ -834,6 +821,55 @@ void QQuickSpinBox::timerEvent(QTimerEvent *event) } } +void QQuickSpinBox::touchEvent(QTouchEvent *event) +{ + Q_D(QQuickSpinBox); + 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()); + } else { + event->ignore(); + } + break; + + case QEvent::TouchUpdate: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (point.id() != d->touchId) + continue; + + d->handleMove(point.pos()); + } + break; + + case QEvent::TouchEnd: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (point.id() != d->touchId) + continue; + + d->handleRelease(point.pos()); + } + break; + + case QEvent::TouchCancel: + d->handleUngrab(); + break; + + default: + QQuickControl::touchEvent(event); + break; + } +} + +void QQuickSpinBox::touchUngrabEvent() +{ + Q_D(QQuickSpinBox); + QQuickControl::touchUngrabEvent(); + d->handleUngrab(); +} + void QQuickSpinBox::wheelEvent(QWheelEvent *event) { Q_D(QQuickSpinBox); @@ -965,7 +1001,6 @@ void QQuickSpinButton::setIndicator(QQuickItem *indicator) if (indicator) { if (!indicator->parentItem()) indicator->setParentItem(static_cast<QQuickItem *>(parent())); - indicator->setAcceptedMouseButtons(Qt::LeftButton); } emit indicatorChanged(); } diff --git a/src/quicktemplates2/qquickspinbox_p.h b/src/quicktemplates2/qquickspinbox_p.h index f49d9b01..ed12e222 100644 --- a/src/quicktemplates2/qquickspinbox_p.h +++ b/src/quicktemplates2/qquickspinbox_p.h @@ -127,7 +127,6 @@ Q_SIGNALS: Q_REVISION(2) void inputMethodComposingChanged(); protected: - bool childMouseEventFilter(QQuickItem *child, QEvent *event) override; void hoverEnterEvent(QHoverEvent *event) override; void hoverMoveEvent(QHoverEvent *event) override; void hoverLeaveEvent(QHoverEvent *event) override; @@ -138,6 +137,8 @@ protected: void mouseReleaseEvent(QMouseEvent *event) override; void mouseUngrabEvent() override; void timerEvent(QTimerEvent *event) override; + void touchEvent(QTouchEvent *event) override; + void touchUngrabEvent() override; void wheelEvent(QWheelEvent *event) override; void componentComplete() override; |