aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-12-21 15:14:04 +0100
committerJ-P Nurmi <jpnurmi@qt.io>2017-01-02 13:31:46 +0000
commitc4c1a5a2f229c6f14946dfde3b8344a4e9abb2ff (patch)
tree4acb1217f52b17b18adb8efe6ba601c12895bf3f
parent20f7af8d0619ff82533c3db80640f61d61d71201 (diff)
Revise QQuickAbstractButton internals
Move the logic of press/move/release/cancel event handlers into methods in the private class, that can be reused or overridden from subclasses. Change-Id: Ie1f73e07c3389955c1d624e5b5a7e6bd240d0490 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r--src/quicktemplates2/qquickabstractbutton.cpp116
-rw-r--r--src/quicktemplates2/qquickabstractbutton_p_p.h5
2 files changed, 74 insertions, 47 deletions
diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp
index c47e6dcb..c4fde34d 100644
--- a/src/quicktemplates2/qquickabstractbutton.cpp
+++ b/src/quicktemplates2/qquickabstractbutton.cpp
@@ -118,6 +118,70 @@ QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate() :
{
}
+void QQuickAbstractButtonPrivate::handlePress(const QPointF &point, Qt::MouseButton button, Qt::MouseButtons buttons)
+{
+ Q_Q(QQuickAbstractButton);
+ pressPoint = point;
+ q->setPressed(true);
+
+ emit q->pressed();
+
+ if (autoRepeat) {
+ startRepeatDelay();
+ repeatButton = button;
+ } else if (Qt::LeftButton == (buttons & Qt::LeftButton)) {
+ startPressAndHold();
+ } else {
+ stopPressAndHold();
+ }
+}
+
+void QQuickAbstractButtonPrivate::handleMove(const QPointF &point)
+{
+ Q_Q(QQuickAbstractButton);
+ q->setPressed(keepPressed || q->contains(point));
+
+ if (!pressed && autoRepeat)
+ stopPressRepeat();
+ else if (holdTimer > 0 && (!pressed || QLineF(pressPoint, point).length() > QGuiApplication::styleHints()->startDragDistance()))
+ stopPressAndHold();
+}
+
+void QQuickAbstractButtonPrivate::handleRelease(const QPointF &point)
+{
+ Q_Q(QQuickAbstractButton);
+ bool wasPressed = pressed;
+ q->setPressed(false);
+
+ if (!wasHeld && (keepPressed || q->contains(point)))
+ q->nextCheckState();
+
+ if (wasPressed) {
+ emit q->released();
+ if (!wasHeld)
+ emit q->clicked();
+ } else {
+ emit q->canceled();
+ }
+
+ if (autoRepeat)
+ stopPressRepeat();
+ else
+ stopPressAndHold();
+}
+
+void QQuickAbstractButtonPrivate::handleCancel()
+{
+ Q_Q(QQuickAbstractButton);
+ if (!pressed)
+ return;
+
+ q->setPressed(false);
+ stopPressRepeat();
+ stopPressAndHold();
+ emit q->canceled();
+}
+
bool QQuickAbstractButtonPrivate::isPressAndHoldConnected()
{
Q_Q(QQuickAbstractButton);
@@ -493,10 +557,7 @@ void QQuickAbstractButton::focusOutEvent(QFocusEvent *event)
{
Q_D(QQuickAbstractButton);
QQuickControl::focusOutEvent(event);
- if (d->pressed) {
- setPressed(false);
- emit canceled();
- }
+ d->handleCancel();
}
void QQuickAbstractButton::keyPressEvent(QKeyEvent *event)
@@ -536,55 +597,21 @@ void QQuickAbstractButton::mousePressEvent(QMouseEvent *event)
{
Q_D(QQuickAbstractButton);
QQuickControl::mousePressEvent(event);
- d->pressPoint = event->pos();
- setPressed(true);
-
- emit pressed();
-
- if (d->autoRepeat) {
- d->startRepeatDelay();
- d->repeatButton = event->button();
- } else if (Qt::LeftButton == (event->buttons() & Qt::LeftButton)) {
- d->startPressAndHold();
- } else {
- d->stopPressAndHold();
- }
+ d->handlePress(event->localPos(), event->button(), event->buttons());
}
void QQuickAbstractButton::mouseMoveEvent(QMouseEvent *event)
{
Q_D(QQuickAbstractButton);
QQuickControl::mouseMoveEvent(event);
- setPressed(d->keepPressed || contains(event->pos()));
-
- if (!d->pressed && d->autoRepeat)
- d->stopPressRepeat();
- else if (d->holdTimer > 0 && (!d->pressed || QLineF(d->pressPoint, event->localPos()).length() > QGuiApplication::styleHints()->startDragDistance()))
- d->stopPressAndHold();
+ d->handleMove(event->localPos());
}
void QQuickAbstractButton::mouseReleaseEvent(QMouseEvent *event)
{
Q_D(QQuickAbstractButton);
QQuickControl::mouseReleaseEvent(event);
- bool wasPressed = d->pressed;
- setPressed(false);
-
- if (!d->wasHeld && (d->keepPressed || contains(event->pos())))
- nextCheckState();
-
- if (wasPressed) {
- emit released();
- if (!d->wasHeld)
- emit clicked();
- } else {
- emit canceled();
- }
-
- if (d->autoRepeat)
- d->stopPressRepeat();
- else
- d->stopPressAndHold();
+ d->handleRelease(event->localPos());
}
void QQuickAbstractButton::mouseDoubleClickEvent(QMouseEvent *event)
@@ -597,12 +624,7 @@ void QQuickAbstractButton::mouseUngrabEvent()
{
Q_D(QQuickAbstractButton);
QQuickControl::mouseUngrabEvent();
- if (d->pressed) {
- setPressed(false);
- d->stopPressRepeat();
- d->stopPressAndHold();
- emit canceled();
- }
+ d->handleCancel();
}
void QQuickAbstractButton::timerEvent(QTimerEvent *event)
diff --git a/src/quicktemplates2/qquickabstractbutton_p_p.h b/src/quicktemplates2/qquickabstractbutton_p_p.h
index aa9d98d5..8d134285 100644
--- a/src/quicktemplates2/qquickabstractbutton_p_p.h
+++ b/src/quicktemplates2/qquickabstractbutton_p_p.h
@@ -67,6 +67,11 @@ public:
return button->d_func();
}
+ virtual void handlePress(const QPointF &point, Qt::MouseButton button, Qt::MouseButtons buttons);
+ virtual void handleMove(const QPointF &point);
+ virtual void handleRelease(const QPointF &point);
+ virtual void handleCancel();
+
bool isPressAndHoldConnected();
void startPressAndHold();
void stopPressAndHold();