From ffba0218893cd25b08718d4d6fd0c40c95aecf47 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 25 Jun 2014 14:45:01 +0300 Subject: Add radialLabelOffset property for graphs This property indicates where radial labels of the polar chart are drawn Task-number: QTRD-3184 Change-Id: I1500e67da5e578b90d679876130c2d56c1d08039 Reviewed-by: Mika Salmela --- ...tdatavisualization-qml-abstractdeclarative.qdoc | 15 ++++++++++++- .../doc/src/qtdatavisualization-qml-surface3d.qdoc | 1 + .../engine/abstract3dcontroller.cpp | 21 +++++++++++++++++ .../engine/abstract3dcontroller_p.h | 8 ++++++- .../engine/abstract3drenderer.cpp | 6 +++++ .../engine/abstract3drenderer_p.h | 2 ++ src/datavisualization/engine/q3dsurface.cpp | 1 + src/datavisualization/engine/qabstract3dgraph.cpp | 26 +++++++++++++++++++++- src/datavisualization/engine/qabstract3dgraph.h | 5 +++++ src/datavisualization/engine/surface3drenderer.cpp | 23 ++++++++++++------- 10 files changed, 97 insertions(+), 11 deletions(-) (limited to 'src/datavisualization') diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 5afbc8c7..cae9a406 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -162,7 +162,20 @@ * * Defaults to \c{false}. * - * \sa orthoProjection, AbstractAxis3D::gridOffset, radialLabelOffset + * \sa orthoProjection, radialLabelOffset + */ + +/*! + * \qmlproperty real AbstractGraph3D::radialLabelOffset + * \since QtDataVisualization 1.2 + * + * This property specifies the normalized horizontal offset for the axis labels of the radial + * polar axis. The value 0.0 indicates the labels should be drawn next to the 0-angle angular + * axis grid line. The value 1.0 indicates the labels are drawn on their normal place at the edge + * of the graph background. + * This property is ignored if polar property value is \c{false}. Defaults to 1.0. + * + * \sa polar */ /*! diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc index 4c25cc0a..4188e2b1 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc @@ -87,6 +87,7 @@ /*! * \qmlproperty bool Surface3D::flipHorizontalGrid + * \since QtDataVisualization 1.2 * * If \c{false}, the horizontal axis grid and labels are drawn on the horizontal background * of the graph. diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index e4fd0003..6b090fcd 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -51,6 +51,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_isSeriesVisualsDirty(true), m_renderPending(false), m_isPolar(false), + m_radialLabelOffset(1.0f), m_measureFps(false), m_numFrames(0), m_currentFps(0.0) @@ -182,6 +183,11 @@ void Abstract3DController::synchDataToRenderer() m_changeTracker.polarChanged = false; } + if (m_changeTracker.radialLabelOffsetChanged) { + m_renderer->updateRadialLabelOffset(m_radialLabelOffset); + m_changeTracker.radialLabelOffsetChanged = false; + } + if (m_changeTracker.shadowQualityChanged) { m_renderer->updateShadowQuality(m_shadowQuality); m_changeTracker.shadowQualityChanged = false; @@ -1543,4 +1549,19 @@ bool Abstract3DController::isPolar() const return m_isPolar; } +void Abstract3DController::setRadialLabelOffset(float offset) +{ + if (m_radialLabelOffset != offset) { + m_radialLabelOffset = offset; + m_changeTracker.radialLabelOffsetChanged = true; + emit radialLabelOffsetChanged(m_radialLabelOffset); + emitNeedRender(); + } +} + +float Abstract3DController::radialLabelOffset() const +{ + return m_radialLabelOffset; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 7d721b0c..6394da1e 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -91,6 +91,7 @@ struct Abstract3DChangeBitField { bool axisYTitleFixedChanged : 1; bool axisZTitleFixedChanged : 1; bool polarChanged : 1; + bool radialLabelOffsetChanged : 1; Abstract3DChangeBitField() : themeChanged(true), @@ -135,7 +136,8 @@ struct Abstract3DChangeBitField { axisXTitleFixedChanged(true), axisYTitleFixedChanged(true), axisZTitleFixedChanged(true), - polarChanged(true) + polarChanged(true), + radialLabelOffsetChanged(true) { } }; @@ -178,6 +180,7 @@ protected: bool m_isSeriesVisualsDirty; bool m_renderPending; bool m_isPolar; + float m_radialLabelOffset; QList m_seriesList; @@ -274,6 +277,8 @@ public: float aspectRatio(); void setPolar(bool enable); bool isPolar() const; + void setRadialLabelOffset(float offset); + float radialLabelOffset() const; void emitNeedRender(); @@ -352,6 +357,7 @@ signals: void aspectRatioChanged(float ratio); void optimizationHintsChanged(QAbstract3DGraph::OptimizationHints hints); void polarChanged(bool enabled); + void radialLabelOffsetChanged(float offset); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index f7cb5499..f520e279 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -67,6 +67,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_labelObj(0), m_graphAspectRatio(2.0f), m_polarGraph(false), + m_radialLabelOffset(1.0f), m_xRightAngleRotation(QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, 90.0f)), m_yRightAngleRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 90.0f)), m_zRightAngleRotation(QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, 90.0f)), @@ -316,6 +317,11 @@ void Abstract3DRenderer::updatePolar(bool enable) updateCustomItemPositions(); } +void Abstract3DRenderer::updateRadialLabelOffset(float offset) +{ + m_radialLabelOffset = offset; +} + void Abstract3DRenderer::updateOptimizationHint(QAbstract3DGraph::OptimizationHints hint) { m_cachedOptimizationHint = hint; diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 10e88f3f..ed26a4ec 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -126,6 +126,7 @@ public: virtual void updateAspectRatio(float ratio); virtual void updatePolar(bool enable); + virtual void updateRadialLabelOffset(float offset); virtual QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute) = 0; @@ -254,6 +255,7 @@ protected: float m_graphAspectRatio; bool m_polarGraph; + float m_radialLabelOffset; QQuaternion m_xRightAngleRotation; QQuaternion m_yRightAngleRotation; diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp index c9af656f..90b336df 100644 --- a/src/datavisualization/engine/q3dsurface.cpp +++ b/src/datavisualization/engine/q3dsurface.cpp @@ -233,6 +233,7 @@ QSurface3DSeries *Q3DSurface::selectedSeries() const /*! * \property Q3DSurface::flipHorizontalGrid + * \since QtDataVisualization 1.2 * * If \c{false}, the horizontal axis grid and labels are drawn on the horizontal background * of the graph. diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 6240f714..af809100 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -662,7 +662,7 @@ QAbstract3DGraph::OptimizationHints QAbstract3DGraph::optimizationHints() const * * Defaults to \c{false}. * - * \sa orthoProjection, QAbstract3DAxis::gridOffset, radialLabelOffset + * \sa orthoProjection, radialLabelOffset */ void QAbstract3DGraph::setPolar(bool enable) { @@ -674,6 +674,28 @@ bool QAbstract3DGraph::isPolar() const return d_ptr->m_visualController->isPolar(); } +/*! + * \property QAbstract3DGraph::radialLabelOffset + * \since QtDataVisualization 1.2 + * + * This property specifies the normalized horizontal offset for the axis labels of the radial + * polar axis. The value 0.0 indicates the labels should be drawn next to the 0-angle angular + * axis grid line. The value 1.0 indicates the labels are drawn on their normal place at the edge + * of the graph background. + * This property is ignored if polar property value is \c{false}. Defaults to 1.0. + * + * \sa polar + */ +void QAbstract3DGraph::setRadialLabelOffset(float offset) +{ + d_ptr->m_visualController->setRadialLabelOffset(offset); +} + +float QAbstract3DGraph::radialLabelOffset() const +{ + return d_ptr->m_visualController->radialLabelOffset(); +} + /*! * \internal */ @@ -826,6 +848,8 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll &QAbstract3DGraph::aspectRatioChanged); QObject::connect(m_visualController, &Abstract3DController::polarChanged, q_ptr, &QAbstract3DGraph::polarChanged); + QObject::connect(m_visualController, &Abstract3DController::radialLabelOffsetChanged, q_ptr, + &QAbstract3DGraph::radialLabelOffsetChanged); } void QAbstract3DGraphPrivate::handleDevicePixelRatioChange() diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index ca673358..e6ebc42b 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -51,6 +51,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(qreal aspectRatio READ aspectRatio WRITE setAspectRatio NOTIFY aspectRatioChanged) Q_PROPERTY(OptimizationHints optimizationHints READ optimizationHints WRITE setOptimizationHints NOTIFY optimizationHintsChanged) Q_PROPERTY(bool polar READ isPolar WRITE setPolar NOTIFY polarChanged) + Q_PROPERTY(float radialLabelOffset READ radialLabelOffset WRITE setRadialLabelOffset NOTIFY radialLabelOffsetChanged) protected: explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -154,6 +155,9 @@ public: void setPolar(bool enable); bool isPolar() const; + void setRadialLabelOffset(float offset); + float radialLabelOffset() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); @@ -178,6 +182,7 @@ signals: void aspectRatioChanged(qreal ratio); void optimizationHintsChanged(QAbstract3DGraph::OptimizationHints hints); void polarChanged(bool enabled); + void radialLabelOffsetChanged(float offset); private: Q_DISABLE_COPY(QAbstract3DGraph) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 5fd59e5e..6cf335b0 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1050,15 +1050,19 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) else m_xFlipped = true; + m_yFlippedForGrid = m_yFlipped; if (m_flipHorizontalGrid) { - // Need to determine if camera is below graph top - float distanceToCenter = activeCamera->position().length() - / activeCamera->zoomLevel() / m_autoScaleAdjustment * 100.0f; - qreal cameraAngle = qreal(activeCamera->yRotation()) / 180.0 * M_PI; - float cameraYPos = float(qSin(cameraAngle)) * distanceToCenter; - m_yFlippedForGrid = cameraYPos < backgroundMargin; - } else { - m_yFlippedForGrid = m_yFlipped; + if (!m_useOrthoProjection) { + // Need to determine if camera is below graph top + float distanceToCenter = activeCamera->position().length() + / activeCamera->zoomLevel() / m_autoScaleAdjustment * 100.0f; + qreal cameraAngle = qreal(activeCamera->yRotation()) / 180.0 * M_PI; + float cameraYPos = float(qSin(cameraAngle)) * distanceToCenter; + m_yFlippedForGrid = cameraYPos < backgroundMargin; + } else if (m_useOrthoProjection && activeCamera->yRotation() == 0.0f) { + // With ortho we only need to flip at angle zero, to fix label autorotation angles + m_yFlippedForGrid = !m_yFlipped; + } } // calculate background rotation based on view matrix rotation @@ -1937,6 +1941,9 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelYTrans, 0.0f); + if (m_polarGraph) + labelTrans.setX(labelTrans.x() * m_radialLabelOffset); + if (m_zFlipped) { startIndex = 0; endIndex = labelCount; -- cgit v1.2.3