diff options
-rw-r--r-- | src/datavisualization/engine/abstract3dcontroller.cpp | 9 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.cpp | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dcamera.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscatter.cpp | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscatter.h | 3 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.cpp | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.h | 3 | ||||
-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 | ||||
-rw-r--r-- | src/datavisualizationqml2/abstractdeclarative.cpp | 9 |
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) |