aboutsummaryrefslogtreecommitdiffstats
path: root/src/templates
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-07 14:36:43 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-07 13:37:59 +0000
commitacacc09f85a4f4bafc05819986de55667fd42111 (patch)
tree1749e1cacc2b03cd2b772cabf49be29c5d6451f3 /src/templates
parentf6d7be8082098f1b8a1e2decdeec89e17adb55d0 (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.cpp51
-rw-r--r--src/templates/qquickabstractbutton_p.h1
-rw-r--r--src/templates/qquickabstractbutton_p_p.h6
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;