From 048a5363294273d60b3634f96295c28828e5383e Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Mon, 20 Jul 2015 15:51:17 +0200 Subject: Add pressAndHold support for TextField Change-Id: I634da6568a456a5f21e30e6295d139a4e1a89e75 Reviewed-by: Mitch Curtis --- src/controls/qquicktextfield.cpp | 71 +++++++++++++++++++++++++++++++++++++++- src/controls/qquicktextfield_p.h | 6 ++++ 2 files changed, 76 insertions(+), 1 deletion(-) (limited to 'src/controls') diff --git a/src/controls/qquicktextfield.cpp b/src/controls/qquicktextfield.cpp index 694e3f5d..de6840bd 100644 --- a/src/controls/qquicktextfield.cpp +++ b/src/controls/qquicktextfield.cpp @@ -36,10 +36,12 @@ #include "qquicktextfield_p.h" +#include #include #include #include #include +#include QT_BEGIN_NAMESPACE @@ -72,17 +74,32 @@ QT_BEGIN_NAMESPACE \sa TextArea, {Customizing TextField} */ +/*! + \qmlsignal QtQuickControls2::TextField::pressAndHold(MouseEvent mouse) + + This signal is emitted when there is a long press (the delay depends on the platform plugin). + The \l {MouseEvent}{mouse} parameter provides information about the press, including the x and y + position of the press, and which button is pressed. +*/ + class QQuickTextFieldPrivate : public QQuickTextInputPrivate { Q_DECLARE_PUBLIC(QQuickTextField) public: - QQuickTextFieldPrivate() : background(Q_NULLPTR), placeholder(Q_NULLPTR) { } + QQuickTextFieldPrivate() + : background(Q_NULLPTR) + , placeholder(Q_NULLPTR) + , longPress(false) + { } void resizeBackground(); + bool isPressAndHoldConnected(); QQuickItem *background; QQuickText *placeholder; + QBasicTimer pressAndHoldTimer; + bool longPress; }; void QQuickTextFieldPrivate::resizeBackground() @@ -101,6 +118,12 @@ void QQuickTextFieldPrivate::resizeBackground() } } +bool QQuickTextFieldPrivate::isPressAndHoldConnected() +{ + Q_Q(QQuickTextField); + IS_SIGNAL_CONNECTED(q, QQuickTextField, pressAndHold, (QQuickMouseEvent *)); +} + QQuickTextField::QQuickTextField(QQuickItem *parent) : QQuickTextInput(*(new QQuickTextFieldPrivate), parent) { @@ -193,4 +216,50 @@ QSGNode *QQuickTextField::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData return clipNode; } +void QQuickTextField::mousePressEvent(QMouseEvent *event) +{ + Q_D(QQuickTextField); + d->longPress = false; + if (Qt::LeftButton == (event->buttons() & Qt::LeftButton)) + d->pressAndHoldTimer.start(QGuiApplication::styleHints()->mousePressAndHoldInterval(), this); + else + d->pressAndHoldTimer.stop(); + QQuickTextInput::mousePressEvent(event); +} + +void QQuickTextField::mouseMoveEvent(QMouseEvent *event) +{ + Q_D(QQuickTextField); + if (qAbs(int(event->localPos().x() - d->pressPos.x())) > QGuiApplication::styleHints()->startDragDistance()) + d->pressAndHoldTimer.stop(); + if (!d->pressAndHoldTimer.isActive()) + QQuickTextInput::mouseMoveEvent(event); +} + +void QQuickTextField::mouseReleaseEvent(QMouseEvent *event) +{ + Q_D(QQuickTextField); + if (!d->longPress) { + d->pressAndHoldTimer.stop(); + QQuickTextInput::mouseReleaseEvent(event); + } +} + +void QQuickTextField::timerEvent(QTimerEvent *event) +{ + Q_D(QQuickTextField); + if (event->timerId() == d->pressAndHoldTimer.timerId()) { + d->pressAndHoldTimer.stop(); + d->longPress = true; + QQuickMouseEvent me(d->pressPos.x(), d->pressPos.y(), Qt::LeftButton, Qt::LeftButton, + QGuiApplication::keyboardModifiers(), false/*isClick*/, true/*wasHeld*/); + me.setAccepted(d->isPressAndHoldConnected()); + emit pressAndHold(&me); + if (!me.isAccepted()) + d->longPress = false; + } else { + QQuickTextInput::timerEvent(event); + } +} + QT_END_NAMESPACE diff --git a/src/controls/qquicktextfield_p.h b/src/controls/qquicktextfield_p.h index 41d39316..1cc7ffe4 100644 --- a/src/controls/qquicktextfield_p.h +++ b/src/controls/qquicktextfield_p.h @@ -55,6 +55,7 @@ QT_BEGIN_NAMESPACE class QQuickText; class QQuickTextFieldPrivate; +class QQuickMouseEvent; class Q_QUICKCONTROLS_EXPORT QQuickTextField : public QQuickTextInput { @@ -75,10 +76,15 @@ public: Q_SIGNALS: void backgroundChanged(); void placeholderChanged(); + void pressAndHold(QQuickMouseEvent *mouse); protected: void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) 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 timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE; private: Q_DISABLE_COPY(QQuickTextField) -- cgit v1.2.3