From 3e820f09d940c991cce1063d781dc530adc8710c Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Fri, 18 Dec 2015 15:22:07 +0100 Subject: SpinBox: fix behavior on touch devices Change-Id: Ic56f7882bc6070c85f87ab171ee7feb6dd0b260d Task-number: QTBUG-50033 Reviewed-by: J-P Nurmi --- src/templates/qquickspinbox.cpp | 60 ++++++++++++++++++++++++++++++----------- src/templates/qquickspinbox_p.h | 4 +++ 2 files changed, 48 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/templates/qquickspinbox.cpp b/src/templates/qquickspinbox.cpp index 1b06bfd4..13770e46 100644 --- a/src/templates/qquickspinbox.cpp +++ b/src/templates/qquickspinbox.cpp @@ -169,19 +169,19 @@ void QQuickSpinBoxPrivate::stopPressRepeat() } } -bool QQuickSpinBoxPrivate::handleMousePressEvent(QQuickItem *child, QMouseEvent *) +bool QQuickSpinBoxPrivate::handleMousePressEvent(QQuickItem *child, QMouseEvent *event) { Q_Q(QQuickSpinBox); QQuickItem *ui = up->indicator(); QQuickItem *di = down->indicator(); - up->setPressed(child == ui); - down->setPressed(child == di); + up->setPressed(ui && ui->contains(ui->mapFromItem(child, event->pos()))); + down->setPressed(di && di->contains(di->mapFromItem(child, event->pos()))); bool pressed = up->isPressed() || down->isPressed(); q->setAccessibleProperty("pressed", pressed); if (pressed) startRepeatDelay(); - return child == ui || child == di; + return up->isPressed() || down->isPressed(); } bool QQuickSpinBoxPrivate::handleMouseMoveEvent(QQuickItem *child, QMouseEvent *event) @@ -189,13 +189,13 @@ bool QQuickSpinBoxPrivate::handleMouseMoveEvent(QQuickItem *child, QMouseEvent * Q_Q(QQuickSpinBox); QQuickItem *ui = up->indicator(); QQuickItem *di = down->indicator(); - up->setPressed(child == ui && ui->contains(event->pos())); - down->setPressed(child == di && di->contains(event->pos())); + up->setPressed(ui && ui->contains(ui->mapFromItem(child, event->pos()))); + down->setPressed(di && di->contains(di->mapFromItem(child, event->pos()))); bool pressed = up->isPressed() || down->isPressed(); q->setAccessibleProperty("pressed", pressed); stopPressRepeat(); - return child == ui || child == di; + return up->isPressed() || down->isPressed(); } bool QQuickSpinBoxPrivate::handleMouseReleaseEvent(QQuickItem *child, QMouseEvent *event) @@ -203,32 +203,31 @@ bool QQuickSpinBoxPrivate::handleMouseReleaseEvent(QQuickItem *child, QMouseEven Q_Q(QQuickSpinBox); QQuickItem *ui = up->indicator(); QQuickItem *di = down->indicator(); - if (child == ui) { + bool wasPressed = up->isPressed() || down->isPressed(); + if (up->isPressed()) { up->setPressed(false); - if (repeatTimer <= 0 && ui->contains(event->pos())) + if (repeatTimer <= 0 && ui && ui->contains(ui->mapFromItem(child, event->pos()))) q->increase(); - } else if (child == di) { + } else if (down->isPressed()) { down->setPressed(false); - if (repeatTimer <= 0 && di->contains(event->pos())) + if (repeatTimer <= 0 && di && di->contains(di->mapFromItem(child, event->pos()))) q->decrease(); } q->setAccessibleProperty("pressed", false); stopPressRepeat(); - return child == ui || child == di; + return wasPressed; } -bool QQuickSpinBoxPrivate::handleMouseUngrabEvent(QQuickItem *child) +bool QQuickSpinBoxPrivate::handleMouseUngrabEvent(QQuickItem *) { Q_Q(QQuickSpinBox); - QQuickItem *ui = up->indicator(); - QQuickItem *di = down->indicator(); up->setPressed(false); down->setPressed(false); q->setAccessibleProperty("pressed", false); stopPressRepeat(); - return child == ui || child == di; + return false; } QQuickSpinBox::QQuickSpinBox(QQuickItem *parent) : @@ -240,6 +239,7 @@ QQuickSpinBox::QQuickSpinBox(QQuickItem *parent) : setFlag(ItemIsFocusScope); setFiltersChildMouseEvents(true); + setAcceptedMouseButtons(Qt::LeftButton); } /*! @@ -543,6 +543,34 @@ bool QQuickSpinBox::childMouseEventFilter(QQuickItem *child, QEvent *event) } } +void QQuickSpinBox::mousePressEvent(QMouseEvent *event) +{ + Q_D(QQuickSpinBox); + QQuickControl::mousePressEvent(event); + d->handleMousePressEvent(this, event); +} + +void QQuickSpinBox::mouseMoveEvent(QMouseEvent *event) +{ + Q_D(QQuickSpinBox); + QQuickControl::mouseMoveEvent(event); + d->handleMouseMoveEvent(this, event); +} + +void QQuickSpinBox::mouseReleaseEvent(QMouseEvent *event) +{ + Q_D(QQuickSpinBox); + QQuickControl::mouseReleaseEvent(event); + d->handleMouseReleaseEvent(this, event); +} + +void QQuickSpinBox::mouseUngrabEvent() +{ + Q_D(QQuickSpinBox); + QQuickControl::mouseUngrabEvent(); + d->handleMouseUngrabEvent(this); +} + void QQuickSpinBox::timerEvent(QTimerEvent *event) { Q_D(QQuickSpinBox); diff --git a/src/templates/qquickspinbox_p.h b/src/templates/qquickspinbox_p.h index 3db12a10..edfb3ea0 100644 --- a/src/templates/qquickspinbox_p.h +++ b/src/templates/qquickspinbox_p.h @@ -115,6 +115,10 @@ protected: bool childMouseEventFilter(QQuickItem *child, QEvent *event) Q_DECL_OVERRIDE; void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE; void keyReleaseEvent(QKeyEvent *event) Q_DECL_OVERRIDE; + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseUngrabEvent() Q_DECL_OVERRIDE; void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE; void componentComplete() Q_DECL_OVERRIDE; -- cgit v1.2.3