diff options
author | David Boddie <dboddie@trolltech.com> | 2009-08-27 13:13:33 (GMT) |
---|---|---|
committer | David Boddie <dboddie@trolltech.com> | 2009-08-27 13:13:33 (GMT) |
commit | 919259cadd1adc18aaaef7e6f453e3fa005dd8b7 (patch) | |
tree | 4985e8f6b54dcf7bebf73c83cd955ec797784897 /src/gui/kernel | |
parent | bb76203895a8a33bc76a4e4662492d1100c8b4fd (diff) | |
parent | 29488d2315c594a273da6b7adb8d238aeca23083 (diff) | |
download | Qt-919259cadd1adc18aaaef7e6f453e3fa005dd8b7.zip Qt-919259cadd1adc18aaaef7e6f453e3fa005dd8b7.tar.gz Qt-919259cadd1adc18aaaef7e6f453e3fa005dd8b7.tar.bz2 |
Merge branch '4.6' of git@scm.dev.nokia.troll.no:qt/qt into 4.6
Diffstat (limited to 'src/gui/kernel')
-rw-r--r-- | src/gui/kernel/qcocoaview_mac.mm | 2 | ||||
-rw-r--r-- | src/gui/kernel/qstandardgestures.cpp | 123 | ||||
-rw-r--r-- | src/gui/kernel/qstandardgestures.h | 20 | ||||
-rw-r--r-- | src/gui/kernel/qstandardgestures_p.h | 25 | ||||
-rw-r--r-- | src/gui/kernel/qwidget_mac.mm | 2 |
5 files changed, 99 insertions, 73 deletions
diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index 5ab7ed2..df50e55 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -892,7 +892,7 @@ extern "C" { qNGEvent.gestureType = QNativeGestureEvent::Rotate; NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); - qNGEvent.percentage = [event rotation]; + qNGEvent.percentage = -[event rotation]; qt_sendSpontaneousEvent(qwidget, &qNGEvent); } diff --git a/src/gui/kernel/qstandardgestures.cpp b/src/gui/kernel/qstandardgestures.cpp index d798d32..0c4cadf 100644 --- a/src/gui/kernel/qstandardgestures.cpp +++ b/src/gui/kernel/qstandardgestures.cpp @@ -72,6 +72,7 @@ QWidgetPrivate *qt_widget_private(QWidget *widget); QPanGesture::QPanGesture(QWidget *gestureTarget, QObject *parent) : QGesture(*new QPanGesturePrivate, gestureTarget, parent) { + setObjectName(QLatin1String("QPanGesture")); } void QPanGesturePrivate::setupGestureTarget(QObject *newGestureTarget) @@ -80,16 +81,22 @@ void QPanGesturePrivate::setupGestureTarget(QObject *newGestureTarget) if (gestureTarget && gestureTarget->isWidgetType()) { QWidget *w = static_cast<QWidget*>(gestureTarget.data()); QApplicationPrivate::instance()->widgetGestures[w].pan = 0; -#ifdef Q_WS_WIN +#if defined(Q_WS_WIN) qt_widget_private(w)->winSetupGestures(); +#elif defined(Q_WS_MAC) + w->setAttribute(Qt::WA_AcceptTouchEvents, false); + w->setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents, false); #endif } if (newGestureTarget && newGestureTarget->isWidgetType()) { QWidget *w = static_cast<QWidget*>(newGestureTarget); QApplicationPrivate::instance()->widgetGestures[w].pan = q; -#ifdef Q_WS_WIN +#if defined(Q_WS_WIN) qt_widget_private(w)->winSetupGestures(); +#elif defined(Q_WS_MAC) + w->setAttribute(Qt::WA_AcceptTouchEvents); + w->setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); #endif } QGesturePrivate::setupGestureTarget(newGestureTarget); @@ -98,15 +105,13 @@ void QPanGesturePrivate::setupGestureTarget(QObject *newGestureTarget) /*! \internal */ bool QPanGesture::event(QEvent *event) { -#if defined(Q_OS_MAC) && !defined(QT_MAC_USE_COCOA) +#if defined(QT_MAC_USE_COCOA) Q_D(QPanGesture); if (event->type() == QEvent::Timer) { const QTimerEvent *te = static_cast<QTimerEvent *>(event); - if (te->timerId() == d->panFinishedTimer) { - killTimer(d->panFinishedTimer); - d->panFinishedTimer = 0; - d->lastOffset = QSize(0, 0); - updateState(Qt::GestureFinished); + if (te->timerId() == d->singleTouchPanTimer.timerId()) { + d->singleTouchPanTimer.stop(); + updateState(Qt::GestureStarted); } } #endif @@ -164,8 +169,10 @@ bool QPanGesture::eventFilter(QObject *receiver, QEvent *event) /*! \internal */ bool QPanGesture::filterEvent(QEvent *event) { +#if defined(Q_WS_WIN) Q_D(QPanGesture); const QTouchEvent *ev = static_cast<const QTouchEvent*>(event); + if (event->type() == QEvent::TouchBegin) { QTouchEvent::TouchPoint p = ev->touchPoints().at(0); d->lastPosition = p.pos().toPoint(); @@ -197,33 +204,55 @@ bool QPanGesture::filterEvent(QEvent *event) } } } -#ifdef Q_OS_MAC - else if (event->type() == QEvent::Wheel) { - // On Mac, there is really no native panning gesture. Instead, a two - // finger pan is delivered as mouse wheel events. Otoh, on Windows, you - // either get mouse wheel events or pan events. We have decided to make this - // the Qt behaviour as well, meaning that on Mac, wheel - // events will be masked away when listening for pan events. -#ifndef QT_MAC_USE_COCOA - // In Carbon we receive neither touch-, nor pan gesture events. - // So we create pan gestures by converting wheel events. After all, this - // is how things are supposed to work on mac in the first place. - const QWheelEvent *wev = static_cast<const QWheelEvent*>(event); - int offset = wev->delta() / -120; - d->lastOffset = wev->orientation() == Qt::Horizontal ? QSize(offset, 0) : QSize(0, offset); +#elif defined(QT_MAC_USE_COCOA) + // The following implements single touch + // panning on Mac: + Q_D(QPanGesture); + const int panBeginDelay = 300; + const int panBeginRadius = 3; + const QTouchEvent *ev = static_cast<const QTouchEvent*>(event); - if (state() == Qt::NoGesture) { - d->totalOffset = d->lastOffset; - } else { - d->totalOffset += d->lastOffset; + switch (event->type()) { + case QEvent::TouchBegin: { + if (ev->touchPoints().size() == 1) { + d->lastPosition = QCursor::pos(); + d->singleTouchPanTimer.start(panBeginDelay, this); } - - killTimer(d->panFinishedTimer); - d->panFinishedTimer = startTimer(200); - updateState(Qt::GestureUpdated); -#endif - return true; + break;} + case QEvent::TouchEnd: { + if (state() != Qt::NoGesture) + updateState(Qt::GestureFinished); + reset(); + break;} + case QEvent::TouchUpdate: { + if (ev->touchPoints().size() == 1) { + if (state() == Qt::NoGesture) { + // INVARIANT: The singleTouchTimer has still not fired. + // Lets check if the user moved his finger so much from + // the starting point that it makes sense to cancel: + const QPointF startPos = ev->touchPoints().at(0).startPos().toPoint(); + const QPointF p = ev->touchPoints().at(0).pos().toPoint(); + if ((startPos - p).manhattanLength() > panBeginRadius) + reset(); + else + d->lastPosition = QCursor::pos(); + } else { + QPointF mousePos = QCursor::pos(); + QPointF dist = mousePos - d->lastPosition; + d->lastPosition = mousePos; + d->lastOffset = QSizeF(dist.x(), dist.y()); + d->totalOffset += d->lastOffset; + updateState(Qt::GestureUpdated); + } + } else if (state() == Qt::NoGesture) { + reset(); + } + break;} + default: + return false; } +#else + Q_UNUSED(event); #endif return false; } @@ -232,14 +261,14 @@ bool QPanGesture::filterEvent(QEvent *event) void QPanGesture::reset() { Q_D(QPanGesture); - d->lastOffset = d->totalOffset = QSize(); - d->lastPosition = QPoint(); -#if defined(Q_OS_MAC) && !defined(QT_MAC_USE_COCOA) - if (d->panFinishedTimer) { - killTimer(d->panFinishedTimer); - d->panFinishedTimer = 0; - } + d->lastOffset = d->totalOffset = QSize(0, 0); + d->lastPosition = QPoint(0, 0); + +#if defined(QT_MAC_USE_COCOA) + d->singleTouchPanTimer.stop(); + d->prevMousePos = QPointF(0, 0); #endif + QGesture::reset(); } @@ -248,7 +277,7 @@ void QPanGesture::reset() Specifies a total pan offset since the start of the gesture. */ -QSize QPanGesture::totalOffset() const +QSizeF QPanGesture::totalOffset() const { Q_D(const QPanGesture); return d->totalOffset; @@ -260,7 +289,7 @@ QSize QPanGesture::totalOffset() const Specifies a pan offset since the last time the gesture was triggered. */ -QSize QPanGesture::lastOffset() const +QSizeF QPanGesture::lastOffset() const { Q_D(const QPanGesture); return d->lastOffset; @@ -338,12 +367,13 @@ bool QPinchGesture::eventFilter(QObject *receiver, QEvent *event) d->state = Qt::NoGesture; d->scaleFactor = d->lastScaleFactor = 1; d->rotationAngle = d->lastRotationAngle = 0; - d->startCenterPoint = d->centerPoint = d->lastCenterPoint = QPoint(); + d->startCenterPoint = d->centerPoint = d->lastCenterPoint = QPointF(); #if defined(Q_WS_WIN) d->initialDistance = 0; #endif return false; case QNativeGestureEvent::Rotate: + d->scaleFactor = 0; d->lastRotationAngle = d->rotationAngle; #if defined(Q_WS_WIN) d->rotationAngle = -1 * GID_ROTATE_ANGLE_FROM_ARGUMENT(ev->argument); @@ -354,6 +384,7 @@ bool QPinchGesture::eventFilter(QObject *receiver, QEvent *event) event->accept(); break; case QNativeGestureEvent::Zoom: + d->rotationAngle = 0; #if defined(Q_WS_WIN) if (d->initialDistance != 0) { d->lastScaleFactor = d->scaleFactor; @@ -402,7 +433,7 @@ void QPinchGesture::reset() Q_D(QPinchGesture); d->scaleFactor = d->lastScaleFactor = 0; d->rotationAngle = d->lastRotationAngle = 0; - d->startCenterPoint = d->centerPoint = d->lastCenterPoint = QPoint(); + d->startCenterPoint = d->centerPoint = d->lastCenterPoint = QPointF(); QGesture::reset(); } @@ -452,7 +483,7 @@ qreal QPinchGesture::lastRotationAngle() const Specifies a center point of the gesture. The point can be used as a center point that the object is rotated around. */ -QPoint QPinchGesture::centerPoint() const +QPointF QPinchGesture::centerPoint() const { return d_func()->centerPoint; } @@ -462,7 +493,7 @@ QPoint QPinchGesture::centerPoint() const Specifies a previous center point of the gesture. */ -QPoint QPinchGesture::lastCenterPoint() const +QPointF QPinchGesture::lastCenterPoint() const { return d_func()->lastCenterPoint; } @@ -474,7 +505,7 @@ QPoint QPinchGesture::lastCenterPoint() const startCenterPoint and the centerPoint is the distance at which pinching fingers has shifted. */ -QPoint QPinchGesture::startCenterPoint() const +QPointF QPinchGesture::startCenterPoint() const { return d_func()->startCenterPoint; } diff --git a/src/gui/kernel/qstandardgestures.h b/src/gui/kernel/qstandardgestures.h index 0eb9d92..9f2f204 100644 --- a/src/gui/kernel/qstandardgestures.h +++ b/src/gui/kernel/qstandardgestures.h @@ -59,16 +59,16 @@ class Q_GUI_EXPORT QPanGesture : public QGesture Q_OBJECT Q_DECLARE_PRIVATE(QPanGesture) - Q_PROPERTY(QSize totalOffset READ totalOffset) - Q_PROPERTY(QSize lastOffset READ lastOffset) + Q_PROPERTY(QSizeF totalOffset READ totalOffset) + Q_PROPERTY(QSizeF lastOffset READ lastOffset) public: QPanGesture(QWidget *gestureTarget, QObject *parent = 0); bool filterEvent(QEvent *event); - QSize totalOffset() const; - QSize lastOffset() const; + QSizeF totalOffset() const; + QSizeF lastOffset() const; protected: void reset(); @@ -92,9 +92,9 @@ class Q_GUI_EXPORT QPinchGesture : public QGesture Q_PROPERTY(qreal rotationAngle READ rotationAngle) Q_PROPERTY(qreal lastRotationAngle READ lastRotationAngle) - Q_PROPERTY(QPoint startCenterPoint READ startCenterPoint) - Q_PROPERTY(QPoint lastCenterPoint READ lastCenterPoint) - Q_PROPERTY(QPoint centerPoint READ centerPoint) + Q_PROPERTY(QPointF startCenterPoint READ startCenterPoint) + Q_PROPERTY(QPointF lastCenterPoint READ lastCenterPoint) + Q_PROPERTY(QPointF centerPoint READ centerPoint) public: QPinchGesture(QWidget *gestureTarget, QObject *parent = 0); @@ -102,9 +102,9 @@ public: bool filterEvent(QEvent *event); void reset(); - QPoint startCenterPoint() const; - QPoint lastCenterPoint() const; - QPoint centerPoint() const; + QPointF startCenterPoint() const; + QPointF lastCenterPoint() const; + QPointF centerPoint() const; qreal scaleFactor() const; qreal lastScaleFactor() const; diff --git a/src/gui/kernel/qstandardgestures_p.h b/src/gui/kernel/qstandardgestures_p.h index 5fbcc5d..0a4debe 100644 --- a/src/gui/kernel/qstandardgestures_p.h +++ b/src/gui/kernel/qstandardgestures_p.h @@ -61,6 +61,7 @@ #include "qgesture_p.h" #include "qstandardgestures.h" +#include "qbasictimer.h" QT_BEGIN_NAMESPACE @@ -69,21 +70,15 @@ class QPanGesturePrivate : public QGesturePrivate Q_DECLARE_PUBLIC(QPanGesture) public: - QPanGesturePrivate() - { -#if defined(Q_OS_MAC) && !defined(QT_MAC_USE_COCOA) - panFinishedTimer = 0; -#endif - } - void setupGestureTarget(QObject *o); - QSize totalOffset; - QSize lastOffset; - QPoint lastPosition; + QSizeF totalOffset; + QSizeF lastOffset; + QPointF lastPosition; -#if defined(Q_OS_MAC) && !defined(QT_MAC_USE_COCOA) - int panFinishedTimer; +#if defined(QT_MAC_USE_COCOA) + QBasicTimer singleTouchPanTimer; + QPointF prevMousePos; #endif }; @@ -107,9 +102,9 @@ public: qreal lastScaleFactor; qreal rotationAngle; qreal lastRotationAngle; - QPoint startCenterPoint; - QPoint lastCenterPoint; - QPoint centerPoint; + QPointF startCenterPoint; + QPointF lastCenterPoint; + QPointF centerPoint; #ifdef Q_WS_WIN int initialDistance; #endif diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 53d1b6e..192ae6b 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -1064,7 +1064,7 @@ OSStatus QWidgetPrivate::qt_window_event(EventHandlerCallRef er, EventRef event, break; } qNGEvent.gestureType = QNativeGestureEvent::Rotate; - qNGEvent.percentage = float(amount); + qNGEvent.percentage = float(-amount); break; } case kEventGestureSwipe: { HIPoint swipeDirection; |