/**************************************************************************** ** ** 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 ** ****************************************************************************/ #include "datavisualizationglobal_p.h" #include "q3dinputhandler.h" #include "q3dcamera_p.h" #include "q3dlight.h" namespace QtDataVisualization { const int minZoomLevel = 10; const int halfSizeZoomLevel = 50; const int oneToOneZoomLevel = 100; const int maxZoomLevel = 500; const int nearZoomRangeDivider = 12; const int midZoomRangeDivider = 60; const int farZoomRangeDivider = 120; const float rotationSpeed = 100.0f; /*! * \class QtDataVisualization::Q3DInputHandler * \inmodule QtDataVisualization * \brief Basic wheel mouse based input handler. * \since Qt Data Visualization 1.0 * * Q3DInputHandler is the basic input handler for wheel mouse type of input devices. * * Default input handler has the following functionalty: * \table * \header * \li Mouse action \li Action * \row * \li Drag with right button pressed \li Rotate graph within limits set for Q3DCamera. * \row * \li Left click \li Select item under cursor or remove selection if none. * May open the secondary view depending on the * selection mode. * \row * \li Mouse wheel \li Zoom in/out within default range (10...500%). * \row * \li Left click on the primary view when the secondary view is visible * \li Closes the secondary view. * \note Secondary view is available only for Q3DBars and Q3DSurface graphs. * \endtable */ /*! * Constructs the basic mouse input handler. An optional \a parent parameter can be given * and is then passed to QObject constructor. */ Q3DInputHandler::Q3DInputHandler(QObject *parent) : QAbstract3DInputHandler(parent) { } /*! * Destroys the input handler. */ Q3DInputHandler::~Q3DInputHandler() { } // Input event listeners /*! * Override this to change handling of mouse press events. * Mouse press event is given in the \a event and the mouse position in \a mousePos. */ void Q3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos) { #if defined(Q_OS_ANDROID) Q_UNUSED(event); Q_UNUSED(mousePos); #else if (Qt::LeftButton == event->button()) { if (scene()->isSlicingActive()) { if (scene()->isPointInPrimarySubView(mousePos)) { setInputState(InputStateOnPrimaryView); } else if (scene()->isPointInSecondarySubView(mousePos)) { setInputState(InputStateOnSecondaryView); } else { setInputState(InputStateNone); } } else { setInputState(InputStateOnScene); // update mouse positions to prevent jumping when releasing or repressing a button setInputPosition(mousePos); scene()->setSelectionQueryPosition(mousePos); } } else if (Qt::MiddleButton == event->button()) { // reset rotations setInputPosition(QPoint(0, 0)); } else if (Qt::RightButton == event->button()) { // disable rotating when in slice view if (!scene()->isSlicingActive()) setInputState(InputStateRotating); // update mouse positions to prevent jumping when releasing or repressing a button setInputPosition(mousePos); } #endif } /*! * Override this to change handling of mouse release events. * Mouse release event is given in the \a event and the mouse position in \a mousePos. */ void Q3DInputHandler::mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos) { Q_UNUSED(event); #if defined (Q_OS_ANDROID) Q_UNUSED(mousePos); #else if (InputStateRotating == inputState()) { // update mouse positions to prevent jumping when releasing or repressing a button setInputPosition(mousePos); } setInputState(InputStateNone); #endif } /*! * Override this to change handling of mouse move events. * Mouse move event is given in the \a event and the mouse position in \a mousePos. */ void Q3DInputHandler::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos) { Q_UNUSED(event); #if defined (Q_OS_ANDROID) Q_UNUSED(mousePos); #else if (InputStateRotating == inputState()) { // Calculate mouse movement since last frame float xRotation = scene()->activeCamera()->xRotation(); float yRotation = scene()->activeCamera()->yRotation(); float mouseMoveX = float(inputPosition().x() - mousePos.x()) / (scene()->viewport().width() / rotationSpeed); float mouseMoveY = float(inputPosition().y() - mousePos.y()) / (scene()->viewport().height() / rotationSpeed); // Apply to rotations xRotation -= mouseMoveX; yRotation -= mouseMoveY; scene()->activeCamera()->setXRotation(xRotation); scene()->activeCamera()->setYRotation(yRotation); setPreviousInputPos(inputPosition()); setInputPosition(mousePos); } #endif } /*! * Override this to change handling of wheel events. * The wheel event is given in the \a event. */ void Q3DInputHandler::wheelEvent(QWheelEvent *event) { // disable zooming if in slice view if (scene()->isSlicingActive()) return; // Adjust zoom level based on what zoom range we're in. int zoomLevel = scene()->activeCamera()->zoomLevel(); if (zoomLevel > oneToOneZoomLevel) zoomLevel += event->angleDelta().y() / nearZoomRangeDivider; else if (zoomLevel > halfSizeZoomLevel) zoomLevel += event->angleDelta().y() / midZoomRangeDivider; else zoomLevel += event->angleDelta().y() / farZoomRangeDivider; if (zoomLevel > maxZoomLevel) zoomLevel = maxZoomLevel; else if (zoomLevel < minZoomLevel) zoomLevel = minZoomLevel; scene()->activeCamera()->setZoomLevel(zoomLevel); } /*! * \class QtDataVisualization::Q3DInputHandlerPrivate * \internal */ }