aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorJens Bache-Wiig <jens.bache-wiig@digia.com>2013-08-22 17:20:52 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-13 17:51:48 +0200
commit406d6d33a6c0c5f99dfa31e2eb681b1fefcd5fe0 (patch)
treec365e466a5ba74a29ab1bc1f51aab6f407d105b9 /src/quick
parentee6cc22ebd0ec236454bc2112fe5f82e31299143 (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/quick')
-rw-r--r--src/quick/items/qquickdrag.cpp25
-rw-r--r--src/quick/items/qquickdrag_p.h9
-rw-r--r--src/quick/items/qquickmousearea.cpp12
-rw-r--r--src/quick/items/qquickwindow.cpp4
-rw-r--r--src/quick/items/qquickwindow_p.h2
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 *);