diff options
author | Jens Bache-Wiig <jens.bache-wiig@digia.com> | 2013-08-22 17:20:52 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-13 17:51:48 +0200 |
commit | 406d6d33a6c0c5f99dfa31e2eb681b1fefcd5fe0 (patch) | |
tree | c365e466a5ba74a29ab1bc1f51aab6f407d105b9 /src | |
parent | ee6cc22ebd0ec236454bc2112fe5f82e31299143 (diff) |
Expose drag threshold in MouseArea
In several cases such as for creating a Slider, it is useful to have a
0 pixel threshold in order to initiate a drag operation. We have
previously hardcoded this to a platform dependent (usually 10 pixel)
value for MouseArea.
Note that we have no way of indicating the version/revision number
in a grouped property for documentation at the moment.
In addition we deliberately had to remove the REVISION from the
property because it is blocked by QTBUG-33179. However, since
this is not a user-creatable type it should not cause any
issues in practice.
This patch adds MouseArea.drag.threshold in order to improve on this.
Change-Id: Ia4871e64fab39e30c4494f00be99ad38cdd630df
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/items/qquickdrag.cpp | 25 | ||||
-rw-r--r-- | src/quick/items/qquickdrag_p.h | 9 | ||||
-rw-r--r-- | src/quick/items/qquickmousearea.cpp | 12 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 4 | ||||
-rw-r--r-- | src/quick/items/qquickwindow_p.h | 2 |
5 files changed, 42 insertions, 10 deletions
diff --git a/src/quick/items/qquickdrag.cpp b/src/quick/items/qquickdrag.cpp index 0ae26cb5c3..166b40aaf2 100644 --- a/src/quick/items/qquickdrag.cpp +++ b/src/quick/items/qquickdrag.cpp @@ -45,11 +45,12 @@ #include <QtQuick/private/qquickevents_p_p.h> #include <private/qquickitemchangelistener_p.h> #include <private/qv8engine_p.h> -#include <QtCore/qcoreapplication.h> #include <QtCore/qmimedata.h> #include <QtQml/qqmlinfo.h> #include <QtGui/qdrag.h> #include <QtGui/qevent.h> +#include <QtGui/qstylehints.h> +#include <QtGui/qguiapplication.h> #ifndef QT_NO_DRAGANDDROP @@ -785,7 +786,8 @@ void QQuickDragAttached::startDrag(QQmlV4Function *args) QQuickDrag::QQuickDrag(QObject *parent) : QObject(parent), _target(0), _axis(XAndYAxis), _xmin(-FLT_MAX), -_xmax(FLT_MAX), _ymin(-FLT_MAX), _ymax(FLT_MAX), _active(false), _filterChildren(false) +_xmax(FLT_MAX), _ymin(-FLT_MAX), _ymax(FLT_MAX), _active(false), _filterChildren(false), + _threshold(qApp->styleHints()->startDragDistance()) { } @@ -879,6 +881,25 @@ void QQuickDrag::setYmax(qreal m) emit maximumYChanged(); } + +qreal QQuickDrag::threshold() const +{ + return _threshold; +} + +void QQuickDrag::setThreshold(qreal value) +{ + if (_threshold != value) { + _threshold = value; + emit thresholdChanged(); + } +} + +void QQuickDrag::resetThreshold() +{ + setThreshold(qApp->styleHints()->startDragDistance()); +} + bool QQuickDrag::active() const { return _active; diff --git a/src/quick/items/qquickdrag_p.h b/src/quick/items/qquickdrag_p.h index 098fcc61b9..22829350fe 100644 --- a/src/quick/items/qquickdrag_p.h +++ b/src/quick/items/qquickdrag_p.h @@ -157,6 +157,9 @@ class Q_AUTOTEST_EXPORT QQuickDrag : public QObject Q_PROPERTY(qreal maximumY READ ymax WRITE setYmax NOTIFY maximumYChanged) Q_PROPERTY(bool active READ active NOTIFY activeChanged) Q_PROPERTY(bool filterChildren READ filterChildren WRITE setFilterChildren NOTIFY filterChildrenChanged) + // Note, threshold was added in QtQuick 2.2 but REVISION is not supported (or needed) for grouped + // properties See QTBUG-33179 + Q_PROPERTY(qreal threshold READ threshold WRITE setThreshold NOTIFY thresholdChanged RESET resetThreshold) //### consider drag and drop public: @@ -182,6 +185,10 @@ public: qreal ymax() const; void setYmax(qreal); + qreal threshold() const; + void setThreshold(qreal); + void resetThreshold(); + bool active() const; void setActive(bool); @@ -199,6 +206,7 @@ Q_SIGNALS: void maximumYChanged(); void activeChanged(); void filterChildrenChanged(); + void thresholdChanged(); private: QQuickItem *_target; @@ -209,6 +217,7 @@ private: qreal _ymax; bool _active : 1; bool _filterChildren: 1; + qreal _threshold; Q_DISABLE_COPY(QQuickDrag) }; diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index 8a73a5d73d..39f07f2afd 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -48,10 +48,7 @@ #include <private/qqmldata_p.h> #include <QtGui/private/qguiapplication_p.h> - #include <QtGui/qevent.h> -#include <QtGui/qguiapplication.h> -#include <QtGui/qstylehints.h> #include <float.h> @@ -695,8 +692,8 @@ void QQuickMouseArea::mouseMoveEvent(QMouseEvent *event) d->drag->target()->setPosition(dragPos); if (!keepMouseGrab() - && (QQuickWindowPrivate::dragOverThreshold(dragPos.x() - startPos.x(), Qt::XAxis, event) - || QQuickWindowPrivate::dragOverThreshold(dragPos.y() - startPos.y(), Qt::YAxis, event))) { + && (QQuickWindowPrivate::dragOverThreshold(dragPos.x() - startPos.x(), Qt::XAxis, event, d->drag->threshold()) + || QQuickWindowPrivate::dragOverThreshold(dragPos.y() - startPos.y(), Qt::YAxis, event, d->drag->threshold()))) { setKeepMouseGrab(true); d->stealMouse = true; d->startScene = event->windowPos(); @@ -1189,6 +1186,7 @@ void QQuickMouseArea::setCursorShape(Qt::CursorShape shape) \qmlproperty real QtQuick2::MouseArea::drag.minimumY \qmlproperty real QtQuick2::MouseArea::drag.maximumY \qmlproperty bool QtQuick2::MouseArea::drag.filterChildren + \qmlproperty real QtQuick2::MouseArea::drag.threshold \c drag provides a convenient way to make an item draggable. @@ -1213,6 +1211,10 @@ void QQuickMouseArea::setCursorShape(Qt::CursorShape shape) If \c drag.filterChildren is set to true, a drag can override descendant MouseAreas. This enables a parent MouseArea to handle drags, for example, while descendants handle clicks: + \c drag.threshold determines the threshold in pixels of when the drag operation should + start. By default this is bound to a platform dependent value. This property was added in + Qt Quick 2.2. + \snippet qml/mousearea/mouseareadragfilter.qml dragfilter */ diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index c8bc026868..513c3da0a2 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -2077,13 +2077,13 @@ bool QQuickWindowPrivate::sendFilteredMouseEvent(QQuickItem *target, QQuickItem return false; } -bool QQuickWindowPrivate::dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event) +bool QQuickWindowPrivate::dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event, int startDragThreshold) { QStyleHints *styleHints = qApp->styleHints(); int caps = QGuiApplicationPrivate::mouseEventCaps(event); bool dragVelocityLimitAvailable = (caps & QTouchDevice::Velocity) && styleHints->startDragVelocity(); - bool overThreshold = qAbs(d) > styleHints->startDragDistance(); + bool overThreshold = qAbs(d) > (startDragThreshold >= 0 ? startDragThreshold : styleHints->startDragDistance()); if (dragVelocityLimitAvailable) { QVector2D velocityVec = QGuiApplicationPrivate::mouseEventVelocity(event); qreal velocity = axis == Qt::XAxis ? velocityVec.x() : velocityVec.y(); diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index 12925cbbca..e29ceb521f 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -221,7 +221,7 @@ public: static bool defaultAlphaBuffer; - static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event); + static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event, int startDragThreshold = -1); // data property static void data_append(QQmlListProperty<QObject> *, QObject *); |