summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp9
-rw-r--r--src/datavisualization/engine/q3dbars.cpp2
-rw-r--r--src/datavisualization/engine/q3dbars.h2
-rw-r--r--src/datavisualization/engine/q3dcamera.h2
-rw-r--r--src/datavisualization/engine/q3dscatter.cpp2
-rw-r--r--src/datavisualization/engine/q3dscatter.h3
-rw-r--r--src/datavisualization/engine/q3dsurface.cpp6
-rw-r--r--src/datavisualization/engine/q3dsurface.h3
-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
-rw-r--r--src/datavisualizationqml2/abstractdeclarative.cpp9
12 files changed, 77 insertions, 86 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp
index 61c9115a..8d190f48 100644
--- a/src/datavisualization/engine/abstract3dcontroller.cpp
+++ b/src/datavisualization/engine/abstract3dcontroller.cpp
@@ -26,12 +26,7 @@
#include "q3dlight.h"
#include "qabstractdataproxy_p.h"
#include "qabstract3dinputhandler_p.h"
-
-#if defined(Q_OS_ANDROID)
#include "qtouch3dinputhandler.h"
-#else
-#include "q3dinputhandler.h"
-#endif
#include <QThread>
@@ -66,11 +61,7 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) :
// Create initial default input handler
QAbstract3DInputHandler *inputHandler;
-#if defined(Q_OS_ANDROID)
inputHandler = new QTouch3DInputHandler();
-#else
- inputHandler = new Q3DInputHandler();
-#endif
inputHandler->d_ptr->m_isDefaultHandler = true;
setActiveInputHandler(inputHandler);
connect(inputHandler, &QAbstract3DInputHandler::inputStateChanged, this,
diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp
index a4b93840..d99ece1a 100644
--- a/src/datavisualization/engine/q3dbars.cpp
+++ b/src/datavisualization/engine/q3dbars.cpp
@@ -110,7 +110,6 @@ Q3DBars::~Q3DBars()
{
}
-#if defined(Q_OS_ANDROID)
/*!
* \internal
*/
@@ -126,7 +125,6 @@ void Q3DBars::touchEvent(QTouchEvent *event)
{
d_ptr->m_shared->touchEvent(event);
}
-#endif
/*!
* \internal
diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h
index 078100a1..e4c1d785 100644
--- a/src/datavisualization/engine/q3dbars.h
+++ b/src/datavisualization/engine/q3dbars.h
@@ -125,10 +125,8 @@ signals:
protected:
-#if defined(Q_OS_ANDROID)
void mouseDoubleClickEvent(QMouseEvent *event);
void touchEvent(QTouchEvent *event);
-#endif
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
diff --git a/src/datavisualization/engine/q3dcamera.h b/src/datavisualization/engine/q3dcamera.h
index 8e7a9a23..5780fcda 100644
--- a/src/datavisualization/engine/q3dcamera.h
+++ b/src/datavisualization/engine/q3dcamera.h
@@ -80,7 +80,7 @@ private:
friend class Scatter3DRenderer;
friend class SelectionPointer;
friend class Q3DInputHandler;
- friend class QTouch3DInputHandler;
+ friend class QTouch3DInputHandlerPrivate;
friend class QMac3DInputHandler;
};
diff --git a/src/datavisualization/engine/q3dscatter.cpp b/src/datavisualization/engine/q3dscatter.cpp
index 28c453e3..816849fe 100644
--- a/src/datavisualization/engine/q3dscatter.cpp
+++ b/src/datavisualization/engine/q3dscatter.cpp
@@ -101,7 +101,6 @@ Q3DScatter::~Q3DScatter()
{
}
-#if defined(Q_OS_ANDROID)
/*!
* \internal
*/
@@ -117,7 +116,6 @@ void Q3DScatter::touchEvent(QTouchEvent *event)
{
d_ptr->m_shared->touchEvent(event);
}
-#endif
/*!
* \internal
diff --git a/src/datavisualization/engine/q3dscatter.h b/src/datavisualization/engine/q3dscatter.h
index 8fa3eae4..33e74d7d 100644
--- a/src/datavisualization/engine/q3dscatter.h
+++ b/src/datavisualization/engine/q3dscatter.h
@@ -112,11 +112,8 @@ signals:
void selectedItemIndexChanged(int index);
protected:
-
-#if defined(Q_OS_ANDROID)
void mouseDoubleClickEvent(QMouseEvent *event);
void touchEvent(QTouchEvent *event);
-#endif
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp
index bc6e4bca..467fbc1c 100644
--- a/src/datavisualization/engine/q3dsurface.cpp
+++ b/src/datavisualization/engine/q3dsurface.cpp
@@ -111,13 +111,12 @@ Q3DSurface::~Q3DSurface()
{
}
-#if defined(Q_OS_ANDROID)
/*!
* \internal
*/
void Q3DSurface::mouseDoubleClickEvent(QMouseEvent *event)
{
- Q_UNUSED(event)
+ d_ptr->m_shared->mouseDoubleClickEvent(event);
}
/*!
@@ -125,9 +124,8 @@ void Q3DSurface::mouseDoubleClickEvent(QMouseEvent *event)
*/
void Q3DSurface::touchEvent(QTouchEvent *event)
{
- Q_UNUSED(event)
+ d_ptr->m_shared->touchEvent(event);
}
-#endif
/*!
* \internal
diff --git a/src/datavisualization/engine/q3dsurface.h b/src/datavisualization/engine/q3dsurface.h
index c0edd6d7..957234b7 100644
--- a/src/datavisualization/engine/q3dsurface.h
+++ b/src/datavisualization/engine/q3dsurface.h
@@ -98,11 +98,8 @@ public:
QDataVis::LabelTransparency labelTransparency() const;
protected:
-
-#if defined(Q_OS_ANDROID)
void mouseDoubleClickEvent(QMouseEvent *event);
void touchEvent(QTouchEvent *event);
-#endif
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
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;
diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp
index a2b39bf0..47f13f29 100644
--- a/src/datavisualizationqml2/abstractdeclarative.cpp
+++ b/src/datavisualizationqml2/abstractdeclarative.cpp
@@ -135,24 +135,15 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller)
&AbstractDeclarative::handleShadowQualityUpdate);
}
-
void AbstractDeclarative::mouseDoubleClickEvent(QMouseEvent *event)
{
-#if defined(Q_OS_ANDROID)
m_controller->mouseDoubleClickEvent(event);
-#else
- Q_UNUSED(event)
-#endif
}
void AbstractDeclarative::touchEvent(QTouchEvent *event)
{
-#if defined(Q_OS_ANDROID)
m_controller->touchEvent(event);
update();
-#else
- Q_UNUSED(event)
-#endif
}
void AbstractDeclarative::mousePressEvent(QMouseEvent *event)