diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-07 14:36:43 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-07 13:37:59 +0000 |
commit | acacc09f85a4f4bafc05819986de55667fd42111 (patch) | |
tree | 1749e1cacc2b03cd2b772cabf49be29c5d6451f3 /src/templates | |
parent | f6d7be8082098f1b8a1e2decdeec89e17adb55d0 (diff) |
Add AbstractButton::pressAndHold() signal
Change-Id: I41e96a61bfb25b81bad748f559894bf8e2984427
Reviewed-by: J-P Nurmi <jpnurmi@theqtcompany.com>
Diffstat (limited to 'src/templates')
-rw-r--r-- | src/templates/qquickabstractbutton.cpp | 51 | ||||
-rw-r--r-- | src/templates/qquickabstractbutton_p.h | 1 | ||||
-rw-r--r-- | src/templates/qquickabstractbutton_p_p.h | 6 |
3 files changed, 54 insertions, 4 deletions
diff --git a/src/templates/qquickabstractbutton.cpp b/src/templates/qquickabstractbutton.cpp index 44526add..6aa44cad 100644 --- a/src/templates/qquickabstractbutton.cpp +++ b/src/templates/qquickabstractbutton.cpp @@ -38,6 +38,7 @@ #include "qquickabstractbutton_p_p.h" #include "qquickbuttongroup_p.h" +#include <QtGui/qstylehints.h> #include <QtGui/qguiapplication.h> #include <QtQuick/private/qquickevents_p_p.h> #include <QtQml/qqmllist.h> @@ -93,15 +94,45 @@ static const int AUTO_REPEAT_INTERVAL = 100; */ /*! + \qmlsignal Qt.labs.controls::AbstractButton::pressAndHold() + + This signal is emitted when the button is interactively perssed and held down by the user. +*/ + +/*! \qmlsignal Qt.labs.controls::AbstractButton::doubleClicked() This signal is emitted when the button is interactively double clicked by the user. */ QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate() : - pressed(false), checked(false), checkable(false), highlighted(false), autoExclusive(false), autoRepeat(false), - delayTimer(0), repeatTimer(0), repeatButton(Qt::NoButton), label(Q_NULLPTR), indicator(Q_NULLPTR), group(Q_NULLPTR) + pressed(false), checked(false), checkable(false), highlighted(false), autoExclusive(false), autoRepeat(false), wasHeld(false), + holdTimer(0), delayTimer(0), repeatTimer(0), repeatButton(Qt::NoButton), + label(Q_NULLPTR), indicator(Q_NULLPTR), group(Q_NULLPTR) +{ +} + +bool QQuickAbstractButtonPrivate::isPressAndHoldConnected() { + Q_Q(QQuickAbstractButton); + IS_SIGNAL_CONNECTED(q, QQuickAbstractButton, pressAndHold, ()); +} + +void QQuickAbstractButtonPrivate::startPressAndHold() +{ + Q_Q(QQuickAbstractButton); + wasHeld = false; + if (isPressAndHoldConnected()) + holdTimer = q->startTimer(QGuiApplication::styleHints()->mousePressAndHoldInterval()); +} + +void QQuickAbstractButtonPrivate::stopPressAndHold() +{ + Q_Q(QQuickAbstractButton); + if (holdTimer > 0) { + q->killTimer(holdTimer); + holdTimer = 0; + } } void QQuickAbstractButtonPrivate::startRepeatDelay() @@ -484,6 +515,8 @@ void QQuickAbstractButton::mousePressEvent(QMouseEvent *event) if (d->autoRepeat) { d->startRepeatDelay(); d->repeatButton = event->button(); + } else { + d->startPressAndHold(); } } @@ -495,6 +528,8 @@ void QQuickAbstractButton::mouseMoveEvent(QMouseEvent *event) if (d->autoRepeat) d->stopPressRepeat(); + else if (!d->pressed) + d->stopPressAndHold(); } void QQuickAbstractButton::mouseReleaseEvent(QMouseEvent *event) @@ -506,7 +541,8 @@ void QQuickAbstractButton::mouseReleaseEvent(QMouseEvent *event) if (wasPressed) { emit released(); - emit clicked(); + if (!d->wasHeld) + emit clicked(); } else { emit canceled(); } @@ -516,6 +552,8 @@ void QQuickAbstractButton::mouseReleaseEvent(QMouseEvent *event) if (d->autoRepeat) d->stopPressRepeat(); + else + d->stopPressAndHold(); } void QQuickAbstractButton::mouseDoubleClickEvent(QMouseEvent *event) @@ -531,6 +569,7 @@ void QQuickAbstractButton::mouseUngrabEvent() if (d->pressed) { setPressed(false); d->stopPressRepeat(); + d->stopPressAndHold(); emit canceled(); } } @@ -539,7 +578,11 @@ void QQuickAbstractButton::timerEvent(QTimerEvent *event) { Q_D(QQuickAbstractButton); QQuickControl::timerEvent(event); - if (event->timerId() == d->delayTimer) { + if (event->timerId() == d->holdTimer) { + d->stopPressAndHold(); + d->wasHeld = true; + emit pressAndHold(); + } else if (event->timerId() == d->delayTimer) { d->startPressRepeat(); } else if (event->timerId() == d->repeatTimer) { emit released(); diff --git a/src/templates/qquickabstractbutton_p.h b/src/templates/qquickabstractbutton_p.h index 0dd94ff5..f3020bc3 100644 --- a/src/templates/qquickabstractbutton_p.h +++ b/src/templates/qquickabstractbutton_p.h @@ -106,6 +106,7 @@ Q_SIGNALS: void released(); void canceled(); void clicked(); + void pressAndHold(); void doubleClicked(); void textChanged(); void pressedChanged(); diff --git a/src/templates/qquickabstractbutton_p_p.h b/src/templates/qquickabstractbutton_p_p.h index 601c6dc7..cdc77f19 100644 --- a/src/templates/qquickabstractbutton_p_p.h +++ b/src/templates/qquickabstractbutton_p_p.h @@ -67,6 +67,10 @@ public: return button->d_func(); } + bool isPressAndHoldConnected(); + void startPressAndHold(); + void stopPressAndHold(); + void startRepeatDelay(); void startPressRepeat(); void stopPressRepeat(); @@ -81,6 +85,8 @@ public: bool highlighted; bool autoExclusive; bool autoRepeat; + bool wasHeld; + int holdTimer; int delayTimer; int repeatTimer; QPointF pressPoint; |