diff options
author | Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com> | 2015-07-20 15:51:17 +0200 |
---|---|---|
committer | Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com> | 2015-07-24 10:32:41 +0000 |
commit | 048a5363294273d60b3634f96295c28828e5383e (patch) | |
tree | c32c1c4d7f28c78b9fc3ba7a55388b715a0fc333 /src/controls | |
parent | 3515852a3fb8321da950c7ae88c2ab1e09259e8c (diff) |
Add pressAndHold support for TextField
Change-Id: I634da6568a456a5f21e30e6295d139a4e1a89e75
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/controls')
-rw-r--r-- | src/controls/qquicktextfield.cpp | 71 | ||||
-rw-r--r-- | src/controls/qquicktextfield_p.h | 6 |
2 files changed, 76 insertions, 1 deletions
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 <QtCore/qbasictimer.h> #include <QtQuick/private/qquickitem_p.h> #include <QtQuick/private/qquicktext_p.h> #include <QtQuick/private/qquickclipnode_p.h> #include <QtQuick/private/qquicktextinput_p_p.h> +#include <QtQuick/private/qquickevents_p_p.h> 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) |