summaryrefslogtreecommitdiffstats
path: root/src/datavis3d/input
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavis3d/input')
-rw-r--r--src/datavis3d/input/input.pri3
-rw-r--r--src/datavis3d/input/q3dinputhandler.cpp52
-rw-r--r--src/datavis3d/input/q3dinputhandler.h15
-rw-r--r--src/datavis3d/input/q3dinputhandler_p.h51
-rw-r--r--src/datavis3d/input/qabstract3dinputhandler.cpp64
-rw-r--r--src/datavis3d/input/qabstract3dinputhandler.h54
-rw-r--r--src/datavis3d/input/qabstract3dinputhandler_p.h17
-rw-r--r--src/datavis3d/input/qtouch3dinputhandler.cpp31
-rw-r--r--src/datavis3d/input/qtouch3dinputhandler.h8
9 files changed, 183 insertions, 112 deletions
diff --git a/src/datavis3d/input/input.pri b/src/datavis3d/input/input.pri
index 89b032da..8305604b 100644
--- a/src/datavis3d/input/input.pri
+++ b/src/datavis3d/input/input.pri
@@ -2,7 +2,8 @@ HEADERS += \
$$PWD/qabstract3dinputhandler.h \
$$PWD/q3dinputhandler.h \
input/qtouch3dinputhandler.h \
- input/qabstract3dinputhandler_p.h
+ input/qabstract3dinputhandler_p.h \
+ input/q3dinputhandler_p.h
SOURCES += \
$$PWD/qabstract3dinputhandler.cpp \
diff --git a/src/datavis3d/input/q3dinputhandler.cpp b/src/datavis3d/input/q3dinputhandler.cpp
index 4623a69b..a8bfc19a 100644
--- a/src/datavis3d/input/q3dinputhandler.cpp
+++ b/src/datavis3d/input/q3dinputhandler.cpp
@@ -16,38 +16,46 @@
**
****************************************************************************/
#include "q3dinputhandler.h"
+#include "q3dcamera.h"
+#include "q3dlight.h"
QT_DATAVIS3D_BEGIN_NAMESPACE
-Q3DInputHandler::Q3DInputHandler() :
- QAbstract3DInputHandler()
+Q3DInputHandler::Q3DInputHandler(QObject *parent) :
+ QAbstract3DInputHandler(parent)
+{
+}
+
+Q3DInputHandler::~Q3DInputHandler()
{
}
// Input event listeners
void Q3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos)
{
- QRect mainViewPort = mainViewPortRect();
if (Qt::LeftButton == event->button()) {
- if (slicingActivated()) {
- if (mousePos.x() <= mainViewPort.width()
- && mousePos.y() <= mainViewPort.height()) {
+ if (scene()->isSlicingActivated()) {
+ if (scene()->isInputInsideMainView(mousePos)) {
setInputState(QDataVis::InputOnOverview);
//qDebug() << "Mouse pressed on overview";
- } else {
+ } else if (scene()->isInputInsideSliceView(mousePos)) {
setInputState(QDataVis::InputOnSlice);
//qDebug() << "Mouse pressed on zoom";
+ } else {
+ setInputState(QDataVis::InputNone);
}
} else {
setInputState(QDataVis::InputOnScene);
// update mouse positions to prevent jumping when releasing or repressing a button
setInputPosition(mousePos);
+ emit selectionAtPoint(mousePos);
//qDebug() << "Mouse pressed on scene";
+
}
} else if (Qt::MiddleButton == event->button()) {
// reset rotations
setInputPosition(QPoint(0, 0));
- } else if (!slicingActivated() && Qt::RightButton == event->button()) {
+ } else if (Qt::RightButton == event->button()) {
// disable rotating when in slice view
setInputState(QDataVis::InputRotating);
// update mouse positions to prevent jumping when releasing or repressing a button
@@ -63,28 +71,42 @@ void Q3DInputHandler::mouseReleaseEvent(QMouseEvent *event, const QPoint &mouseP
if (QDataVis::InputRotating == inputState()) {
// update mouse positions to prevent jumping when releasing or repressing a button
setInputPosition(mousePos);
- // TODO: Call actual camera class when it's been written.
- //m_cameraHelper->updateMousePos(mousePos);
}
setInputState(QDataVis::InputNone);
-
}
void Q3DInputHandler::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos)
{
Q_UNUSED(event);
- if (QDataVis::InputRotating == inputState())
+ if (QDataVis::InputRotating == inputState()) {
+
+ // Calculate mouse movement since last frame
+ QPointF rotations = scene()->camera()->rotations();
+ GLfloat xRotation = rotations.x();
+ GLfloat yRotation = rotations.y();
+ GLfloat mouseMoveX = GLfloat(inputPosition().x() - mousePos.x())
+ / (scene()->viewport().width() / rotationSpeed);
+ GLfloat mouseMoveY = GLfloat(inputPosition().y() - mousePos.y())
+ / (scene()->viewport().height() / rotationSpeed);
+ // Apply to rotations
+ xRotation -= mouseMoveX;
+ yRotation -= mouseMoveY;
+ scene()->camera()->setRotations(QPointF(xRotation, yRotation));
+ scene()->camera()->updateViewMatrix(1.0f);
+
+ setPreviousInputPos(inputPosition());
setInputPosition(mousePos);
+ }
}
void Q3DInputHandler::wheelEvent(QWheelEvent *event)
{
// disable zooming if in slice view
- if (slicingActivated())
+ if (scene()->isSlicingActivated())
return;
// Adjust zoom level based on what zoom range we're in.
- int zoomLevel = QAbstract3DInputHandler::zoomLevel();
+ int zoomLevel = scene()->camera()->zoomLevel();
if (zoomLevel > oneToOneZoomLevel)
zoomLevel += event->angleDelta().y() / nearZoomRangeDivider;
else if (zoomLevel > halfSizeZoomLevel)
@@ -96,7 +118,7 @@ void Q3DInputHandler::wheelEvent(QWheelEvent *event)
else if (zoomLevel < minZoomLevel)
zoomLevel = minZoomLevel;
- setZoomLevel(zoomLevel);
+ scene()->camera()->setZoomLevel(zoomLevel);
}
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/input/q3dinputhandler.h b/src/datavis3d/input/q3dinputhandler.h
index d995fe3f..98d7a047 100644
--- a/src/datavis3d/input/q3dinputhandler.h
+++ b/src/datavis3d/input/q3dinputhandler.h
@@ -28,20 +28,31 @@ const int nearZoomRangeDivider = 12;
const int midZoomRangeDivider = 60;
const int farZoomRangeDivider = 120;
+const float rotationSpeed = 100.0f;
+
#include "qabstract3dinputhandler.h"
QT_DATAVIS3D_BEGIN_NAMESPACE
-class Q3DInputHandler : public QAbstract3DInputHandler
+class QT_DATAVIS3D_EXPORT Q3DInputHandler : public QAbstract3DInputHandler
{
+ Q_OBJECT
+
public:
- explicit Q3DInputHandler();
+ explicit Q3DInputHandler(QObject *parent = 0);
+ virtual ~Q3DInputHandler();
// Input event listeners
virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos);
virtual void mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos);
virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
virtual void wheelEvent(QWheelEvent *event);
+
+signals:
+ void rotationSpeedChanged(int rotationSpeed);
+
+private:
+ Q_DISABLE_COPY(Q3DInputHandler)
};
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/input/q3dinputhandler_p.h b/src/datavis3d/input/q3dinputhandler_p.h
new file mode 100644
index 00000000..b055bd85
--- /dev/null
+++ b/src/datavis3d/input/q3dinputhandler_p.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtDataVis3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#ifndef Q3DINPUTHANDLER_P_H
+#define Q3DINPUTHANDLER_P_H
+
+#include "datavis3dglobal_p.h"
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+class Q3DInputHandler;
+
+class Q3DInputHandlerPrivate
+{
+public:
+ Q3DInputHandlerPrivate(Q3DInputHandler *q);
+ ~Q3DInputHandlerPrivate();
+
+public:
+ Q3DInputHandler *q_ptr;
+
+};
+
+QT_DATAVIS3D_END_NAMESPACE
+
+#endif // Q3DINPUTHANDLER_P_H
diff --git a/src/datavis3d/input/qabstract3dinputhandler.cpp b/src/datavis3d/input/qabstract3dinputhandler.cpp
index 5155e2e2..7fb4f084 100644
--- a/src/datavis3d/input/qabstract3dinputhandler.cpp
+++ b/src/datavis3d/input/qabstract3dinputhandler.cpp
@@ -19,12 +19,16 @@
QT_DATAVIS3D_BEGIN_NAMESPACE
-QAbstract3DInputHandler::QAbstract3DInputHandler() :
- QObject(),
+QAbstract3DInputHandler::QAbstract3DInputHandler(QObject *parent) :
+ QObject(parent),
d_ptr(new QAbstract3DInputHandlerPrivate(this))
{
}
+QAbstract3DInputHandler::~QAbstract3DInputHandler()
+{
+}
+
// Input event listeners
void QAbstract3DInputHandler::mouseDoubleClickEvent(QMouseEvent *event)
{
@@ -65,7 +69,7 @@ QDataVis::InputState QAbstract3DInputHandler::inputState()
return d_ptr->m_inputState;
}
-void QAbstract3DInputHandler::setInputState(const QDataVis::InputState inputState)
+void QAbstract3DInputHandler::setInputState(QDataVis::InputState inputState)
{
if (inputState != d_ptr->m_inputState) {
d_ptr->m_inputState = inputState;
@@ -73,12 +77,12 @@ void QAbstract3DInputHandler::setInputState(const QDataVis::InputState inputStat
}
}
-QPoint QAbstract3DInputHandler::inputPosition()
+QPoint QAbstract3DInputHandler::inputPosition() const
{
return d_ptr->m_inputPosition;
}
-void QAbstract3DInputHandler::setInputPosition(const QPoint position)
+void QAbstract3DInputHandler::setInputPosition(const QPoint &position)
{
if (position != d_ptr->m_inputPosition) {
d_ptr->m_inputPosition = position;
@@ -86,72 +90,46 @@ void QAbstract3DInputHandler::setInputPosition(const QPoint position)
}
}
-bool QAbstract3DInputHandler::slicingActivated()
-{
- return d_ptr->m_isSlicingActivated;
-}
-
-void QAbstract3DInputHandler::setSlicingActivated(const bool isSlicing)
-{
- if (isSlicing != d_ptr->m_isSlicingActivated) {
- d_ptr->m_isSlicingActivated = isSlicing;
- emit slicingActiveChanged(isSlicing);
- }
-}
-
-int QAbstract3DInputHandler::zoomLevel()
-{
- return d_ptr->m_zoomLevel;
-}
-
-void QAbstract3DInputHandler::setZoomLevel(const int zoomLevel)
-{
- if (zoomLevel != d_ptr->m_zoomLevel) {
- d_ptr->m_zoomLevel = zoomLevel;
- emit zoomLevelChanged(zoomLevel);
- }
-}
-
void QAbstract3DInputHandler::setPrevDistance(int distance)
{
d_ptr->m_prevDistance = distance;
}
-int QAbstract3DInputHandler::prevDistance()
+int QAbstract3DInputHandler::prevDistance() const
{
return d_ptr->m_prevDistance;
}
-QRect QAbstract3DInputHandler::mainViewPortRect()
+Q3DScene *QAbstract3DInputHandler::scene() const
{
- return d_ptr->m_mainViewPort;
+ return d_ptr->m_scene;
}
-void QAbstract3DInputHandler::setMainViewPortRect(const QRect viewPort)
+void QAbstract3DInputHandler::setScene(Q3DScene *scene)
{
- d_ptr->m_mainViewPort = viewPort;
+ d_ptr->m_scene = scene;
}
-CameraHelper *QAbstract3DInputHandler::camera()
+void QAbstract3DInputHandler::setPreviousInputPos(const QPoint &position)
{
- return d_ptr->m_camera;
+ d_ptr->m_previousInputPos = position;
}
-void QAbstract3DInputHandler::setCamera(CameraHelper *camera)
+QPoint QAbstract3DInputHandler::previousInputPos() const
{
- d_ptr->m_camera = camera;
+ return d_ptr->m_previousInputPos;
}
+
QAbstract3DInputHandlerPrivate::QAbstract3DInputHandlerPrivate(QAbstract3DInputHandler *q) :
q_ptr(q),
m_prevDistance(0),
m_inputState(QDataVis::InputNone),
- m_isSlicingActivated(false),
m_inputPosition(QPoint(0,0)),
- m_zoomLevel(0),
- m_camera(0)
+ m_previousInputPos(QPoint(0,0)),
+ m_scene(0)
{
}
diff --git a/src/datavis3d/input/qabstract3dinputhandler.h b/src/datavis3d/input/qabstract3dinputhandler.h
index 5d98afa1..03c46a5e 100644
--- a/src/datavis3d/input/qabstract3dinputhandler.h
+++ b/src/datavis3d/input/qabstract3dinputhandler.h
@@ -19,29 +19,24 @@
#ifndef QABSTRACT3DINPUTHANDLER_H
#define QABSTRACT3DINPUTHANDLER_H
-#include <QObject>
-
#include "qdatavis3denums.h"
#include "qabstract3dinputhandler_p.h"
+#include "q3dscene.h"
+#include <QObject>
+#include <QMouseEvent>
QT_DATAVIS3D_BEGIN_NAMESPACE
-class QAbstract3DInputHandler : public QObject
+class QT_DATAVIS3D_EXPORT QAbstract3DInputHandler : public QObject
{
Q_OBJECT
Q_PROPERTY(QtDataVis3D::QDataVis::InputState inputState READ inputState WRITE setInputState NOTIFY inputStateChanged)
Q_PROPERTY(QPoint inputPosition READ inputPosition WRITE setInputPosition NOTIFY positionChanged)
- Q_PROPERTY(bool slicingActivated READ slicingActivated WRITE setSlicingActivated NOTIFY slicingActiveChanged)
- Q_PROPERTY(int zoomLevel READ zoomLevel WRITE setZoomLevel NOTIFY zoomLevelChanged)
- Q_PROPERTY(QRect mainViewPortRect READ mainViewPortRect WRITE setMainViewPortRect)
-
- Q_PROPERTY(CameraHelper *camera READ camera WRITE setCamera)
-
-private:
- QScopedPointer<QAbstract3DInputHandlerPrivate> d_ptr;
+ Q_PROPERTY(Q3DScene *scene READ scene WRITE setScene)
public:
- explicit QAbstract3DInputHandler();
+ explicit QAbstract3DInputHandler(QObject *parent = 0);
+ virtual ~QAbstract3DInputHandler();
// Input event listeners
virtual void mouseDoubleClickEvent(QMouseEvent *event);
@@ -56,29 +51,30 @@ public:
// TODO: Check if the inputState needs to be visible outside of subclasses in the final architecture
QDataVis::InputState inputState();
- void setInputState(const QDataVis::InputState inputState);
- void setInputPosition(const QPoint position);
- QPoint inputPosition();
- void setSlicingActivated(const bool isSlicing);
- bool slicingActivated();
- void setZoomLevel(const int zoomLevel);
- int zoomLevel();
- QRect mainViewPortRect();
- void setMainViewPortRect(const QRect viewPort);
-
- // TODO: Modify for proper camera once that is available
- CameraHelper *camera();
- void setCamera(CameraHelper *camera);
+ void setInputState(QDataVis::InputState inputState);
+ void setInputPosition(const QPoint &position);
+ QPoint inputPosition() const;
+
+ Q3DScene *scene() const;
+ void setScene(Q3DScene *scene);
protected:
void setPrevDistance(int distance);
- int prevDistance();
+ int prevDistance() const;
+ void setPreviousInputPos(const QPoint &position);
+ QPoint previousInputPos() const;
signals:
- void positionChanged(QPoint position);
+ void positionChanged(const QPoint &position);
void inputStateChanged(QDataVis::InputState state);
- void slicingActiveChanged(bool isSlicing);
- void zoomLevelChanged(int zoomLevel);
+ void selectionAtPoint(const QPoint &point);
+
+private:
+ Q_DISABLE_COPY(QAbstract3DInputHandler)
+
+ QScopedPointer<QAbstract3DInputHandlerPrivate> d_ptr;
+
+ friend class Abstract3DController;
};
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/input/qabstract3dinputhandler_p.h b/src/datavis3d/input/qabstract3dinputhandler_p.h
index 7c56c2fa..a4b61ff3 100644
--- a/src/datavis3d/input/qabstract3dinputhandler_p.h
+++ b/src/datavis3d/input/qabstract3dinputhandler_p.h
@@ -29,12 +29,13 @@
#ifndef QABSTRACT3DINPUTHANDLER_P_H
#define QABSTRACT3DINPUTHANDLER_P_H
-#include <QMouseEvent>
+#include "datavis3dglobal_p.h"
+#include <QRect>
QT_DATAVIS3D_BEGIN_NAMESPACE
class QAbstract3DInputHandler;
-class CameraHelper;
+class Q3DScene;
class QAbstract3DInputHandlerPrivate
{
@@ -45,18 +46,22 @@ public:
public:
QAbstract3DInputHandler *q_ptr;
int m_prevDistance;
+ QPoint m_previousInputPos;
+
+ GLfloat m_defaultXRotation;
+ GLfloat m_defaultYRotation;
private:
QDataVis::InputState m_inputState;
- bool m_isSlicingActivated;
QPoint m_inputPosition;
- int m_zoomLevel;
QRect m_mainViewPort;
- // TODO: Replace with proper camera once it's available
- CameraHelper *m_camera;
+ // TODO: Check if this could be avoided with signals/slots or some other way.
+ Q3DScene *m_scene;
+ bool m_isDefaultHandler;
friend class QAbstract3DInputHandler;
+ friend class Abstract3DController;
};
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/input/qtouch3dinputhandler.cpp b/src/datavis3d/input/qtouch3dinputhandler.cpp
index 128b8c49..d0676719 100644
--- a/src/datavis3d/input/qtouch3dinputhandler.cpp
+++ b/src/datavis3d/input/qtouch3dinputhandler.cpp
@@ -16,18 +16,23 @@
**
****************************************************************************/
#include "qtouch3dinputhandler.h"
+#include "q3dcamera.h"
QT_DATAVIS3D_BEGIN_NAMESPACE
-QTouch3DInputHandler::QTouch3DInputHandler() :
- Q3DInputHandler()
+QTouch3DInputHandler::QTouch3DInputHandler(QObject *parent) :
+ Q3DInputHandler(parent)
+{
+}
+
+QTouch3DInputHandler::~QTouch3DInputHandler()
{
}
// Input event listeners
void QTouch3DInputHandler::mouseDoubleClickEvent(QMouseEvent *event)
{
- if (!slicingActivated()) {
+ if (!scene()->isSlicingActivated()) {
setInputState( QDataVis::InputOnScene );
// update mouse positions to prevent jumping when releasing or repressing a button
setInputPosition( event->pos() );
@@ -39,13 +44,13 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event)
QList<QTouchEvent::TouchPoint> points;
points = event->touchPoints();
- if (!slicingActivated() && points.count() == 2) {
+ if (!scene()->isSlicingActivated() && points.count() == 2) {
setInputState( QDataVis::InputOnPinch );
QPointF distance = points.at(0).pos() - points.at(1).pos();
int newDistance = distance.manhattanLength();
int zoomRate = 1;
- int zoomLevel = QAbstract3DInputHandler::zoomLevel();
+ int zoomLevel = scene()->camera()->zoomLevel();
if (zoomLevel > 100)
zoomRate = 5;
if (newDistance > prevDistance())
@@ -56,7 +61,7 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event)
zoomLevel = 500;
else if (zoomLevel < 10)
zoomLevel = 10;
- setZoomLevel(zoomLevel);
+ scene()->camera()->setZoomLevel(zoomLevel);
setPrevDistance(newDistance);
}
}
@@ -64,16 +69,16 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event)
void QTouch3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos)
{
// TODO: This code needs revisiting with new Qt releases and possibly move to using touch events for these as well.
- QRect mainViewPort = mainViewPortRect();
if (Qt::LeftButton == event->button()) {
- if (slicingActivated()) {
- if (mousePos.x() <= mainViewPort.width()
- && mousePos.y() <= mainViewPort.height()) {
+ if (scene()->isSlicingActivated()) {
+ if (scene()->isInputInsideMainView(mousePos)) {
setInputState(QDataVis::InputOnOverview);
//qDebug() << "Mouse pressed on overview";
- } else {
+ } else if (scene()->isInputInsideSliceView(mousePos)) {
setInputState(QDataVis::InputOnSlice);
//qDebug() << "Mouse pressed on zoom";
+ } else {
+ setInputState(QDataVis::InputNone);
}
} else {
setInputState(QDataVis::InputRotating);
@@ -84,14 +89,12 @@ void QTouch3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mou
} else if (Qt::MiddleButton == event->button()) {
// reset rotations
setInputPosition(QPoint(0, 0));
- } else if (!slicingActivated() && Qt::RightButton == event->button()) {
+ } else if (Qt::RightButton == event->button()) {
// disable rotating when in slice view
setInputState(QDataVis::InputOnScene);
// update mouse positions to prevent jumping when releasing or repressing a button
setInputPosition(mousePos);
}
- // TODO: Call actual camera class when it's been written.
- //m_cameraHelper->updateMousePos(m_mousePos);
}
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/input/qtouch3dinputhandler.h b/src/datavis3d/input/qtouch3dinputhandler.h
index a56f82ce..4b2dad69 100644
--- a/src/datavis3d/input/qtouch3dinputhandler.h
+++ b/src/datavis3d/input/qtouch3dinputhandler.h
@@ -23,17 +23,21 @@
QT_DATAVIS3D_BEGIN_NAMESPACE
-class QTouch3DInputHandler : public Q3DInputHandler
+class QT_DATAVIS3D_EXPORT QTouch3DInputHandler : public Q3DInputHandler
{
Q_OBJECT
public:
- explicit QTouch3DInputHandler();
+ explicit QTouch3DInputHandler(QObject *parent = 0);
+ virtual ~QTouch3DInputHandler();
// Input event listeners
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void touchEvent(QTouchEvent *event);
virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos);
+
+private:
+ Q_DISABLE_COPY(QTouch3DInputHandler)
};
QT_DATAVIS3D_END_NAMESPACE