From e661fa1057641092428b5cb2db74b2f3a9496331 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Wed, 29 Apr 2015 12:47:38 +0200 Subject: QQuickButton: Add canceled signal We now support the following pattern: 1. Press the mouse button => emit pressed 2. Move the mouse cursor outside the button => pressed = false 3. Release the mouse button => emit canceled Note that getting the mouse grabbed away by another item, at any stage, will also emit the canceled signal. Change-Id: I97e485327370ea47943dfef75553000cee449a01 Reviewed-by: J-P Nurmi --- src/controls/qquickbutton.cpp | 39 ++++++++++++++++++++++++++++++--------- src/controls/qquickbutton_p.h | 1 + 2 files changed, 31 insertions(+), 9 deletions(-) (limited to 'src/controls') diff --git a/src/controls/qquickbutton.cpp b/src/controls/qquickbutton.cpp index 240c4397..4bf2c08a 100644 --- a/src/controls/qquickbutton.cpp +++ b/src/controls/qquickbutton.cpp @@ -120,6 +120,14 @@ QT_BEGIN_NAMESPACE This signal is emitted when the button is released. */ +/*! + \qmlsignal QtQuickControls2::Button::canceled() + + This signal is emitted when the button loses mouse grab + while being pressed, or when it would emit the \l release + signal but the mouse cursor is not inside the button. +*/ + /*! \qmlsignal QtQuickControls2::Button::clicked() @@ -202,10 +210,6 @@ void QQuickButton::setPressed(bool isPressed) if (d->pressed != isPressed) { d->pressed = isPressed; emit pressedChanged(); - if (isPressed) - emit pressed(); - else - emit released(); } } @@ -242,8 +246,12 @@ void QQuickButton::setLabel(QQuickItem *label) void QQuickButton::focusOutEvent(QFocusEvent *event) { + Q_D(QQuickButton); QQuickControl::focusOutEvent(event); - setPressed(false); + if (d->pressed) { + setPressed(false); + emit canceled(); + } } void QQuickButton::keyPressEvent(QKeyEvent *event) @@ -251,6 +259,7 @@ void QQuickButton::keyPressEvent(QKeyEvent *event) QQuickControl::keyPressEvent(event); if (event->key() == Qt::Key_Space) { setPressed(true); + emit pressed(); event->accept(); } } @@ -259,8 +268,9 @@ void QQuickButton::keyReleaseEvent(QKeyEvent *event) { QQuickControl::keyReleaseEvent(event); if (event->key() == Qt::Key_Space) { - emit clicked(); setPressed(false); + emit released(); + emit clicked(); event->accept(); } } @@ -269,6 +279,7 @@ void QQuickButton::mousePressEvent(QMouseEvent *event) { QQuickControl::mousePressEvent(event); setPressed(true); + emit pressed(); event->accept(); } @@ -281,17 +292,27 @@ void QQuickButton::mouseMoveEvent(QMouseEvent *event) void QQuickButton::mouseReleaseEvent(QMouseEvent *event) { + Q_D(QQuickButton); QQuickControl::mouseReleaseEvent(event); - if (contains(event->pos())) - emit clicked(); + bool wasPressed = d->pressed; setPressed(false); + if (wasPressed) { + emit released(); + emit clicked(); + } else { + emit canceled(); + } event->accept(); } void QQuickButton::mouseUngrabEvent() { + Q_D(QQuickButton); QQuickControl::mouseUngrabEvent(); - setPressed(false); + if (d->pressed) { + setPressed(false); + emit canceled(); + } } void QQuickButton::componentComplete() diff --git a/src/controls/qquickbutton_p.h b/src/controls/qquickbutton_p.h index 1622be76..903af206 100644 --- a/src/controls/qquickbutton_p.h +++ b/src/controls/qquickbutton_p.h @@ -76,6 +76,7 @@ public: Q_SIGNALS: void pressed(); void released(); + void canceled(); void clicked(); void textChanged(); void pressedChanged(); -- cgit v1.2.3