diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-09-18 12:34:04 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-09-18 12:43:18 +0300 |
commit | a34fa48f1d9a82e5a3172417ee53bf0e0c4261b3 (patch) | |
tree | 71af5b649f16f98eeddfde993a2e96d25b574d2f /src/datavisualization/input | |
parent | 03b9a7b753a255231bedad6a4ad8adcdd09ed842 (diff) |
Implemented tap-and-hold for touch input handler
+ added touch selection support for surface
Task-number: QTRD-2304
Task-number: QTRD-2308
Change-Id: I34808e2101e90e97b921e919acad92da964cbade
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavisualization/input')
-rw-r--r-- | src/datavisualization/input/input.pri | 3 | ||||
-rw-r--r-- | src/datavisualization/input/q3dinputhandler.cpp | 1 | ||||
-rw-r--r-- | src/datavisualization/input/qtouch3dinputhandler.cpp | 58 | ||||
-rw-r--r-- | src/datavisualization/input/qtouch3dinputhandler.h | 4 | ||||
-rw-r--r-- | src/datavisualization/input/qtouch3dinputhandler_p.h | 47 |
5 files changed, 108 insertions, 5 deletions
diff --git a/src/datavisualization/input/input.pri b/src/datavisualization/input/input.pri index b308a7e0..5a4c4a76 100644 --- a/src/datavisualization/input/input.pri +++ b/src/datavisualization/input/input.pri @@ -3,7 +3,8 @@ HEADERS += \ $$PWD/q3dinputhandler.h \ $$PWD/qtouch3dinputhandler.h \ $$PWD/qabstract3dinputhandler_p.h \ - $$PWD/q3dinputhandler_p.h + $$PWD/q3dinputhandler_p.h \ + $$PWD/qtouch3dinputhandler_p.h SOURCES += \ $$PWD/qabstract3dinputhandler.cpp \ diff --git a/src/datavisualization/input/q3dinputhandler.cpp b/src/datavisualization/input/q3dinputhandler.cpp index 2b16c942..8c7d83d0 100644 --- a/src/datavisualization/input/q3dinputhandler.cpp +++ b/src/datavisualization/input/q3dinputhandler.cpp @@ -61,6 +61,7 @@ void Q3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos setInputState(QDataVis::InputOnScene); // update mouse positions to prevent jumping when releasing or repressing a button setInputPosition(mousePos); + // TODO: Get rid of these (QTRD-2307) emit selectionAtPoint(mousePos); //qDebug() << "Mouse pressed on scene"; diff --git a/src/datavisualization/input/qtouch3dinputhandler.cpp b/src/datavisualization/input/qtouch3dinputhandler.cpp index 75ef0d0c..f77ac9c0 100644 --- a/src/datavisualization/input/qtouch3dinputhandler.cpp +++ b/src/datavisualization/input/qtouch3dinputhandler.cpp @@ -15,13 +15,19 @@ ** contact form at http://qt.digia.com ** ****************************************************************************/ -#include "qtouch3dinputhandler.h" + +#include "qtouch3dinputhandler_p.h" #include "q3dcamera.h" +#include <QTimer> QT_DATAVISUALIZATION_BEGIN_NAMESPACE -QTouch3DInputHandler::QTouch3DInputHandler(QObject *parent) : - Q3DInputHandler(parent) +const qreal maxTapAndHoldJitter = 10; +const int tapAndHoldTime = 250; + +QTouch3DInputHandler::QTouch3DInputHandler(QObject *parent) + : Q3DInputHandler(parent), + d_ptr(new QTouch3DInputHandlerPrivate(this)) { } @@ -35,7 +41,9 @@ void QTouch3DInputHandler::mouseDoubleClickEvent(QMouseEvent *event) if (!scene()->isSlicingActivated()) { setInputState(QDataVis::InputOnScene); // update mouse positions to prevent jumping when releasing or repressing a button - setInputPosition( event->pos() ); + setInputPosition(event->pos()); + // TODO: Get rid of these (QTRD-2307) + emit selectionAtPoint(inputPosition()); } } @@ -45,6 +53,8 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event) points = event->touchPoints(); if (!scene()->isSlicingActivated() && points.count() == 2) { + d_ptr->m_holdTimer->stop(); + setInputState(QDataVis::InputOnPinch); QPointF distance = points.at(0).pos() - points.at(1).pos(); @@ -63,6 +73,19 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event) zoomLevel = 10; scene()->camera()->setZoomLevel(zoomLevel); setPrevDistance(newDistance); + } else if (!scene()->isSlicingActivated() && points.count() == 1) { + if (event->type() == QEvent::TouchBegin) { + // Tap-and-hold selection start + d_ptr->m_startHoldPos = points.at(0).pos(); + d_ptr->m_touchHoldPos = d_ptr->m_startHoldPos; + d_ptr->m_holdTimer->start(); + } else if (event->type() == QEvent::TouchEnd) { + d_ptr->m_holdTimer->stop(); + } else if (event->type() == QEvent::TouchUpdate) { + d_ptr->m_touchHoldPos = points.at(0).pos(); + } + } else { + d_ptr->m_holdTimer->stop(); } } @@ -97,4 +120,31 @@ void QTouch3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mou } } +QTouch3DInputHandlerPrivate::QTouch3DInputHandlerPrivate(QTouch3DInputHandler *q) + : q_ptr(q), + m_holdTimer(0) +{ + m_holdTimer = new QTimer(); + m_holdTimer->setSingleShot(true); + m_holdTimer->setInterval(tapAndHoldTime); + QObject::connect(m_holdTimer, &QTimer::timeout, this, &QTouch3DInputHandlerPrivate::tapAndHold); +} + +QTouch3DInputHandlerPrivate::~QTouch3DInputHandlerPrivate() +{ + m_holdTimer->stop(); + delete m_holdTimer; +} + +void QTouch3DInputHandlerPrivate::tapAndHold() +{ + QPointF distance = m_startHoldPos - m_touchHoldPos; + if (distance.manhattanLength() < maxTapAndHoldJitter) { + q_ptr->setInputPosition(QPoint(int(m_touchHoldPos.x()), int(m_touchHoldPos.y()))); + q_ptr->setInputState(QDataVis::InputOnScene); + // TODO: Get rid of these (QTRD-2307) + emit q_ptr->selectionAtPoint(q_ptr->inputPosition()); + } +} + QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/input/qtouch3dinputhandler.h b/src/datavisualization/input/qtouch3dinputhandler.h index 4d5edefc..2c4b67dd 100644 --- a/src/datavisualization/input/qtouch3dinputhandler.h +++ b/src/datavisualization/input/qtouch3dinputhandler.h @@ -23,6 +23,8 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE +class QTouch3DInputHandlerPrivate; + class QT_DATAVISUALIZATION_EXPORT QTouch3DInputHandler : public Q3DInputHandler { Q_OBJECT @@ -38,6 +40,8 @@ public: private: Q_DISABLE_COPY(QTouch3DInputHandler) + + QScopedPointer<QTouch3DInputHandlerPrivate> d_ptr; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/input/qtouch3dinputhandler_p.h b/src/datavisualization/input/qtouch3dinputhandler_p.h new file mode 100644 index 00000000..f6b7f782 --- /dev/null +++ b/src/datavisualization/input/qtouch3dinputhandler_p.h @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef QTOUCH3DINPUTHANDLER_P_H +#define QTOUCH3DINPUTHANDLER_P_H + +#include "qtouch3dinputhandler.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class QAbstract3DInputHandler; + +class QTouch3DInputHandlerPrivate : public QObject +{ + Q_OBJECT + +public: + QTouch3DInputHandlerPrivate(QTouch3DInputHandler *q); + ~QTouch3DInputHandlerPrivate(); + + void tapAndHold(); + +public: + QTouch3DInputHandler *q_ptr; + QTimer *m_holdTimer; + QPointF m_startHoldPos; + QPointF m_touchHoldPos; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif // QTOUCH3DINPUTHANDLER_H |