From a34fa48f1d9a82e5a3172417ee53bf0e0c4261b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 18 Sep 2013 12:34:04 +0300 Subject: 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 --- src/datavisualization/input/input.pri | 3 +- src/datavisualization/input/q3dinputhandler.cpp | 1 + .../input/qtouch3dinputhandler.cpp | 58 ++++++++++++++++++++-- src/datavisualization/input/qtouch3dinputhandler.h | 4 ++ .../input/qtouch3dinputhandler_p.h | 47 ++++++++++++++++++ 5 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 src/datavisualization/input/qtouch3dinputhandler_p.h 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 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 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 -- cgit v1.2.3