MouseArea: add scrollGestureEnabled property
authorShawn Rutledge <shawn.rutledge@digia.com>
Fri, 5 Dec 2014 09:28:20 +0000 (10:28 +0100)
committerShawn Rutledge <shawn.rutledge@digia.com>
Wed, 28 Jan 2015 17:14:37 +0000 (17:14 +0000)
If true, scroll gestures coming from the operating system can cause
wheel to be emitted; if false, only an actual mouse wheel will do that.
The photosurface example demostrates the use case.
1) the flick gesture on a trackpad should flick the underlying
Flickable, not zoom an individual image
2) mouse wheel should zoom an individual image if the cursor is
pointing to it
3) dragging an image on a touchscreen should be possible, independently
of flicking the Flickable.  This means multiPointTouchEnabled should be
true, so we cannot interpret multiPointTouchEnabled to mean that
multipoint touch scroll gestures should be disabled.

Change-Id: Ie063556866f07b3fbadc53990b110edeed532710
Reviewed-by: Morten Johan Sørvig <morten.sorvig@theqtcompany.com>
src/quick/items/qquickmousearea.cpp
src/quick/items/qquickmousearea_p.h
src/quick/items/qquickmousearea_p_p.h
src/quick/items/qquickwindow.cpp

index dc7ba96c35dbd09df1e230298c82452be4b0b1c9..d6aa30835cde9b83b96e06e8d44be6ecc66c3a49 100644 (file)
@@ -50,7 +50,7 @@ QT_BEGIN_NAMESPACE
 DEFINE_BOOL_CONFIG_OPTION(qmlVisualTouchDebugging, QML_VISUAL_TOUCH_DEBUGGING)
 
 QQuickMouseAreaPrivate::QQuickMouseAreaPrivate()
-: enabled(true), hovered(false), longPress(false),
+: enabled(true), scrollGestureEnabled(true), hovered(false), longPress(false),
   moved(false), stealMouse(false), doubleClick(false), preventStealing(false),
   propagateComposedEvents(false), pressed(0)
 #ifndef QT_NO_DRAGANDDROP
@@ -496,6 +496,36 @@ void QQuickMouseArea::setEnabled(bool a)
     }
 }
 
+/*!
+    \qmlproperty bool QtQuick::MouseArea::scrollGestureEnabled
+
+    This property controls whether this MouseArea responds to scroll gestures
+    from non-mouse devices, such as the 2-finger flick gesture on a trackpad.
+    If set to false, the \l wheel signal be emitted only when the wheel event
+    comes from an actual mouse with a wheel, while scroll gesture events will
+    pass through to any other Item that will handle them. For example, the user
+    might perform a flick gesture while the cursor is over an item containing a
+    MouseArea, intending to interact with a Flickable which is underneath.
+    Setting this property to false will allow the PinchArea to handle the mouse
+    wheel or the pinch gesture, while the Flickable handles the flick gesture.
+
+    By default, this property is true.
+*/
+bool QQuickMouseArea::isScrollGestureEnabled() const
+{
+    Q_D(const QQuickMouseArea);
+    return d->scrollGestureEnabled;
+}
+
+void QQuickMouseArea::setScrollGestureEnabled(bool e)
+{
+    Q_D(QQuickMouseArea);
+    if (e != d->scrollGestureEnabled) {
+        d->scrollGestureEnabled = e;
+        emit scrollGestureEnabledChanged();
+    }
+}
+
 /*!
     \qmlproperty bool QtQuick::MouseArea::preventStealing
     This property holds whether the mouse events may be stolen from this
@@ -821,7 +851,7 @@ void QQuickMouseArea::hoverLeaveEvent(QHoverEvent *event)
 void QQuickMouseArea::wheelEvent(QWheelEvent *event)
 {
     Q_D(QQuickMouseArea);
-    if (!d->enabled) {
+    if (!d->enabled || (!isScrollGestureEnabled() && event->source() != Qt::MouseEventNotSynthesized)) {
         QQuickItem::wheelEvent(event);
         return;
     }
index 8348a255d9bebc8f2eebf23e0aca12032f68a63f..e6bed1a72c29e33fd4c035685fd0a0ef0f34317c 100644 (file)
@@ -54,6 +54,7 @@ class Q_QUICK_PRIVATE_EXPORT QQuickMouseArea : public QQuickItem
     Q_PROPERTY(bool containsMouse READ hovered NOTIFY hoveredChanged)
     Q_PROPERTY(bool pressed READ pressed NOTIFY pressedChanged)
     Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
+    Q_PROPERTY(bool scrollGestureEnabled READ isScrollGestureEnabled WRITE setScrollGestureEnabled NOTIFY scrollGestureEnabledChanged)
     Q_PROPERTY(Qt::MouseButtons pressedButtons READ pressedButtons NOTIFY pressedButtonsChanged)
     Q_PROPERTY(Qt::MouseButtons acceptedButtons READ acceptedButtons WRITE setAcceptedButtons NOTIFY acceptedButtonsChanged)
     Q_PROPERTY(bool hoverEnabled READ hoverEnabled WRITE setHoverEnabled NOTIFY hoverEnabledChanged)
@@ -77,6 +78,9 @@ public:
     bool isEnabled() const;
     void setEnabled(bool);
 
+    bool isScrollGestureEnabled() const;
+    void setScrollGestureEnabled(bool);
+
     bool hovered() const;
     bool pressed() const;
     bool containsPress() const;
@@ -108,6 +112,7 @@ Q_SIGNALS:
     void hoveredChanged();
     void pressedChanged();
     void enabledChanged();
+    void scrollGestureEnabledChanged();
     void pressedButtonsChanged();
     void acceptedButtonsChanged();
     void hoverEnabledChanged();
index 73db6ea36fec61c2904d0fc3d4149dacb6db6ef4..630b60f1be8e1cf35fddcb05f91f33e0c7ff774c 100644 (file)
@@ -78,6 +78,7 @@ public:
     bool isWheelConnected();
 
     bool enabled : 1;
+    bool scrollGestureEnabled : 1;
     bool hovered : 1;
     bool longPress : 1;
     bool moved : 1;
index a387046d46cf99e9f93ec75a8a826fc90b7d5c9b..ab6829f92a01b57cfa0bf21c353279eda270ba2b 100644 (file)
@@ -1742,7 +1742,7 @@ bool QQuickWindowPrivate::deliverWheelEvent(QQuickItem *item, QWheelEvent *event
 
     if (item->contains(p)) {
         QWheelEvent wheel(p, p, event->pixelDelta(), event->angleDelta(), event->delta(),
-                          event->orientation(), event->buttons(), event->modifiers(), event->phase());
+                          event->orientation(), event->buttons(), event->modifiers(), event->phase(), event->source());
         wheel.accept();
         q->sendEvent(item, &wheel);
         if (wheel.isAccepted()) {