From ba7485012033b0447a9e77d5612db734f9dcffd6 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Mon, 27 Apr 2009 14:06:23 +0200 Subject: Fixed gesture event propagation and offset translation. --- src/gui/kernel/qapplication.cpp | 39 ++++++++++++++++++++------------------ src/gui/kernel/qgesture.h | 1 + src/gui/kernel/qgesturemanager.cpp | 23 +--------------------- 3 files changed, 23 insertions(+), 40 deletions(-) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index 39aeaa6..ebd62e6 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -4032,27 +4032,30 @@ bool QApplication::notify(QObject *receiver, QEvent *e) case QEvent::Gesture: { QWidget *w = static_cast(receiver); - QGestureEvent *g = static_cast(e); - bool eventAccepted = g->isAccepted(); - // Q_ASSERT(g->gesture() != 0); - // const QGesture &gesture = *g->gesture(); - QPoint relPos(0,0); + QGestureEvent *ge = static_cast(e); + QSet eventGestures; + foreach(const QString &gesture, ge->gestureTypes()) + eventGestures << gesture; + bool eventAccepted = ge->isAccepted(); + + QPoint offset; while (w) { - // QGesture qge(gesture.gestureType(), gesture.startPos()+relPos, gesture.lastPos()+relPos, - // gesture.currentPos()+relPos, gesture.direction(), gesture.rect().translated(relPos), - // gesture.hotSpot()+relPos, gesture.state(), gesture.startTime()); - // QGestureEvent ge(&qge, false); - // ### TODO: fix widget-relative positions in gesture event. - QGestureEvent ge = *g; - ge.spont = g->spontaneous(); - res = d->notify_helper(w, w == receiver ? g : &ge); - g->spont = false; - eventAccepted = (w == receiver ? g : &ge)->isAccepted(); - if (res && eventAccepted) - break; + QSet widgetGestures = w->d_func()->gestures; + foreach(int gestureId, widgetGestures) { + if (eventGestures.contains(QGestureManager::instance()->gestureNameFromId(gestureId))) { + foreach(QGesture *gesture, ge->gestures()) + gesture->translate(offset); + offset = QPoint(); + res = d->notify_helper(w, ge); + ge->spont = false; + eventAccepted = ge->isAccepted(); + if (res && eventAccepted) + break; + } + } if (w->isWindow()) break; - relPos += w->pos(); + offset += w->pos(); w = w->parentWidget(); } break; diff --git a/src/gui/kernel/qgesture.h b/src/gui/kernel/qgesture.h index 2a92588..da1bc90 100644 --- a/src/gui/kernel/qgesture.h +++ b/src/gui/kernel/qgesture.h @@ -101,6 +101,7 @@ protected: private: friend class QGestureManager; + friend class QApplication; friend class QGestureRecognizerPan; friend class QDoubleTapGestureRecognizer; friend class QTapAndHoldGestureRecognizer; diff --git a/src/gui/kernel/qgesturemanager.cpp b/src/gui/kernel/qgesturemanager.cpp index 994b2b6..b5b8fb8 100644 --- a/src/gui/kernel/qgesturemanager.cpp +++ b/src/gui/kernel/qgesturemanager.cpp @@ -482,28 +482,7 @@ void QGestureManager::recognizerStateChanged(QGestureRecognizer::Result result) bool QGestureManager::sendGestureEvent(QWidget *receiver, QGestureEvent *event) { - QSet eventGestures; - foreach(const QString &gesture, event->gestureTypes()) - eventGestures << gesture; - - QPoint offset; - bool found = false; - while (receiver) { - QSet widgetGestures = receiver->d_func()->gestures; - foreach(int gestureId, widgetGestures) { - if (eventGestures.contains(gestureNameFromId(gestureId))) { - found = true; - break; - } - } - if (found) - break; - offset += receiver->pos(); - receiver = receiver->parentWidget(); - } - foreach(QGesture *gesture, event->gestures()) - gesture->translate(offset); - return receiver ? qt_sendSpontaneousEvent(receiver, event) : false; + return qt_sendSpontaneousEvent(receiver, event); } int QGestureManager::eventDeliveryDelay() const -- cgit v0.12