From b7451b45e43f1f21bc2b9e35c330f4f27225307d Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Fri, 24 Apr 2009 14:40:01 +1000
Subject: Add a QSimpleCanvasItem::ChildMouseFilter option

Child mouse filter only filters events sent to your children
---
 src/declarative/canvas/qsimplecanvas.cpp           |  51 ++++-
 .../canvas/qsimplecanvas_graphicsview.cpp          |  33 +++
 src/declarative/canvas/qsimplecanvas_p.h           |   7 +-
 src/declarative/canvas/qsimplecanvasitem.cpp       |   1 +
 src/declarative/canvas/qsimplecanvasitem.h         |  15 +-
 src/declarative/canvas/qsimplecanvasitem_p.h       |   2 +-
 src/declarative/fx/qfxflickable.cpp                | 248 +++++++++++----------
 src/declarative/fx/qfxflickable_p.h                |   4 +
 8 files changed, 225 insertions(+), 136 deletions(-)

diff --git a/src/declarative/canvas/qsimplecanvas.cpp b/src/declarative/canvas/qsimplecanvas.cpp
index 5eb6c60..5d35a2a 100644
--- a/src/declarative/canvas/qsimplecanvas.cpp
+++ b/src/declarative/canvas/qsimplecanvas.cpp
@@ -417,7 +417,7 @@ QGraphicsSceneMouseEvent *QSimpleCanvasPrivate::mouseEventToSceneMouseEvent(QMou
     return me;
 }
 
