aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2016-12-08 19:19:04 +0100
committerShawn Rutledge <shawn.rutledge@qt.io>2016-12-29 10:52:31 +0000
commit871314ced803afe0ac31033cfbd79fa4c1b18e3d (patch)
tree290bab4f0161c0880c1d7af8e68fd13b4ff42cee
parent70113ef66b245e58ce12e2a9d26268e2eaeb3a42 (diff)
DragHandler active property replaces dragging; same as grabbing
If a QQuickPointerSingleHandler grabs a point, it's definitely in the active state: doing something with the point. (The converse is not always true though: e.g. TapHandler can sometimes detect a tap without ever grabbing.) In DragHandler, the "dragging" property means the same as "active": we always grab when dragging, to be sure to get the updates. So the "dragging" property is removed because it's redundant. In QQuickPointerHandler we don't say that "wanting" an event is the same as being active, because 1) it won't necessarily grab right away and 2) every handler which was active should "want" the release event, yet it needs to setActive(false) as soon as it's done processing it. Change-Id: Ie010db54714a7914109da6469e79865f9a0a18e4 Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
-rw-r--r--src/quick/handlers/qquickdraghandler.cpp11
-rw-r--r--src/quick/handlers/qquickdraghandler_p.h5
-rw-r--r--src/quick/handlers/qquickpinchhandler.cpp4
-rw-r--r--src/quick/handlers/qquickpointerhandler.cpp4
-rw-r--r--src/quick/handlers/qquickpointersinglehandler.cpp11
-rw-r--r--src/quick/handlers/qquickpointersinglehandler_p.h1
-rw-r--r--tests/manual/pointer/content/Slider.qml2
-rw-r--r--tests/manual/pointer/joystick.qml2
8 files changed, 20 insertions, 20 deletions
diff --git a/src/quick/handlers/qquickdraghandler.cpp b/src/quick/handlers/qquickdraghandler.cpp
index a1c3486bd0..dc3116e300 100644
--- a/src/quick/handlers/qquickdraghandler.cpp
+++ b/src/quick/handlers/qquickdraghandler.cpp
@@ -59,7 +59,6 @@ QT_BEGIN_NAMESPACE
QQuickDragHandler::QQuickDragHandler(QObject *parent)
: QQuickPointerSingleHandler(parent)
- , m_dragging(false)
{
}
@@ -88,7 +87,7 @@ void QQuickDragHandler::handleEventPoint(QQuickEventPoint *point)
delta.setX(0);
if (!m_yAxis.enabled())
delta.setY(0);
- if (m_dragging) {
+ if (active()) {
if (target() && target()->parentItem()) {
QPointF pos = target()->parentItem()->mapFromScene(m_startPos + delta);
enforceAxisConstraints(&pos);
@@ -96,17 +95,9 @@ void QQuickDragHandler::handleEventPoint(QQuickEventPoint *point)
}
} else if ((m_xAxis.enabled() && QQuickWindowPrivate::dragOverThreshold(delta.x(), Qt::XAxis, point)) ||
(m_yAxis.enabled() && QQuickWindowPrivate::dragOverThreshold(delta.y(), Qt::YAxis, point))) {
- m_dragging = true;
setGrab(point, true);
- emit draggingChanged();
}
} break;
- case QQuickEventPoint::Released:
- if (m_dragging) {
- m_dragging = false;
- emit draggingChanged();
- }
- break;
default:
break;
}
diff --git a/src/quick/handlers/qquickdraghandler_p.h b/src/quick/handlers/qquickdraghandler_p.h
index e7cb675025..8f27d51b4f 100644
--- a/src/quick/handlers/qquickdraghandler_p.h
+++ b/src/quick/handlers/qquickdraghandler_p.h
@@ -90,7 +90,6 @@ class Q_AUTOTEST_EXPORT QQuickDragHandler : public QQuickPointerSingleHandler
Q_OBJECT
Q_PROPERTY(QQuickDragAxis * xAxis READ xAxis CONSTANT)
Q_PROPERTY(QQuickDragAxis * yAxis READ yAxis CONSTANT)
- Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged)
public:
QQuickDragHandler(QObject *parent = 0);
@@ -101,13 +100,10 @@ public:
QQuickDragAxis *xAxis() { return &m_xAxis; }
QQuickDragAxis *yAxis() { return &m_yAxis; }
- bool dragging() const { return m_dragging; }
-
Q_INVOKABLE void enforceConstraints();
Q_SIGNALS:
// void gestureStarted(QQuickGestureEvent *gesture);
- void draggingChanged();
protected:
bool wantsEventPoint(QQuickEventPoint *point) override;
@@ -117,7 +113,6 @@ private:
void enforceAxisConstraints(QPointF *localPos);
private:
- bool m_dragging;
QPointF m_startPos;
QQuickDragAxis m_xAxis;
QQuickDragAxis m_yAxis;
diff --git a/src/quick/handlers/qquickpinchhandler.cpp b/src/quick/handlers/qquickpinchhandler.cpp
index 45d8235dff..4832d300c2 100644
--- a/src/quick/handlers/qquickpinchhandler.cpp
+++ b/src/quick/handlers/qquickpinchhandler.cpp
@@ -224,6 +224,10 @@ void QQuickPinchHandler::onActiveChanged()
void QQuickPinchHandler::handlePointerEventImpl(QQuickPointerEvent *event)
{
Q_UNUSED(event)
+ // TODO wait for the drag threshold before setting active
+ // but the old behavior was that whenever we "want" all the points, we're active
+ // so that behavior is retained here temporarily
+ setActive(m_currentPoints.count() > 0 && m_currentPoints.at(0)->state() != QQuickEventPoint::Released);
if (Q_UNLIKELY(lcPinchHandler().isDebugEnabled())) {
for (QQuickEventPoint *point : qAsConst(m_currentPoints))
diff --git a/src/quick/handlers/qquickpointerhandler.cpp b/src/quick/handlers/qquickpointerhandler.cpp
index d51835a24b..ed08eed93e 100644
--- a/src/quick/handlers/qquickpointerhandler.cpp
+++ b/src/quick/handlers/qquickpointerhandler.cpp
@@ -140,9 +140,7 @@ QQuickItem *QQuickPointerHandler::target() const
void QQuickPointerHandler::handlePointerEvent(QQuickPointerEvent *event)
{
- const bool wants = wantsPointerEvent(event);
- setActive(wants);
- if (wants)
+ if (wantsPointerEvent(event))
handlePointerEventImpl(event);
else
setActive(false);
diff --git a/src/quick/handlers/qquickpointersinglehandler.cpp b/src/quick/handlers/qquickpointersinglehandler.cpp
index 5b2d6b0801..3a67d66e8c 100644
--- a/src/quick/handlers/qquickpointersinglehandler.cpp
+++ b/src/quick/handlers/qquickpointersinglehandler.cpp
@@ -101,6 +101,11 @@ void QQuickPointerSingleHandler::handlePointerEventImpl(QQuickPointerEvent *even
} else {
setPressedButtons(event->buttons());
handleEventPoint(currentPoint);
+ if (currentPoint->state() == QQuickEventPoint::Released) {
+ m_currentPointId = 0;
+ setPressedButtons(Qt::NoButton);
+ setGrab(currentPoint, false);
+ }
}
bool grab = currentPoint->isAccepted() && currentPoint->state() != QQuickEventPoint::Released;
setGrab(currentPoint, grab);
@@ -120,6 +125,12 @@ void QQuickPointerSingleHandler::handleGrabCancel(QQuickEventPoint *point)
setPressedButtons(Qt::NoButton);
}
+void QQuickPointerSingleHandler::onGrabChanged(QQuickEventPoint *point)
+{
+ bool grabbing = (point->grabber() == this);
+ setActive(grabbing);
+}
+
void QQuickPointerSingleHandler::setPressedButtons(Qt::MouseButtons buttons)
{
if (buttons != m_pressedButtons) {
diff --git a/src/quick/handlers/qquickpointersinglehandler_p.h b/src/quick/handlers/qquickpointersinglehandler_p.h
index 69a3263271..e3c6bfaddf 100644
--- a/src/quick/handlers/qquickpointersinglehandler_p.h
+++ b/src/quick/handlers/qquickpointersinglehandler_p.h
@@ -77,6 +77,7 @@ protected:
quint64 currentPointId() const { return m_currentPointId; }
QQuickEventPoint *currentPoint(QQuickPointerEvent *ev) { return ev->pointById(m_currentPointId); }
void handleGrabCancel(QQuickEventPoint *point) override;
+ void onGrabChanged(QQuickEventPoint *point) override;
private:
void setPressedButtons(Qt::MouseButtons buttons);
diff --git a/tests/manual/pointer/content/Slider.qml b/tests/manual/pointer/content/Slider.qml
index 363f6911d4..cd52dfac80 100644
--- a/tests/manual/pointer/content/Slider.qml
+++ b/tests/manual/pointer/content/Slider.qml
@@ -70,7 +70,7 @@ Item {
anchors.horizontalCenterOffset: 1
radius: 5
color: "#4400FFFF"
- visible: dragHandler.dragging
+ opacity: dragHandler.active ? 1 : 0
}
Image {
id: knob
diff --git a/tests/manual/pointer/joystick.qml b/tests/manual/pointer/joystick.qml
index 7959eaea42..bcc4564471 100644
--- a/tests/manual/pointer/joystick.qml
+++ b/tests/manual/pointer/joystick.qml
@@ -58,7 +58,7 @@ Rectangle {
}
states: [
State {
- when: dragHandler.dragging
+ when: dragHandler.active
AnchorChanges {
target: knob
anchors.horizontalCenter: undefined