summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/input
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-10-01 10:11:38 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-10-01 11:02:16 +0300
commit04aad082a33a51b8ab5563fb8ffb996b19e0e4ed (patch)
treed7bda05ab9839aa5e9e5e5011ad0764a6396f3d9 /src/datavisualization/input
parentff512434c8272989ff08c027cccd1460f8808756 (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.h1
-rw-r--r--src/datavisualization/input/qtouch3dinputhandler.cpp119
-rw-r--r--src/datavisualization/input/qtouch3dinputhandler_p.h5
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;