QtPinchGestureRecognizer.cpp [plain text]
#include "config.h"
#include "QtPinchGestureRecognizer.h"
#include "QtViewportInteractionEngine.h"
#include "QtWebPageEventHandler.h"
#include <QtCore/QLineF>
namespace WebKit {
const qreal pinchInitialTriggerDistanceThreshold = 5.;
static inline QPointF computePinchCenter(const QTouchEvent::TouchPoint& point1, const QTouchEvent::TouchPoint& point2)
{
return (point1.pos() + point2.pos()) / 2.0f;
}
QtPinchGestureRecognizer::QtPinchGestureRecognizer(QtWebPageEventHandler* eventHandler)
: QtGestureRecognizer(eventHandler)
{
reset();
}
bool QtPinchGestureRecognizer::update(const QTouchEvent::TouchPoint& point1, const QTouchEvent::TouchPoint& point2)
{
ASSERT(interactionEngine());
const qreal currentFingerDistance = QLineF(point1.screenPos(), point2.screenPos()).length();
switch (m_state) {
case NoGesture:
m_initialFingerDistance = currentFingerDistance;
m_state = GestureRecognitionStarted;
return false;
case GestureRecognitionStarted: {
const qreal pinchDistance = qAbs(currentFingerDistance - m_initialFingerDistance);
if (pinchDistance < pinchInitialTriggerDistanceThreshold)
return false;
m_state = GestureRecognized;
interactionEngine()->pinchGestureStarted(computePinchCenter(point1, point2));
m_initialFingerDistance = currentFingerDistance;
}
case GestureRecognized:
const qreal totalScaleFactor = currentFingerDistance / m_initialFingerDistance;
const QPointF touchCenterInViewCoordinates = computePinchCenter(point1, point2);
interactionEngine()->pinchGestureRequestUpdate(touchCenterInViewCoordinates, totalScaleFactor);
return true;
break;
}
ASSERT_NOT_REACHED();
return false;
}
void QtPinchGestureRecognizer::finish()
{
if (m_state == NoGesture)
return;
ASSERT(interactionEngine());
interactionEngine()->pinchGestureEnded();
reset();
}
void QtPinchGestureRecognizer::cancel()
{
if (m_state == NoGesture)
return;
ASSERT(interactionEngine());
interactionEngine()->pinchGestureCancelled();
reset();
}
}