diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-10-01 10:11:38 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-10-01 11:02:16 +0300 |
commit | 04aad082a33a51b8ab5563fb8ffb996b19e0e4ed (patch) | |
tree | d7bda05ab9839aa5e9e5e5011ad0764a6396f3d9 /src/datavisualization/input | |
parent | ff512434c8272989ff08c027cccd1460f8808756 (diff) |
Touch support update
Task-number: QTRD-2345
Change-Id: Ia6b6fd8d19cffcdfdba3aaab2bff0bbf941cf5a6
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavisualization/input')
-rw-r--r-- | src/datavisualization/input/qabstract3dinputhandler.h | 1 | ||||
-rw-r--r-- | src/datavisualization/input/qtouch3dinputhandler.cpp | 119 | ||||
-rw-r--r-- | src/datavisualization/input/qtouch3dinputhandler_p.h | 5 |
3 files changed, 74 insertions, 51 deletions
diff --git a/src/datavisualization/input/qabstract3dinputhandler.h b/src/datavisualization/input/qabstract3dinputhandler.h index 96d4de97..0d9aa0aa 100644 --- a/src/datavisualization/input/qabstract3dinputhandler.h +++ b/src/datavisualization/input/qabstract3dinputhandler.h @@ -75,6 +75,7 @@ private: QScopedPointer<QAbstract3DInputHandlerPrivate> d_ptr; friend class Abstract3DController; + friend class QTouch3DInputHandlerPrivate; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/input/qtouch3dinputhandler.cpp b/src/datavisualization/input/qtouch3dinputhandler.cpp index 14ba36dd..ab97332f 100644 --- a/src/datavisualization/input/qtouch3dinputhandler.cpp +++ b/src/datavisualization/input/qtouch3dinputhandler.cpp @@ -19,15 +19,17 @@ #include "qtouch3dinputhandler_p.h" #include "q3dcamera_p.h" #include <QTimer> +#include <qmath.h> QT_DATAVISUALIZATION_BEGIN_NAMESPACE const qreal maxTapAndHoldJitter = 20; +const int maxPinchJitter = 10; +const int maxSelectionJitter = 5; const int tapAndHoldTime = 250; const float rotationSpeed = 200.0f; -const int zoomRateFar = 9; -const int zoomRateMid = 5; -const int zoomRateNear = 1; +const int minZoomLevel = 10; +const int maxZoomLevel = 500; /*! \class QTouch3DInputHandler @@ -66,27 +68,8 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event) if (!scene()->isSlicingActive() && points.count() == 2) { d_ptr->m_holdTimer->stop(); - - setInputState(QDataVis::InputOnPinch); - QPointF distance = points.at(0).pos() - points.at(1).pos(); - int newDistance = distance.manhattanLength(); - int zoomRate = zoomRateFar; - int zoomLevel = scene()->activeCamera()->zoomLevel(); - if (zoomLevel > 250) - zoomRate = zoomRateNear; - else if (zoomLevel > 100) - zoomRate = zoomRateMid; - if (newDistance > prevDistance()) - zoomLevel += zoomRate; - else - zoomLevel -= zoomRate; - if (zoomLevel > 500) - zoomLevel = 500; - else if (zoomLevel < 10) - zoomLevel = 10; - scene()->activeCamera()->setZoomLevel(zoomLevel); - setPrevDistance(newDistance); + d_ptr->handlePinchZoom(distance.manhattanLength()); } else if (points.count() == 1) { QPointF pointerPos = points.at(0).pos(); if (event->type() == QEvent::TouchBegin) { @@ -98,42 +81,23 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event) else setInputState(QDataVis::InputNone); } else { - // Possible tap-and-hold selection start + // Handle possible tap-and-hold selection d_ptr->m_startHoldPos = pointerPos; d_ptr->m_touchHoldPos = d_ptr->m_startHoldPos; d_ptr->m_holdTimer->start(); - // Set state to rotating + // Start rotating setInputState(QDataVis::InputRotating); - // update pointer positions to prevent jumping when releasing or repressing a button setInputPosition(pointerPos.toPoint()); } } else if (event->type() == QEvent::TouchEnd) { d_ptr->m_holdTimer->stop(); - setInputState(QDataVis::InputNone); - // update pointer positions to prevent jumping when releasing or repressing a button - setPreviousInputPos(pointerPos.toPoint()); + // Handle possible selection + d_ptr->handleSelection(pointerPos); } else if (event->type() == QEvent::TouchUpdate) { if (!scene()->isSlicingActive()) { d_ptr->m_touchHoldPos = pointerPos; - if (QDataVis::InputRotating == inputState()) { - // Calculate mouse movement since last frame - QPointF rotations = scene()->activeCamera()->rotations(); - float xRotation = rotations.x(); - float yRotation = rotations.y(); - // TODO: Replace with event's previous position functionality? - float mouseMoveX = float(inputPosition().x() - pointerPos.x()) - / (scene()->viewport().width() / rotationSpeed); - float mouseMoveY = float(inputPosition().y() - pointerPos.y()) - / (scene()->viewport().height() / rotationSpeed); - // Apply to rotations - xRotation -= mouseMoveX; - yRotation -= mouseMoveY; - scene()->activeCamera()->setRotations(QPointF(xRotation, yRotation)); - scene()->activeCamera()->d_ptr->updateViewMatrix(1.0f); - - setPreviousInputPos(inputPosition()); - setInputPosition(pointerPos.toPoint()); - } + // Handle rotation + d_ptr->handleRotation(pointerPos); } } } else { @@ -148,7 +112,7 @@ QTouch3DInputHandlerPrivate::QTouch3DInputHandlerPrivate(QTouch3DInputHandler *q m_holdTimer = new QTimer(); m_holdTimer->setSingleShot(true); m_holdTimer->setInterval(tapAndHoldTime); - connect(m_holdTimer, &QTimer::timeout, this, &QTouch3DInputHandlerPrivate::tapAndHold); + connect(m_holdTimer, &QTimer::timeout, this, &QTouch3DInputHandlerPrivate::handleTapAndHold); } QTouch3DInputHandlerPrivate::~QTouch3DInputHandlerPrivate() @@ -157,7 +121,29 @@ QTouch3DInputHandlerPrivate::~QTouch3DInputHandlerPrivate() delete m_holdTimer; } -void QTouch3DInputHandlerPrivate::tapAndHold() +void QTouch3DInputHandlerPrivate::handlePinchZoom(qreal distance) +{ + int newDistance = distance; + int prevDist = q_ptr->prevDistance(); + if (prevDist > 0 && qAbs(prevDist - newDistance) < maxPinchJitter) + return; + q_ptr->setInputState(QDataVis::InputOnPinch); + Q3DCamera *camera = q_ptr->scene()->activeCamera(); + int zoomLevel = camera->zoomLevel(); + qreal zoomRate = qSqrt(qSqrt(zoomLevel)); + if (newDistance > prevDist) + zoomLevel += zoomRate; + else + zoomLevel -= zoomRate; + if (zoomLevel > maxZoomLevel) + zoomLevel = maxZoomLevel; + else if (zoomLevel < minZoomLevel) + zoomLevel = minZoomLevel; + camera->setZoomLevel(zoomLevel); + q_ptr->setPrevDistance(newDistance); +} + +void QTouch3DInputHandlerPrivate::handleTapAndHold() { QPointF distance = m_startHoldPos - m_touchHoldPos; if (distance.manhattanLength() < maxTapAndHoldJitter) { @@ -166,4 +152,37 @@ void QTouch3DInputHandlerPrivate::tapAndHold() } } +void QTouch3DInputHandlerPrivate::handleSelection(const QPointF &position) +{ + QPointF distance = m_startHoldPos - position; + if (distance.manhattanLength() < maxSelectionJitter) + q_ptr->setInputState(QDataVis::InputOnScene); + else + q_ptr->setInputState(QDataVis::InputNone); + q_ptr->setPreviousInputPos(position.toPoint()); +} + +void QTouch3DInputHandlerPrivate::handleRotation(const QPointF &position) +{ + if (QDataVis::InputRotating == q_ptr->inputState()) { + Q3DScene *scene = q_ptr->scene(); + Q3DCamera *camera = scene->activeCamera(); + QPointF rotations = camera->rotations(); + float xRotation = rotations.x(); + float yRotation = rotations.y(); + QPointF inputPos = q_ptr->inputPosition(); + float mouseMoveX = float(inputPos.x() - position.x()) + / (scene->viewport().width() / rotationSpeed); + float mouseMoveY = float(inputPos.y() - position.y()) + / (scene->viewport().height() / rotationSpeed); + xRotation -= mouseMoveX; + yRotation -= mouseMoveY; + camera->setRotations(QPointF(xRotation, yRotation)); + camera->d_ptr->updateViewMatrix(1.0f); + + q_ptr->setPreviousInputPos(inputPos.toPoint()); + q_ptr->setInputPosition(position.toPoint()); + } +} + QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/input/qtouch3dinputhandler_p.h b/src/datavisualization/input/qtouch3dinputhandler_p.h index f6b7f782..1c5b81c7 100644 --- a/src/datavisualization/input/qtouch3dinputhandler_p.h +++ b/src/datavisualization/input/qtouch3dinputhandler_p.h @@ -33,7 +33,10 @@ public: QTouch3DInputHandlerPrivate(QTouch3DInputHandler *q); ~QTouch3DInputHandlerPrivate(); - void tapAndHold(); + void handlePinchZoom(qreal distance); + void handleTapAndHold(); + void handleSelection(const QPointF &position); + void handleRotation(const QPointF &position); public: QTouch3DInputHandler *q_ptr; |