-bool QSimpleCanvasPrivate::deliverMousePress(QSimpleCanvasItem *base, QMouseEvent *e)
+bool QSimpleCanvasPrivate::deliverMousePress(QSimpleCanvasItem *base, QMouseEvent *e, bool seenChildFilter)
 {
     if(base->clipType()) {
         QRectF br = base->boundingRect();
@@ -427,22 +427,25 @@ bool QSimpleCanvasPrivate::deliverMousePress(QSimpleCanvasItem *base, QMouseEven
     }
 
     const QList<QSimpleCanvasItem *> &children = base->d_func()->children;
+
+    if(base->options() & QSimpleCanvasItem::ChildMouseFilter) 
+        seenChildFilter = true;
+
     for(int ii = children.count() - 1; ii >= 0; --ii) {
         if(children.at(ii)->visible() != 0.)
-            if(deliverMousePress(children.at(ii), e))
+            if(deliverMousePress(children.at(ii), e, seenChildFilter))
                 return true;
     }
 
-    if(base->acceptedMouseButtons() & e->button()) {
+    if(base->acceptedMouseButtons() & e->button() || base->options() & QSimpleCanvasItem::ChildMouseFilter) {
+
         QRectF br = base->boundingRect();
         QPoint pos = base->mapFromScene(e->pos()).toPoint();
 
         if(br.contains(pos)) {
             QGraphicsSceneMouseEvent *me = mouseEventToSceneMouseEvent(e, pos);
-            if (me->type() == QEvent::GraphicsSceneMousePress)
-                base->mousePressEvent(me);
-            else
-                base->mouseDoubleClickEvent(me);
+
+            sendMouseEvent(base, me);
             bool isAccepted = me->isAccepted();
             delete me;
             if(isAccepted) {
@@ -454,6 +457,36 @@ bool QSimpleCanvasPrivate::deliverMousePress(QSimpleCanvasItem *base, QMouseEven
     return false;
 }
 
+// Delivers e to item
+void QSimpleCanvasPrivate::sendMouseEvent(QSimpleCanvasItem *item, QGraphicsSceneMouseEvent *e)
+{
+    QSimpleCanvasItem *p = item->parent();
+    while(p) {
+        if(p->options() & QSimpleCanvasItem::ChildMouseFilter) {
+            if(p->mouseFilter(e))
+                return;
+        }
+        p = p->parent();
+    }
+    switch(e->type()) {
+    case QEvent::GraphicsSceneMousePress:
+        item->mousePressEvent(e);
+        break;
+    case QEvent::GraphicsSceneMouseRelease:
+        item->mouseReleaseEvent(e);
+        break;
+    case QEvent::GraphicsSceneMouseMove:
+        item->mouseMoveEvent(e);
+        break;
+    case QEvent::GraphicsSceneMouseDoubleClick:
+        item->mouseDoubleClickEvent(e);
+        break;
+    default:
+        break;
+    }
+}
+
+
 QSimpleCanvasRootLayer::QSimpleCanvasRootLayer(QSimpleCanvas *c)
 : _canvas(c)
 {
@@ -665,7 +698,7 @@ void QSimpleCanvas::mouseMoveEvent(QMouseEvent *e)
     } else if(d->isSimpleCanvas() && d->lastMouseItem) {
         QPoint p = d->lastMouseItem->mapFromScene(e->pos()).toPoint();
         QGraphicsSceneMouseEvent *me = d->mouseEventToSceneMouseEvent(e, p);
-        d->lastMouseItem->mouseMoveEvent(me);
+        d->sendMouseEvent(d->lastMouseItem, me);
         e->setAccepted(me->isAccepted());
         delete me;
     } else {
@@ -680,7 +713,7 @@ void QSimpleCanvas::mouseReleaseEvent(QMouseEvent *e)
     } else if(d->isSimpleCanvas() && d->lastMouseItem) {
         QPoint p = d->lastMouseItem->mapFromScene(e->pos()).toPoint();
         QGraphicsSceneMouseEvent *me = d->mouseEventToSceneMouseEvent(e, p);
-        d->lastMouseItem->mouseReleaseEvent(me);
+        d->sendMouseEvent(d->lastMouseItem, me);
         d->lastMouseItem->mouseUngrabEvent();
         e->setAccepted(me->isAccepted());
         delete me;
diff --git a/src/declarative/canvas/qsimplecanvas_graphicsview.cpp b/src/declarative/canvas/qsimplecanvas_graphicsview.cpp
index 0f80128..e3cdf19 100644
--- a/src/declarative/canvas/qsimplecanvas_graphicsview.cpp
+++ b/src/declarative/canvas/qsimplecanvas_graphicsview.cpp
@@ -88,21 +88,54 @@ QRectF QSimpleGraphicsItem::boundingRect() const
 
 void QSimpleGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
 {
+    QSimpleCanvasItem *p = owner->parent();
+    while(p) {
+        if(p->options() & QSimpleCanvasItem::ChildMouseFilter) {
+            if(p->mouseFilter(event))
+                return;
+        }
+        p = p->parent();
+    }
     owner->mousePressEvent(event);
 }
 
 void QSimpleGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 {
+    QSimpleCanvasItem *p = owner->parent();
+    while(p) {
+        if(p->options() & QSimpleCanvasItem::ChildMouseFilter) {
+            if(p->mouseFilter(event))
+                return;
+        }
+        p = p->parent();
+    }
     owner->mouseReleaseEvent(event);
+    ungrabMouse();
 }
 
 void QSimpleGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
 {
+    QSimpleCanvasItem *p = owner->parent();
+    while(p) {
+        if(p->options() & QSimpleCanvasItem::ChildMouseFilter) {
+            if(p->mouseFilter(event))
+                return;
+        }
+        p = p->parent();
+    }
     owner->mouseDoubleClickEvent(event);
 }
 
 void QSimpleGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
 {
+    QSimpleCanvasItem *p = owner->parent();
+    while(p) {
+        if(p->options() & QSimpleCanvasItem::ChildMouseFilter) {
+            if(p->mouseFilter(event))
+                return;
+        }
+        p = p->parent();
+    }
     owner->mouseMoveEvent(event);
 }
 
diff --git a/src/declarative/canvas/qsimplecanvas_p.h b/src/declarative/canvas/qsimplecanvas_p.h
index 4c8b41e..44e5a7e 100644
--- a/src/declarative/canvas/qsimplecanvas_p.h
+++ b/src/declarative/canvas/qsimplecanvas_p.h
@@ -107,8 +107,8 @@ class QSimpleCanvasPrivate
 public:
     QSimpleCanvasPrivate(QSimpleCanvas *canvas)
     : q(canvas), timer(0), root(0), lrpTime(0), canvasServer(0), focusItem(0), 
-      lastFocusItem(0), lastMouseItem(0), isSetup(false),
-      view(0)
+      lastFocusItem(0), lastMouseItem(0),
+      isSetup(false), view(0)
 #if defined(QFX_RENDER_OPENGL)
       ,egl(q, this), basicShadersInstance(0)
 #endif
@@ -160,9 +160,10 @@ public:
     void removeMouseFilter(QSimpleCanvasItem *);
     QList<QSimpleCanvasItem *> mouseFilters;
     bool filter(QMouseEvent *e);
-    bool deliverMousePress(QSimpleCanvasItem *, QMouseEvent *);
+    bool deliverMousePress(QSimpleCanvasItem *, QMouseEvent *, bool = false);
     QGraphicsSceneMouseEvent *mouseEventToSceneMouseEvent(QMouseEvent *, const QPoint &);
     QSimpleCanvasItem *lastMouseItem;
+    void sendMouseEvent(QSimpleCanvasItem *, QGraphicsSceneMouseEvent *);
 
     bool isSetup;
 
diff --git a/src/declarative/canvas/qsimplecanvasitem.cpp b/src/declarative/canvas/qsimplecanvasitem.cpp
index 95f7623..b7e3ef0 100644
--- a/src/declarative/canvas/qsimplecanvasitem.cpp
+++ b/src/declarative/canvas/qsimplecanvasitem.cpp
@@ -1287,6 +1287,7 @@ void QSimpleCanvasItem::setOptions(Options options, bool set)
                 d->gvAddMouseFilter();
             else
                 d->gvRemoveMouseFilter();
+
         } else {
             QSimpleCanvas *c = canvas();
             if(c) {
diff --git a/src/declarative/canvas/qsimplecanvasitem.h b/src/declarative/canvas/qsimplecanvasitem.h
index d51f2c8..9b010e8 100644
--- a/src/declarative/canvas/qsimplecanvasitem.h
+++ b/src/declarative/canvas/qsimplecanvasitem.h
@@ -82,13 +82,14 @@ public:
                     ClipToRect = 0x03 };
     enum Option { NoOption = 0x00000000,
                   MouseFilter = 0x00000001,
-                  HoverEvents = 0x00000002,
-                  MouseEvents = 0x00000004,
-                  HasContents = 0x00000008,
-                  SimpleItem = 0x00000010,
-                  IsFocusPanel = 0x00000020,
-                  IsFocusRealm = 0x00000040,
-                  AcceptsInputMethods = 0x00000080};
+                  ChildMouseFilter = 0x00000002,
+                  HoverEvents = 0x00000004,
+                  MouseEvents = 0x00000008,
+                  HasContents = 0x00000010,
+                  SimpleItem = 0x00000020,
+                  IsFocusPanel = 0x00000040,
+                  IsFocusRealm = 0x00000080,
+                  AcceptsInputMethods = 0x00000100};
     Q_DECLARE_FLAGS(Options, Option);
 
     QSimpleCanvasItem(QSimpleCanvasItem *parent=0);
diff --git a/src/declarative/canvas/qsimplecanvasitem_p.h b/src/declarative/canvas/qsimplecanvasitem_p.h
index 7f66be5..7a90c24 100644
--- a/src/declarative/canvas/qsimplecanvasitem_p.h
+++ b/src/declarative/canvas/qsimplecanvasitem_p.h
@@ -137,7 +137,7 @@ public:
 
     QSimpleCanvasItem::ClipType clip:3;
     QSimpleCanvasItem::TransformOrigin origin:4;
-    int options:8;
+    int options:9;
     bool focusable:1;
     bool wantsActiveFocusPanelPendingCanvas:1;
     bool hasBeenActiveFocusPanel:1;
diff --git a/src/declarative/fx/qfxflickable.cpp b/src/declarative/fx/qfxflickable.cpp
index e35d6cf..5715116 100644
--- a/src/declarative/fx/qfxflickable.cpp
+++ b/src/declarative/fx/qfxflickable.cpp
@@ -111,8 +111,8 @@ void QFxFlickablePrivate::init()
     _flick->setParent(q);
     QObject::connect(&_tl, SIGNAL(updated()), q, SLOT(ticked()));
     QObject::connect(&_tl, SIGNAL(completed()), q, SLOT(movementEnding()));
-    q->setAcceptedMouseButtons(Qt::NoButton);
-    q->setOptions(QSimpleCanvasItem::MouseFilter | QSimpleCanvasItem::MouseEvents);
+    q->setAcceptedMouseButtons(Qt::LeftButton);
+    q->setOptions(QSimpleCanvasItem::ChildMouseFilter | QSimpleCanvasItem::MouseEvents);
     QObject::connect(_flick, SIGNAL(leftChanged()), q, SIGNAL(positionChanged()));
     QObject::connect(_flick, SIGNAL(topChanged()), q, SIGNAL(positionChanged()));
     QObject::connect(&elasticX, SIGNAL(updated()), q, SLOT(ticked()));
@@ -528,182 +528,203 @@ qreal QFxFlickable::visibleY() const
     return -d->_moveY.value();
 }
 
-void QFxFlickable::mousePressEvent(QGraphicsSceneMouseEvent *event)
+void QFxFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
 {
-    Q_D(QFxFlickable);
-    if (!d->locked && d->_tl.isActive() && (qAbs(d->velocityX) > 10 || qAbs(d->velocityY) > 10))
-        d->stealMouse = true; // If we've been flicked then steal the click.
+    if (!locked && _tl.isActive() && (qAbs(velocityX) > 10 || qAbs(velocityY) > 10))
+        stealMouse = true; // If we've been flicked then steal the click.
     else
-        d->stealMouse = false;
-    d->pressed = true;
-    d->_tl.clear();
-    d->velocityX = -1;
-    d->velocityY = -1;
-    d->lastPos = QPoint();
-    d->lastPosTime.start();
-    d->pressPos = event->pos();
-    d->pressX = d->_moveX.value();
-    d->pressY = d->_moveY.value();
-    d->flicked = false;
-    d->pressTime.start();
-    if (d->dragMode == Elastic) {
-        d->elasticX.clear();
-        d->elasticY.clear();
+        stealMouse = false;
+    pressed = true;
+    _tl.clear();
+    velocityX = -1;
+    velocityY = -1;
+    lastPos = QPoint();
+    lastPosTime.start();
+    pressPos = event->pos();
+    pressX = _moveX.value();
+    pressY = _moveY.value();
+    flicked = false;
+    pressTime.start();
+    if (dragMode == QFxFlickable::Elastic) {
+        elasticX.clear();
+        elasticY.clear();
     }
-    d->velocityTime.start();
+    velocityTime.start();
 }
 
-void QFxFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+void QFxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
 {
-    Q_D(QFxFlickable);
-    if (d->locked || d->lastPosTime.isNull())
+    Q_Q(QFxFlickable);
+    if (locked || lastPosTime.isNull())
         return;
     bool rejectY = false;
     bool rejectX = false;
     bool moved = false;
 
-    if(yflick()) {
-        int dy = int(event->pos().y() - d->pressPos.y());
-        if (qAbs(dy) > FlickThreshold || d->pressTime.elapsed() > 200) {
-            qreal newY = dy + d->pressY;
-            const qreal minY = minYExtent();
-            const qreal maxY = maxYExtent();
+    if(q->yflick()) {
+        int dy = int(event->pos().y() - pressPos.y());
+        if (qAbs(dy) > FlickThreshold || pressTime.elapsed() > 200) {
+            qreal newY = dy + pressY;
+            const qreal minY = q->minYExtent();
+            const qreal maxY = q->maxYExtent();
             if(newY > minY)
                 newY = minY + (newY - minY) / 2;
             if(newY < maxY && maxY - minY < 0)
                 newY = maxY + (newY - maxY) / 2;
-            if(overShoot() || (newY <= minY && newY >= maxY)) {
-                if (d->dragMode == Hard)
-                    d->_moveY.setValue(newY);
+            if(q->overShoot() || (newY <= minY && newY >= maxY)) {
+                if (dragMode == QFxFlickable::Hard)
+                    _moveY.setValue(newY);
                 else
-                    d->elasticY.setValue(newY);
+                    elasticY.setValue(newY);
                 moved = true;
-            } else if (!overShoot())
+            } else if (!q->overShoot())
                 rejectY = true;
             if (qAbs(dy) > FlickThreshold)
-                d->stealMouse = true;
+                stealMouse = true;
         }
     }
 
-    if(xflick()) {
-        int dx = int(event->pos().x() - d->pressPos.x());
-        if (qAbs(dx) > FlickThreshold || d->pressTime.elapsed() > 200) {
-            qreal newX = dx + d->pressX;
-            if(overShoot() || (newX <= minXExtent() && newX >= maxXExtent())) {
-                if (d->dragMode == Hard)
-                    d->_moveX.setValue(newX);
+    if(q->xflick()) {
+        int dx = int(event->pos().x() - pressPos.x());
+        if (qAbs(dx) > FlickThreshold || pressTime.elapsed() > 200) {
+            qreal newX = dx + pressX;
+            if(q->overShoot() || (newX <= q->minXExtent() && newX >= q->maxXExtent())) {
+                if (dragMode == QFxFlickable::Hard)
+                    _moveX.setValue(newX);
                 else
-                    d->elasticX.setValue(newX);
+                    elasticX.setValue(newX);
                 moved = true;
-            } else if (!overShoot())
+            } else if (!q->overShoot())
                 rejectX = true;
             if (qAbs(dx) > FlickThreshold)
-                d->stealMouse = true;
+                stealMouse = true;
         }
     }
 
-    if(!d->lastPos.isNull()) {
-        qreal elapsed = qreal(d->lastPosTime.restart()) / 1000.;
+    if(!lastPos.isNull()) {
+        qreal elapsed = qreal(lastPosTime.restart()) / 1000.;
         if(elapsed <= 0)
             elapsed = 1;
-        if(yflick()) {
-            qreal diff = event->pos().y() - d->lastPos.y();
-            d->velocityY = diff / elapsed;
+        if(q->yflick()) {
+            qreal diff = event->pos().y() - lastPos.y();
+            velocityY = diff / elapsed;
         }
 
-        if(xflick()) {
-            qreal diff = event->pos().x() - d->lastPos.x();
-            d->velocityX = diff / elapsed;
+        if(q->xflick()) {
+            qreal diff = event->pos().x() - lastPos.x();
+            velocityX = diff / elapsed;
         }
     }
 
-    if(rejectY) d->velocityY = 0;
-    if(rejectX) d->velocityX = 0;
+    if(rejectY) velocityY = 0;
+    if(rejectX) velocityX = 0;
 
     if (moved) {
-        viewportMoved();
-        movementStarting();
+        q->viewportMoved();
+        q->movementStarting();
     }
 
-    d->lastPos = event->pos();
+    lastPos = event->pos();
 }
 
-void QFxFlickable::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
+void QFxFlickablePrivate::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 {
-    Q_D(QFxFlickable);
-    d->pressed = false;
-    if (d->lastPosTime.isNull())
+    Q_Q(QFxFlickable);
+
+    pressed = false;
+    if (lastPosTime.isNull())
         return;
 
-    if (d->dragMode == Elastic) {
-        d->elasticY.clear();
-        d->elasticX.clear();
+    if (dragMode == QFxFlickable::Elastic) {
+        elasticY.clear();
+        elasticX.clear();
     }
 
-    d->vTime = d->_tl.time();
-    if(qAbs(d->velocityY) > 10) {
+    vTime = _tl.time();
+    if(qAbs(velocityY) > 10) {
         qreal maxDistance = -1;
         // -ve velocity means list is moving up
-        if(d->velocityY > 0) {
-            if(d->_moveY.value() < minYExtent())
-                maxDistance = qAbs(minYExtent() -d->_moveY.value() + (d->overShoot?30:0));
+        if(velocityY > 0) {
+            if(_moveY.value() < q->minYExtent())
+                maxDistance = qAbs(q->minYExtent() -_moveY.value() + (overShoot?30:0));
         } else {
-            if(d->_moveY.value() > maxYExtent())
-                maxDistance = qAbs(maxYExtent() - d->_moveY.value()) + (d->overShoot?30:0);
+            if(_moveY.value() > q->maxYExtent())
+                maxDistance = qAbs(q->maxYExtent() - _moveY.value()) + (overShoot?30:0);
         }
         if(maxDistance > 0) {
-            qreal v = d->velocityY;
-            if(d->maxVelocity != -1 && d->maxVelocity < qAbs(v)) {
+            qreal v = velocityY;
+            if(maxVelocity != -1 && maxVelocity < qAbs(v)) {
                 if(v < 0)
-                    v = -d->maxVelocity;
+                    v = -maxVelocity;
                 else
-                    v = d->maxVelocity;
+                    v = maxVelocity;
             }
-            d->_tl.accel(d->_moveY, v, 500, maxDistance);
-            d->_tl.execute(d->fixupYEvent);
-            d->flicked = true;
-            emit flickingChanged();
-            emit flickStarted();
+            _tl.accel(_moveY, v, 500, maxDistance);
+            _tl.execute(fixupYEvent);
+            flicked = true;
+            emit q->flickingChanged();
+            emit q->flickStarted();
         } else {
-            d->fixupY();
+            fixupY();
         }
     } else {
-        d->fixupY();
+        fixupY();
     }
-    if(qAbs(d->velocityX) > 10) {
+    if(qAbs(velocityX) > 10) {
         qreal maxDistance = -1;
         // -ve velocity means list is moving up
-        if(d->velocityX > 0) {
-            if(d->_moveX.value() < minXExtent())
-                maxDistance = qAbs(minXExtent()) -d->_moveX.value() + (d->overShoot?30:0);
+        if(velocityX > 0) {
+            if(_moveX.value() < q->minXExtent())
+                maxDistance = qAbs(q->minXExtent()) -_moveX.value() + (overShoot?30:0);
         } else {
-            if(d->_moveX.value() > maxXExtent())
-                maxDistance = qAbs(maxXExtent() - d->_moveX.value()) + (d->overShoot?30:0);
+            if(_moveX.value() > q->maxXExtent())
+                maxDistance = qAbs(q->maxXExtent() - _moveX.value()) + (overShoot?30:0);
         }
         if(maxDistance > 0) {
-            qreal v = d->velocityX;
-            if(d->maxVelocity != -1 && d->maxVelocity < qAbs(v)) {
+            qreal v = velocityX;
+            if(maxVelocity != -1 && maxVelocity < qAbs(v)) {
                 if(v < 0)
-                    v = -d->maxVelocity;
+                    v = -maxVelocity;
                 else
-                    v = d->maxVelocity;
+                    v = maxVelocity;
             }
-            d->_tl.accel(d->_moveX, v, 500, maxDistance);
-            d->_tl.execute(d->fixupXEvent);
-            d->flicked = true;
-            emit flickingChanged();
-            emit flickStarted();
+            _tl.accel(_moveX, v, 500, maxDistance);
+            _tl.execute(fixupXEvent);
+            flicked = true;
+            emit q->flickingChanged();
+            emit q->flickStarted();
         } else {
-            d->fixupX();
+            fixupX();
         }
     } else {
-        d->fixupX();
+        fixupX();
     }
-    d->stealMouse = false;
-    d->lastPosTime = QTime();
+    stealMouse = false;
+    lastPosTime = QTime();
+
+    if(!_tl.isActive())
+        q->movementEnding();
+}
 
-    if(!d->_tl.isActive())
-        movementEnding();
+void QFxFlickable::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QFxFlickable);
+    d->handleMousePressEvent(event);
+    event->accept();
+}
+
+void QFxFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QFxFlickable);
+    d->handleMouseMoveEvent(event);
+    event->accept();
+}
+
+void QFxFlickable::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(QFxFlickable);
+    d->handleMouseReleaseEvent(event);
+    event->accept();
 }
 
 qreal QFxFlickable::minYExtent() const
@@ -984,20 +1005,20 @@ bool QFxFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event)
 
         switch(mouseEvent.type()) {
         case QEvent::GraphicsSceneMouseMove:
-            mouseMoveEvent(&mouseEvent);
+            d->handleMouseMoveEvent(&mouseEvent);
             break;
         case QEvent::GraphicsSceneMousePress:
-            mousePressEvent(&mouseEvent);
+            d->handleMousePressEvent(&mouseEvent);
             break;
         case QEvent::GraphicsSceneMouseRelease:
-            mouseReleaseEvent(&mouseEvent);
+            d->handleMouseReleaseEvent(&mouseEvent);
             break;
         default:
             break;
         }
         grabber = static_cast<QFxItem*>(mouseGrabberItem());
         if (grabber && d->stealMouse && !grabber->keepMouseGrab())
-            mouseGrabberItem()->ungrabMouse();
+            grabMouse();
 
         return d->stealMouse;
     } else if (!d->lastPosTime.isNull()) {
@@ -1014,12 +1035,7 @@ bool QFxFlickable::mouseFilter(QGraphicsSceneMouseEvent *e)
     case QEvent::GraphicsSceneMousePress:
     case QEvent::GraphicsSceneMouseMove:
     case QEvent::GraphicsSceneMouseRelease: 
-        {
-        bool ret = sendMouseEvent(e);
-        if (e->type() == QEvent::GraphicsSceneMouseRelease) 
-            return ret;
-        break; 
-        }
+        return sendMouseEvent(e);
     default:
         break;
     }
diff --git a/src/declarative/fx/qfxflickable_p.h b/src/declarative/fx/qfxflickable_p.h
index ddbfb31..59450e0 100644
--- a/src/declarative/fx/qfxflickable_p.h
+++ b/src/declarative/fx/qfxflickable_p.h
@@ -151,6 +151,10 @@ public:
     qreal pageYPosition;
     qreal pageHeight;
 
+    void handleMousePressEvent(QGraphicsSceneMouseEvent *);
+    void handleMouseMoveEvent(QGraphicsSceneMouseEvent *);
+    void handleMouseReleaseEvent(QGraphicsSceneMouseEvent *);
+
     // flickableData property
     void data_removeAt(int);
     int data_count() const;
-- 
cgit v0.12