summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/datavisualization/qmlspectrogram/doc/src/qmlspectrogram.qdoc20
-rw-r--r--examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/main.qml30
-rw-r--r--src/datavisualization/data/qsurface3dseries.cpp13
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp13
-rw-r--r--src/datavisualization/input/q3dinputhandler.cpp184
-rw-r--r--src/datavisualization/input/q3dinputhandler.h15
-rw-r--r--src/datavisualization/input/q3dinputhandler_p.h8
-rw-r--r--src/datavisualization/input/qtouch3dinputhandler.cpp122
-rw-r--r--src/datavisualizationqml2/datavisualizationqml2_plugin.cpp5
-rw-r--r--src/datavisualizationqml2/datavisualizationqml2_plugin.h5
-rw-r--r--tests/barstest/chart.cpp17
-rw-r--r--tests/barstest/chart.h7
-rw-r--r--tests/barstest/main.cpp77
13 files changed, 382 insertions, 134 deletions
diff --git a/examples/datavisualization/qmlspectrogram/doc/src/qmlspectrogram.qdoc b/examples/datavisualization/qmlspectrogram/doc/src/qmlspectrogram.qdoc
index ee0018e3..0aebdde0 100644
--- a/examples/datavisualization/qmlspectrogram/doc/src/qmlspectrogram.qdoc
+++ b/examples/datavisualization/qmlspectrogram/doc/src/qmlspectrogram.qdoc
@@ -29,11 +29,8 @@
Spectrogram is simply a surface graph with a range gradient used to emphasize the different
values. Typically spectrograms are shown with two dimensional surfaces, which we simulate
- with a top down orthographic view of the graph. In this example, the default input handler
- is enabled, so you can also rotate the graph to see how it looks in three dimensions. In
- a real application you may want to disable the default input handling if you wish to show
- only the two dimensional graph. See \l{Qt Quick 2 Custom Input Example} for guidelines on
- customizing input handling.
+ with a top down orthographic view of the graph. To enforce the 2D effect, we disable the
+ graph rotation via mouse or touch when in the orthographic mode.
The focus in this example is on showing how to display spectrograms, so the basic
functionality is not explained. For more detailed QML example documentation,
@@ -75,5 +72,18 @@
\snippet qmlspectrogram/qml/qmlspectrogram/main.qml 4
+ To enforce the 2D effect, graph rotation via user input is disabled when in orthographic mode.
+ We do this by specifying a new input handler:
+
+ \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 5
+ \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 7
+ \dots 0
+ \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 6
+ \dots 0
+
+ When the projection mode changes, we adjust the value of the
+ \l{InputHandler3D::rotationEnabled}{rotationEnabled} property of the \c{customInputHandler}
+ to control the rotation.
+
\section1 Example contents
*/
diff --git a/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/main.qml b/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/main.qml
index b61bf817..8bb458ca 100644
--- a/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/main.qml
+++ b/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/main.qml
@@ -53,7 +53,7 @@ Window {
ValueAxis3D {
id: xAxis
segmentCount: 8
- labelFormat: "%i"
+ labelFormat: "%i\u00B0"
title: "Angle"
titleVisible: true
titleFixed: false
@@ -72,7 +72,7 @@ Window {
ValueAxis3D {
id: zAxis
segmentCount: 5
- labelFormat: "%i"
+ labelFormat: "%i nm"
title: "Radius"
titleVisible: true
titleFixed: false
@@ -87,19 +87,32 @@ Window {
backgroundEnabled: false
}
+
+ //! [5]
+ TouchInputHandler3D {
+ id: customInputHandler
+ rotationEnabled: false
+ }
+ //! [5]
+
//! [0]
+ //! [7]
Surface3D {
+ //! [7]
id: surfaceGraph
width: surfaceView.width
height: surfaceView.height
shadowQuality: AbstractGraph3D.ShadowQualityNone
- selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndRow
+ selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndColumn
axisX: xAxis
axisY: yAxis
axisZ: zAxis
theme: customTheme
+ //! [6]
+ inputHandler: customInputHandler
+ //! [6]
// Remove the perspective and view the graph from top down to achieve 2D effect
//! [1]
@@ -124,6 +137,7 @@ Window {
drawMode: Surface3DSeries.DrawSurface
baseGradient: surfaceGradient
colorStyle: Theme3D.ColorStyleRangeGradient
+ itemLabelFormat: "(@xLabel, @zLabel): @yLabel"
ItemModelSurfaceDataProxy {
itemModel: surfaceData.model
@@ -172,6 +186,7 @@ Window {
xAxis.labelAutoRotation = 30
yAxis.labelAutoRotation = 30
zAxis.labelAutoRotation = 30
+ customInputHandler.rotationEnabled = true
text = "Switch to orthographic"
} else {
surfaceGraph.orthoProjection = true;
@@ -180,6 +195,7 @@ Window {
xAxis.labelAutoRotation = 0
yAxis.labelAutoRotation = 0
zAxis.labelAutoRotation = 0
+ customInputHandler.rotationEnabled = false
text = "Switch to perspective"
}
}
@@ -238,7 +254,7 @@ Window {
anchors.margins: 20
anchors.bottom: parent.bottom
anchors.top: buttonLayout.bottom
- anchors.left: parent.left
+ anchors.right: parent.right
border.color: "black"
border.width: 1
width: 50
@@ -254,21 +270,21 @@ Window {
Text {
anchors.verticalCenter: legend.bottom
- anchors.left: legend.right
+ anchors.right: legend.left
anchors.margins: 2
text: surfaceGraph.axisY.min + "%"
}
Text {
anchors.verticalCenter: legend.verticalCenter
- anchors.left: legend.right
+ anchors.right: legend.left
anchors.margins: 2
text: (surfaceGraph.axisY.max + surfaceGraph.axisY.min) / 2 + "%"
}
Text {
anchors.verticalCenter: legend.top
- anchors.left: legend.right
+ anchors.right: legend.left
anchors.margins: 2
text: surfaceGraph.axisY.max + "%"
}
diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp
index bcfc4042..7d4dacfe 100644
--- a/src/datavisualization/data/qsurface3dseries.cpp
+++ b/src/datavisualization/data/qsurface3dseries.cpp
@@ -141,6 +141,14 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
+ * \qmlproperty string Surface3DSeries::textureFile
+ *
+ * Holds the texture file name for the surface texture. To clear the texture, set empty
+ * file name.
+ */
+
+
+/*!
* \enum QSurface3DSeries::DrawFlag
*
* Drawing mode of the surface. Values of this enumeration can be combined with OR operator.
@@ -300,6 +308,8 @@ QSurface3DSeries::DrawFlags QSurface3DSeries::drawMode() const
}
/*!
+ * \property QSurface3DSeries::texture
+ *
* Set the \a texture as a QImage for the surface. To clear the texture, set empty
* QImage as texture.
*/
@@ -318,7 +328,8 @@ QImage QSurface3DSeries::texture() const
return dptrc()->m_texture;
}
-/*! \property QSurface3DSeries::textureFile
+/*!
+ * \property QSurface3DSeries::textureFile
*
* Holds the texture file name for the surface texture. To clear the texture, set empty
* file name.
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp
index 1b497490..52ab853d 100644
--- a/src/datavisualization/engine/abstract3dcontroller.cpp
+++ b/src/datavisualization/engine/abstract3dcontroller.cpp
@@ -75,10 +75,6 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen
inputHandler = new QTouch3DInputHandler();
inputHandler->d_ptr->m_isDefaultHandler = true;
setActiveInputHandler(inputHandler);
- connect(inputHandler, &QAbstract3DInputHandler::inputViewChanged, this,
- &Abstract3DController::handleInputViewChanged);
- connect(inputHandler, &QAbstract3DInputHandler::positionChanged, this,
- &Abstract3DController::handleInputPositionChanged);
connect(m_scene->d_ptr.data(), &Q3DScenePrivate::needRender, this,
&Abstract3DController::emitNeedRender);
}
@@ -783,8 +779,9 @@ void Abstract3DController::setActiveInputHandler(QAbstract3DInputHandler *inputH
m_inputHandlers.removeAll(m_activeInputHandler);
delete m_activeInputHandler;
} else {
- // Disconnect the old input handler from the scene
+ // Disconnect the old input handler
m_activeInputHandler->setScene(0);
+ QObject::disconnect(m_activeInputHandler, 0, this, 0);
}
}
@@ -796,6 +793,12 @@ void Abstract3DController::setActiveInputHandler(QAbstract3DInputHandler *inputH
if (m_activeInputHandler)
m_activeInputHandler->setScene(m_scene);
+ // Connect the input handler
+ QObject::connect(m_activeInputHandler, &QAbstract3DInputHandler::inputViewChanged, this,
+ &Abstract3DController::handleInputViewChanged);
+ QObject::connect(m_activeInputHandler, &QAbstract3DInputHandler::positionChanged, this,
+ &Abstract3DController::handleInputPositionChanged);
+
// Notify change of input handler
emit activeInputHandlerChanged(m_activeInputHandler);
}
diff --git a/src/datavisualization/input/q3dinputhandler.cpp b/src/datavisualization/input/q3dinputhandler.cpp
index f0044096..e6f3de24 100644
--- a/src/datavisualization/input/q3dinputhandler.cpp
+++ b/src/datavisualization/input/q3dinputhandler.cpp
@@ -61,6 +61,43 @@ const float rotationSpeed = 100.0f;
* \li Closes the secondary view.
* \note Secondary view is available only for Q3DBars and Q3DSurface graphs.
* \endtable
+ *
+ * Rotation, zoom, and selection can each be individually disabled using
+ * corresponding properties of this class.
+ */
+
+/*!
+ * \qmltype InputHandler3D
+ * \inqmlmodule QtDataVisualization
+ * \since QtDataVisualization 1.2
+ * \ingroup datavisualization_qml
+ * \instantiates Q3DInputHandler
+ * \brief Basic wheel mouse based input handler.
+ *
+ * InputHandler3D is the basic input handler for wheel mouse type of input devices.
+ *
+ * See Q3DInputHandler documentation for more details.
+ */
+
+/*!
+ * \qmlproperty bool InputHandler3D::rotationEnabled
+ * \since QtDataVisualization 1.2
+ *
+ * This property specifies if this input handler allows graph rotation.
+ */
+
+/*!
+ * \qmlproperty bool InputHandler3D::zoomEnabled
+ * \since QtDataVisualization 1.2
+ *
+ * This property specifies if this input handler allows graph zooming.
+ */
+
+/*!
+ * \qmlproperty bool InputHandler3D::selectionEnabled
+ * \since QtDataVisualization 1.2
+ *
+ * This property specifies if this input handler allows selection from the graph.
*/
/*!
@@ -92,29 +129,35 @@ void Q3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos
Q_UNUSED(mousePos);
#else
if (Qt::LeftButton == event->button()) {
- if (scene()->isSlicingActive()) {
- if (scene()->isPointInPrimarySubView(mousePos))
+ if (isSelectionEnabled()) {
+ if (scene()->isSlicingActive()) {
+ if (scene()->isPointInPrimarySubView(mousePos))
+ setInputView(InputViewOnPrimary);
+ else if (scene()->isPointInSecondarySubView(mousePos))
+ setInputView(InputViewOnSecondary);
+ else
+ setInputView(InputViewNone);
+ } else {
+ // update mouse positions to prevent jumping when releasing or repressing a button
+ setInputPosition(mousePos);
+ scene()->setSelectionQueryPosition(mousePos);
setInputView(InputViewOnPrimary);
- else if (scene()->isPointInSecondarySubView(mousePos))
- setInputView(InputViewOnSecondary);
- else
- setInputView(InputViewNone);
- } else {
- // update mouse positions to prevent jumping when releasing or repressing a button
- setInputPosition(mousePos);
- scene()->setSelectionQueryPosition(mousePos);
- setInputView(InputViewOnPrimary);
- d_ptr->m_inputState = QAbstract3DInputHandlerPrivate::InputStateSelecting;
+ d_ptr->m_inputState = QAbstract3DInputHandlerPrivate::InputStateSelecting;
+ }
}
} else if (Qt::MiddleButton == event->button()) {
- // reset rotations
- setInputPosition(QPoint(0, 0));
+ if (isRotationEnabled()) {
+ // reset rotations
+ setInputPosition(QPoint(0, 0));
+ }
} else if (Qt::RightButton == event->button()) {
- // disable rotating when in slice view
- if (!scene()->isSlicingActive())
- d_ptr->m_inputState = QAbstract3DInputHandlerPrivate::InputStateRotating;
- // update mouse positions to prevent jumping when releasing or repressing a button
- setInputPosition(mousePos);
+ if (isRotationEnabled()) {
+ // disable rotating when in slice view
+ if (!scene()->isSlicingActive())
+ d_ptr->m_inputState = QAbstract3DInputHandlerPrivate::InputStateRotating;
+ // update mouse positions to prevent jumping when releasing or repressing a button
+ setInputPosition(mousePos);
+ }
}
#endif
}
@@ -148,7 +191,8 @@ void Q3DInputHandler::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos)
#if defined(Q_OS_IOS)
Q_UNUSED(mousePos);
#else
- if (QAbstract3DInputHandlerPrivate::InputStateRotating == d_ptr->m_inputState) {
+ if (QAbstract3DInputHandlerPrivate::InputStateRotating == d_ptr->m_inputState
+ && isRotationEnabled()) {
// Calculate mouse movement since last frame
float xRotation = scene()->activeCamera()->xRotation();
float yRotation = scene()->activeCamera()->yRotation();
@@ -174,29 +218,91 @@ void Q3DInputHandler::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos)
*/
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);
+ if (isZoomEnabled()) {
+ // 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);
+ }
+}
+
+/*!
+ * \property Q3DInputHandler::rotationEnabled
+ * \since QtDataVisualization 1.2
+ *
+ * This property specifies if this input handler allows graph rotation.
+ */
+void Q3DInputHandler::setRotationEnabled(bool enable)
+{
+ if (d_ptr->m_rotationEnabled != enable) {
+ d_ptr->m_rotationEnabled = enable;
+ emit rotationEnabledChanged(enable);
+ }
+}
+
+bool Q3DInputHandler::isRotationEnabled() const
+{
+ return d_ptr->m_rotationEnabled;
+}
+
+/*!
+ * \property Q3DInputHandler::zoomEnabled
+ * \since QtDataVisualization 1.2
+ *
+ * This property specifies if this input handler allows graph zooming.
+ */
+void Q3DInputHandler::setZoomEnabled(bool enable)
+{
+ if (d_ptr->m_zoomEnabled != enable) {
+ d_ptr->m_zoomEnabled = enable;
+ emit zoomEnabledChanged(enable);
+ }
+}
+
+bool Q3DInputHandler::isZoomEnabled() const
+{
+ return d_ptr->m_zoomEnabled;
+}
+
+/*!
+ * \property Q3DInputHandler::selectionEnabled
+ * \since QtDataVisualization 1.2
+ *
+ * This property specifies if this input handler allows selection from the graph.
+ */
+void Q3DInputHandler::setSelectionEnabled(bool enable)
+{
+ if (d_ptr->m_selectionEnabled != enable) {
+ d_ptr->m_selectionEnabled = enable;
+ emit selectionEnabledChanged(enable);
+ }
+}
+
+bool Q3DInputHandler::isSelectionEnabled() const
+{
+ return d_ptr->m_selectionEnabled;
}
Q3DInputHandlerPrivate::Q3DInputHandlerPrivate(Q3DInputHandler *q)
: q_ptr(q),
- m_inputState(QAbstract3DInputHandlerPrivate::InputStateNone)
+ m_inputState(QAbstract3DInputHandlerPrivate::InputStateNone),
+ m_rotationEnabled(true),
+ m_zoomEnabled(true),
+ m_selectionEnabled(true)
{
}
diff --git a/src/datavisualization/input/q3dinputhandler.h b/src/datavisualization/input/q3dinputhandler.h
index 118bd829..9afeb945 100644
--- a/src/datavisualization/input/q3dinputhandler.h
+++ b/src/datavisualization/input/q3dinputhandler.h
@@ -28,17 +28,32 @@ class Q3DInputHandlerPrivate;
class QT_DATAVISUALIZATION_EXPORT Q3DInputHandler : public QAbstract3DInputHandler
{
Q_OBJECT
+ Q_PROPERTY(bool rotationEnabled READ isRotationEnabled WRITE setRotationEnabled NOTIFY rotationEnabledChanged)
+ Q_PROPERTY(bool zoomEnabled READ isZoomEnabled WRITE setZoomEnabled NOTIFY zoomEnabledChanged)
+ Q_PROPERTY(bool selectionEnabled READ isSelectionEnabled WRITE setSelectionEnabled NOTIFY selectionEnabledChanged)
public:
explicit Q3DInputHandler(QObject *parent = 0);
virtual ~Q3DInputHandler();
+ void setRotationEnabled(bool enable);
+ bool isRotationEnabled() const;
+ void setZoomEnabled(bool enable);
+ bool isZoomEnabled() const;
+ void setSelectionEnabled(bool enable);
+ bool isSelectionEnabled() const;
+
// 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 rotationEnabledChanged(bool enable);
+ void zoomEnabledChanged(bool enable);
+ void selectionEnabledChanged(bool enable);
+
private:
Q_DISABLE_COPY(Q3DInputHandler)
diff --git a/src/datavisualization/input/q3dinputhandler_p.h b/src/datavisualization/input/q3dinputhandler_p.h
index a9b27307..a3ed8c9c 100644
--- a/src/datavisualization/input/q3dinputhandler_p.h
+++ b/src/datavisualization/input/q3dinputhandler_p.h
@@ -40,9 +40,15 @@ public:
Q3DInputHandlerPrivate(Q3DInputHandler *q);
~Q3DInputHandlerPrivate();
-public:
+protected:
Q3DInputHandler *q_ptr;
QAbstract3DInputHandlerPrivate::InputState m_inputState;
+
+ bool m_rotationEnabled;
+ bool m_zoomEnabled;
+ bool m_selectionEnabled;
+
+ friend class Q3DInputHandler;
};
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/input/qtouch3dinputhandler.cpp b/src/datavisualization/input/qtouch3dinputhandler.cpp
index 30f31d4a..5d62922b 100644
--- a/src/datavisualization/input/qtouch3dinputhandler.cpp
+++ b/src/datavisualization/input/qtouch3dinputhandler.cpp
@@ -66,6 +66,22 @@ const int maxZoomLevel = 500;
* \li Closes the secondary view.
* \note Secondary view is available only for Q3DBars and Q3DSurface graphs.
* \endtable
+ *
+ * Rotation, zoom, and selection can each be individually disabled using
+ * corresponding Q3DInputHandler properties.
+ */
+
+/*!
+ * \qmltype TouchInputHandler3D
+ * \inqmlmodule QtDataVisualization
+ * \since QtDataVisualization 1.2
+ * \ingroup datavisualization_qml
+ * \instantiates QTouch3DInputHandler
+ * \brief Basic touch display based input handler.
+ *
+ * TouchInputHandler3D is the basic input handler for touch screen devices.
+ *
+ * See QTouch3DInputHandler documentation for more details.
*/
/*!
@@ -104,29 +120,38 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event)
// Flush input state
d_ptr->m_inputState = QAbstract3DInputHandlerPrivate::InputStateNone;
if (scene()->isSlicingActive()) {
- if (scene()->isPointInPrimarySubView(pointerPos.toPoint()))
- setInputView(InputViewOnPrimary);
- else if (scene()->isPointInSecondarySubView(pointerPos.toPoint()))
- setInputView(InputViewOnSecondary);
- else
- setInputView(InputViewNone);
+ if (isSelectionEnabled()) {
+ if (scene()->isPointInPrimarySubView(pointerPos.toPoint()))
+ setInputView(InputViewOnPrimary);
+ else if (scene()->isPointInSecondarySubView(pointerPos.toPoint()))
+ setInputView(InputViewOnSecondary);
+ else
+ setInputView(InputViewNone);
+ }
} else {
// Handle possible tap-and-hold selection
- d_ptr->m_startHoldPos = pointerPos;
- d_ptr->m_touchHoldPos = d_ptr->m_startHoldPos;
- d_ptr->m_holdTimer->start();
- setInputView(InputViewOnPrimary);
+ if (isSelectionEnabled()) {
+ d_ptr->m_startHoldPos = pointerPos;
+ d_ptr->m_touchHoldPos = d_ptr->m_startHoldPos;
+ d_ptr->m_holdTimer->start();
+ setInputView(InputViewOnPrimary);
+ }
// Start rotating
- d_ptr->m_inputState = QAbstract3DInputHandlerPrivate::InputStateRotating;
- setInputPosition(pointerPos.toPoint());
+ if (isRotationEnabled()) {
+ d_ptr->m_inputState = QAbstract3DInputHandlerPrivate::InputStateRotating;
+ setInputPosition(pointerPos.toPoint());
+ setInputView(InputViewOnPrimary);
+ }
}
} else if (event->type() == QEvent::TouchEnd) {
setInputView(InputViewNone);
d_ptr->m_holdTimer->stop();
// Handle possible selection
if (!scene()->isSlicingActive()
- && QAbstract3DInputHandlerPrivate::InputStatePinching != d_ptr->m_inputState)
+ && QAbstract3DInputHandlerPrivate::InputStatePinching
+ != d_ptr->m_inputState) {
d_ptr->handleSelection(pointerPos);
+ }
} else if (event->type() == QEvent::TouchUpdate) {
if (!scene()->isSlicingActive()) {
d_ptr->m_touchHoldPos = pointerPos;
@@ -158,52 +183,59 @@ QTouch3DInputHandlerPrivate::~QTouch3DInputHandlerPrivate()
void QTouch3DInputHandlerPrivate::handlePinchZoom(float distance)
{
- int newDistance = distance;
- int prevDist = q_ptr->prevDistance();
- if (prevDist > 0 && qAbs(prevDist - newDistance) < maxPinchJitter)
- return;
- m_inputState = QAbstract3DInputHandlerPrivate::InputStatePinching;
- Q3DCamera *camera = q_ptr->scene()->activeCamera();
- int zoomLevel = camera->zoomLevel();
- float 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);
+ if (q_ptr->isZoomEnabled()) {
+ int newDistance = distance;
+ int prevDist = q_ptr->prevDistance();
+ if (prevDist > 0 && qAbs(prevDist - newDistance) < maxPinchJitter)
+ return;
+ m_inputState = QAbstract3DInputHandlerPrivate::InputStatePinching;
+ Q3DCamera *camera = q_ptr->scene()->activeCamera();
+ int zoomLevel = camera->zoomLevel();
+ float 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) {
- q_ptr->setInputPosition(m_touchHoldPos.toPoint());
- q_ptr->scene()->setSelectionQueryPosition(m_touchHoldPos.toPoint());
- m_inputState = QAbstract3DInputHandlerPrivate::InputStateSelecting;
+ if (q_ptr->isSelectionEnabled()) {
+ QPointF distance = m_startHoldPos - m_touchHoldPos;
+ if (distance.manhattanLength() < maxTapAndHoldJitter) {
+ q_ptr->setInputPosition(m_touchHoldPos.toPoint());
+ q_ptr->scene()->setSelectionQueryPosition(m_touchHoldPos.toPoint());
+ m_inputState = QAbstract3DInputHandlerPrivate::InputStateSelecting;
+ }
}
}
void QTouch3DInputHandlerPrivate::handleSelection(const QPointF &position)
{
- QPointF distance = m_startHoldPos - position;
- if (distance.manhattanLength() < maxSelectionJitter) {
- m_inputState = QAbstract3DInputHandlerPrivate::InputStateSelecting;
- q_ptr->scene()->setSelectionQueryPosition(position.toPoint());
- } else {
- m_inputState = QAbstract3DInputHandlerPrivate::InputStateNone;
- q_ptr->setInputView(QAbstract3DInputHandler::InputViewNone);
+ if (q_ptr->isSelectionEnabled()) {
+ QPointF distance = m_startHoldPos - position;
+ if (distance.manhattanLength() < maxSelectionJitter) {
+ m_inputState = QAbstract3DInputHandlerPrivate::InputStateSelecting;
+ q_ptr->scene()->setSelectionQueryPosition(position.toPoint());
+ } else {
+ m_inputState = QAbstract3DInputHandlerPrivate::InputStateNone;
+ q_ptr->setInputView(QAbstract3DInputHandler::InputViewNone);
+ }
+ q_ptr->setPreviousInputPos(position.toPoint());
}
- q_ptr->setPreviousInputPos(position.toPoint());
}
void QTouch3DInputHandlerPrivate::handleRotation(const QPointF &position)
{
- if (QAbstract3DInputHandlerPrivate::InputStateRotating == m_inputState) {
+ if (q_ptr->isRotationEnabled()
+ && QAbstract3DInputHandlerPrivate::InputStateRotating == m_inputState) {
Q3DScene *scene = q_ptr->scene();
Q3DCamera *camera = scene->activeCamera();
float xRotation = camera->xRotation();
diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp
index 6e6d9b1c..c824afec 100644
--- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp
+++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp
@@ -93,6 +93,7 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri)
QLatin1String("Trying to create uncreatable: Abstract3DSeries."));
qmlRegisterUncreatableType<AbstractDeclarative, 1>(uri, 1, 1, "AbstractGraph3D",
QLatin1String("Trying to create uncreatable: AbstractGraph3D."));
+
qmlRegisterType<QValue3DAxis, 1>(uri, 1, 1, "ValueAxis3D");
qmlRegisterType<QItemModelBarDataProxy, 1>(uri, 1, 1, "ItemModelBarDataProxy");
qmlRegisterType<QItemModelSurfaceDataProxy, 1>(uri, 1, 1, "ItemModelSurfaceDataProxy");
@@ -113,6 +114,10 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri)
qmlRegisterUncreatableType<AbstractDeclarative, 2>(uri, 1, 2, "AbstractGraph3D",
QLatin1String("Trying to create uncreatable: AbstractGraph3D."));
qmlRegisterType<DeclarativeSurface, 1>(uri, 1, 2, "Surface3D");
+
+ // New types
+ qmlRegisterType<Q3DInputHandler>(uri, 1, 2, "InputHandler3D");
+ qmlRegisterType<QTouch3DInputHandler>(uri, 1, 2, "TouchInputHandler3D");
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.h b/src/datavisualizationqml2/datavisualizationqml2_plugin.h
index 21ef85b8..8d2be659 100644
--- a/src/datavisualizationqml2/datavisualizationqml2_plugin.h
+++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.h
@@ -42,7 +42,8 @@
#include "declarativeseries_p.h"
#include "q3dtheme.h"
#include "declarativetheme_p.h"
-#include "qabstract3dinputhandler.h"
+#include "q3dinputhandler.h"
+#include "qtouch3dinputhandler.h"
#include "declarativecolor_p.h"
#include "declarativescene_p.h"
#include "qcustom3ditem.h"
@@ -97,6 +98,8 @@ QML_DECLARE_TYPE(Q3DTheme)
QML_DECLARE_TYPE(DeclarativeTheme3D)
QML_DECLARE_TYPE(QAbstract3DInputHandler)
+QML_DECLARE_TYPE(Q3DInputHandler)
+QML_DECLARE_TYPE(QTouch3DInputHandler)
QML_DECLARE_TYPE(QCustom3DItem)
QML_DECLARE_TYPE(QCustom3DLabel)
diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp
index d3c38d85..e0f9ff18 100644
--- a/tests/barstest/chart.cpp
+++ b/tests/barstest/chart.cpp
@@ -203,7 +203,7 @@ GraphModifier::GraphModifier(Q3DBars *barchart, QColorDialog *colorDialog)
m_graph->activeTheme()->setFont(QFont("Times Roman", 20));
// Release and store the default input handler.
- m_defaultInputHandler = m_graph->activeInputHandler();
+ m_defaultInputHandler = static_cast<Q3DInputHandler *>(m_graph->activeInputHandler());
m_graph->releaseInputHandler(m_defaultInputHandler);
m_graph->setActiveInputHandler(m_defaultInputHandler);
@@ -1406,6 +1406,21 @@ void GraphModifier::reverseValueAxis(int enabled)
m_graph->valueAxis()->setReversed(enabled);
}
+void GraphModifier::setInputHandlerRotationEnabled(int enabled)
+{
+ m_defaultInputHandler->setRotationEnabled(enabled);
+}
+
+void GraphModifier::setInputHandlerZoomEnabled(int enabled)
+{
+ m_defaultInputHandler->setZoomEnabled(enabled);
+}
+
+void GraphModifier::setInputHandlerSelectionEnabled(int enabled)
+{
+ m_defaultInputHandler->setSelectionEnabled(enabled);
+}
+
void GraphModifier::changeValueAxisSegments(int value)
{
qDebug() << __FUNCTION__ << value;
diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h
index 47d29c25..7ee781ad 100644
--- a/tests/barstest/chart.h
+++ b/tests/barstest/chart.h
@@ -20,7 +20,7 @@
#define CHARTMODIFIER_H
#include <QtDataVisualization/q3dbars.h>
-#include <QtDataVisualization/qabstract3dinputhandler.h>
+#include <QtDataVisualization/q3dinputhandler.h>
#include <QtDataVisualization/qbar3dseries.h>
#include <QtDataVisualization/q3dtheme.h>
#include <QFont>
@@ -94,6 +94,9 @@ public:
void addRemoveSeries();
void testItemAndRowChanges();
void reverseValueAxis(int enabled);
+ void setInputHandlerRotationEnabled(int enabled);
+ void setInputHandlerZoomEnabled(int enabled);
+ void setInputHandlerSelectionEnabled(int enabled);
public slots:
void flipViews();
@@ -159,7 +162,7 @@ private:
QValue3DAxis *m_currentAxis;
bool m_negativeValuesOn;
bool m_useNullInputHandler;
- QAbstract3DInputHandler *m_defaultInputHandler;
+ Q3DInputHandler *m_defaultInputHandler;
Q3DTheme *m_ownTheme;
Q3DTheme *m_builtinTheme;
QTimer m_insertRemoveTimer;
diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp
index 5ecf63a4..2d755c7f 100644
--- a/tests/barstest/main.cpp
+++ b/tests/barstest/main.cpp
@@ -43,6 +43,7 @@ int main(int argc, char **argv)
QHBoxLayout *hLayout = new QHBoxLayout(widget);
QVBoxLayout *vLayout = new QVBoxLayout();
QVBoxLayout *vLayout2 = new QVBoxLayout();
+ QVBoxLayout *vLayout3 = new QVBoxLayout();
// For testing custom surface format
QSurfaceFormat surfaceFormat;
@@ -65,6 +66,7 @@ int main(int argc, char **argv)
hLayout->addWidget(container, 1);
hLayout->addLayout(vLayout);
hLayout->addLayout(vLayout2);
+ hLayout->addLayout(vLayout3);
QPushButton *addSeriesButton = new QPushButton(widget);
addSeriesButton->setText(QStringLiteral("Add / Remove a series"));
@@ -220,6 +222,18 @@ int main(int argc, char **argv)
staticCheckBox->setText("Use dynamic data");
staticCheckBox->setChecked(false);
+ QCheckBox *inputHandlerRotationCheckBox = new QCheckBox(widget);
+ inputHandlerRotationCheckBox->setText("IH: Allow rotation");
+ inputHandlerRotationCheckBox->setChecked(true);
+
+ QCheckBox *inputHandlerZoomCheckBox = new QCheckBox(widget);
+ inputHandlerZoomCheckBox->setText("IH: Allow zoom");
+ inputHandlerZoomCheckBox->setChecked(true);
+
+ QCheckBox *inputHandlerSelectionCheckBox = new QCheckBox(widget);
+ inputHandlerSelectionCheckBox->setText("IH: Allow selection");
+ inputHandlerSelectionCheckBox->setChecked(true);
+
QSlider *rotationSliderX = new QSlider(Qt::Horizontal, widget);
rotationSliderX->setTickInterval(1);
rotationSliderX->setMinimum(-180);
@@ -340,15 +354,15 @@ int main(int argc, char **argv)
vLayout->addWidget(insertRemoveTestButton, 0, Qt::AlignTop);
vLayout->addWidget(releaseAxesButton, 0, Qt::AlignTop);
vLayout->addWidget(releaseProxiesButton, 1, Qt::AlignTop);
- vLayout->addWidget(flipViewsButton, 0, Qt::AlignTop);
- vLayout->addWidget(changeColorStyleButton, 0, Qt::AlignTop);
- vLayout->addWidget(ownThemeButton, 0, Qt::AlignTop);
- vLayout->addWidget(primarySeriesTestsButton, 0, Qt::AlignTop);
- vLayout->addWidget(toggleRotationButton, 0, Qt::AlignTop);
- vLayout->addWidget(gradientBtoYPB, 0, Qt::AlignTop);
- vLayout->addWidget(logAxisButton, 0, Qt::AlignTop);
- vLayout->addWidget(testItemAndRowChangesButton, 1, Qt::AlignTop);
+ vLayout2->addWidget(flipViewsButton, 0, Qt::AlignTop);
+ vLayout2->addWidget(changeColorStyleButton, 0, Qt::AlignTop);
+ vLayout2->addWidget(ownThemeButton, 0, Qt::AlignTop);
+ vLayout2->addWidget(primarySeriesTestsButton, 0, Qt::AlignTop);
+ vLayout2->addWidget(toggleRotationButton, 0, Qt::AlignTop);
+ vLayout2->addWidget(gradientBtoYPB, 0, Qt::AlignTop);
+ vLayout2->addWidget(logAxisButton, 0, Qt::AlignTop);
+ vLayout2->addWidget(testItemAndRowChangesButton, 0, Qt::AlignTop);
vLayout2->addWidget(staticCheckBox, 0, Qt::AlignTop);
vLayout2->addWidget(rotationCheckBox, 0, Qt::AlignTop);
vLayout2->addWidget(rotationSliderX, 0, Qt::AlignTop);
@@ -365,24 +379,28 @@ int main(int argc, char **argv)
vLayout2->addWidget(minSliderX, 0, Qt::AlignTop);
vLayout2->addWidget(minSliderZ, 0, Qt::AlignTop);
vLayout2->addWidget(minSliderY, 0, Qt::AlignTop);
- vLayout2->addWidget(maxSliderY, 0, Qt::AlignTop);
- vLayout2->addWidget(fpsLabel, 0, Qt::AlignTop);
- vLayout2->addWidget(fpsCheckBox, 0, Qt::AlignTop);
- vLayout2->addWidget(reverseValueAxisCheckBox, 0, Qt::AlignTop);
- vLayout2->addWidget(backgroundCheckBox, 0, Qt::AlignTop);
- vLayout2->addWidget(gridCheckBox, 0, Qt::AlignTop);
- vLayout2->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")), 0, Qt::AlignTop);
- vLayout2->addWidget(shadowQuality, 0, Qt::AlignTop);
- vLayout2->addWidget(new QLabel(QStringLiteral("Change font")), 0, Qt::AlignTop);
- vLayout2->addWidget(fontList, 0, Qt::AlignTop);
- vLayout2->addWidget(new QLabel(QStringLiteral("Adjust font size")), 0, Qt::AlignTop);
- vLayout2->addWidget(fontSizeSlider, 0, Qt::AlignTop);
- vLayout2->addWidget(new QLabel(QStringLiteral("Value axis format")), 0, Qt::AlignTop);
- vLayout2->addWidget(valueAxisFormatEdit, 0, Qt::AlignTop);
- vLayout2->addWidget(new QLabel(QStringLiteral("Log axis base")), 0, Qt::AlignTop);
- vLayout2->addWidget(logBaseEdit, 0, Qt::AlignTop);
- vLayout2->addWidget(new QLabel(QStringLiteral("Value axis segments")), 0, Qt::AlignTop);
- vLayout2->addWidget(valueAxisSegmentsSpin, 0, Qt::AlignTop);
+ vLayout2->addWidget(maxSliderY, 1, Qt::AlignTop);
+
+ vLayout3->addWidget(fpsLabel, 0, Qt::AlignTop);
+ vLayout3->addWidget(fpsCheckBox, 0, Qt::AlignTop);
+ vLayout3->addWidget(reverseValueAxisCheckBox, 0, Qt::AlignTop);
+ vLayout3->addWidget(backgroundCheckBox, 0, Qt::AlignTop);
+ vLayout3->addWidget(gridCheckBox, 0, Qt::AlignTop);
+ vLayout3->addWidget(inputHandlerRotationCheckBox, 0, Qt::AlignTop);
+ vLayout3->addWidget(inputHandlerZoomCheckBox, 0, Qt::AlignTop);
+ vLayout3->addWidget(inputHandlerSelectionCheckBox, 0, Qt::AlignTop);
+ vLayout3->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")), 0, Qt::AlignTop);
+ vLayout3->addWidget(shadowQuality, 0, Qt::AlignTop);
+ vLayout3->addWidget(new QLabel(QStringLiteral("Change font")), 0, Qt::AlignTop);
+ vLayout3->addWidget(fontList, 0, Qt::AlignTop);
+ vLayout3->addWidget(new QLabel(QStringLiteral("Adjust font size")), 0, Qt::AlignTop);
+ vLayout3->addWidget(fontSizeSlider, 0, Qt::AlignTop);
+ vLayout3->addWidget(new QLabel(QStringLiteral("Value axis format")), 0, Qt::AlignTop);
+ vLayout3->addWidget(valueAxisFormatEdit, 0, Qt::AlignTop);
+ vLayout3->addWidget(new QLabel(QStringLiteral("Log axis base")), 0, Qt::AlignTop);
+ vLayout3->addWidget(logBaseEdit, 0, Qt::AlignTop);
+ vLayout3->addWidget(new QLabel(QStringLiteral("Value axis segments")), 0, Qt::AlignTop);
+ vLayout3->addWidget(valueAxisSegmentsSpin, 1, Qt::AlignTop);
// TODO: Add example for setMeshFileName
widget->show();
@@ -488,7 +506,12 @@ int main(int argc, char **argv)
&GraphModifier::setBackgroundEnabled);
QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
&GraphModifier::setGridEnabled);
-
+ QObject::connect(inputHandlerRotationCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setInputHandlerRotationEnabled);
+ QObject::connect(inputHandlerZoomCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setInputHandlerZoomEnabled);
+ QObject::connect(inputHandlerSelectionCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setInputHandlerSelectionEnabled);
QObject::connect(rotationCheckBox, &QCheckBox::stateChanged, modifier,
&GraphModifier::setUseNullInputHandler);