diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller.cpp | 18 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller_p.h | 12 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer.cpp | 45 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer_p.h | 5 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.cpp | 22 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.h | 5 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativebars.cpp | 13 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativebars_p.h | 5 |
9 files changed, 114 insertions, 17 deletions
diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc index d61b298a..ee11a9d9 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc @@ -69,6 +69,12 @@ * This temporary axis is destroyed if another axis is explicitly set to same orientation. */ +/*! + * \qmlproperty bool Bars3D::multiSeriesUniform + * This property controls if bars are to be scaled with proportions set to a single series bar even + * if there are multiple series displayed. If set to \c {true}, \l{barSpacing}{bar spacing} will + * affect only X-axis correctly. It is preset to \c false by default. + */ /*! * \qmlproperty real Bars3D::barThickness diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 95fb36b9..2238fdee 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -83,6 +83,11 @@ void Bars3DController::synchDataToRenderer() Abstract3DController::synchDataToRenderer(); // Notify changes to renderer + if (m_changeTracker.multiSeriesScalingChanged) { + m_renderer->updateMultiSeriesScaling(m_isMultiSeriesUniform); + m_changeTracker.multiSeriesScalingChanged = false; + } + if (m_changeTracker.barSpecsChanged) { m_renderer->updateBarSpecs(m_barThicknessRatio, m_barSpacing, m_isBarSpecRelative); m_changeTracker.barSpecsChanged = false; @@ -378,6 +383,19 @@ void Bars3DController::handleAxisRangeChangedBySender(QObject *sender) setSelectedBar(m_selectedBar, m_selectedBarSeries); } +void Bars3DController::setMultiSeriesScaling(bool uniform) +{ + m_isMultiSeriesUniform = uniform; + + m_changeTracker.multiSeriesScalingChanged = true; + emitNeedRender(); +} + +bool Bars3DController::multiSeriesScaling() const +{ + return m_isMultiSeriesUniform; +} + void Bars3DController::setBarSpecs(GLfloat thicknessRatio, const QSizeF &spacing, bool relative) { m_barThicknessRatio = thicknessRatio; diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h index 191007b7..525f6564 100644 --- a/src/datavisualization/engine/bars3dcontroller_p.h +++ b/src/datavisualization/engine/bars3dcontroller_p.h @@ -38,12 +38,14 @@ class Bars3DRenderer; class QBar3DSeries; struct Bars3DChangeBitField { - bool slicingActiveChanged : 1; - bool barSpecsChanged : 1; - bool selectedBarChanged : 1; + bool slicingActiveChanged : 1; + bool multiSeriesScalingChanged : 1; + bool barSpecsChanged : 1; + bool selectedBarChanged : 1; Bars3DChangeBitField() : slicingActiveChanged(true), + multiSeriesScalingChanged(true), barSpecsChanged(true), selectedBarChanged(true) { @@ -64,6 +66,7 @@ private: QBar3DSeries *m_primarySeries; // Category axis labels are taken from the primary series // Look'n'feel + bool m_isMultiSeriesUniform; bool m_isBarSpecRelative; GLfloat m_barThicknessRatio; QSizeF m_barSpacing; @@ -78,6 +81,9 @@ public: virtual void initializeOpenGL(); virtual void synchDataToRenderer(); + void setMultiSeriesScaling(bool uniform); + bool multiSeriesScaling() const; + // bar thickness, spacing between bars, and is spacing relative to thickness or absolute // y -component sets the thickness/spacing of z -direction // With relative 0.0f means side-to-side, 1.0f = one thickness in between diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index ada9f660..4140f01c 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -89,10 +89,12 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_selectedBarPos(Bars3DController::invalidSelectionPosition()), m_selectedBarSeries(0), m_noZeroInRange(false), - m_seriesScale(0.0f), + m_seriesScaleX(0.0f), + m_seriesScaleZ(0.0f), m_seriesStep(0.0f), m_seriesStart(0.0f), - m_clickedPosition(Bars3DController::invalidSelectionPosition()) + m_clickedPosition(Bars3DController::invalidSelectionPosition()), + m_keepSeriesUniform(false) { initializeOpenGLFunctions(); initializeOpenGL(); @@ -160,11 +162,17 @@ void Bars3DRenderer::updateData() if (m_renderingArrays.size() != seriesCount) { m_renderingArrays.resize(seriesCount); - m_seriesScale = 1.0f / float(seriesCount); + m_seriesScaleX = 1.0f / float(seriesCount); m_seriesStep = 1.0f / float(seriesCount); m_seriesStart = -((float(seriesCount) - 1.0f) / 2.0f) * m_seriesStep; } + + if (m_keepSeriesUniform) + m_seriesScaleZ = m_seriesScaleX; + else + m_seriesScaleZ = 1.0f; + if (m_cachedRowCount != newRows || m_cachedColumnCount != newColumns) { // Force update for selection related items m_sliceCache = 0; @@ -427,11 +435,11 @@ void Bars3DRenderer::drawSlicedScene() } // Draw bars - QVector3D modelMatrixScaler(m_scaleX, 0.0f, m_scaleZ); - if (rowMode) - modelMatrixScaler.setX(m_scaleX * m_seriesScale); - else - modelMatrixScaler.setZ(m_scaleZ * m_seriesScale); + QVector3D modelMatrixScaler(m_scaleX * m_seriesScaleX, 0.0f, m_scaleZ * m_seriesScaleZ); + if (!rowMode) { + modelMatrixScaler.setX(m_scaleZ * m_seriesScaleZ); + modelMatrixScaler.setZ(m_scaleX * m_seriesScaleX); + } // Set common bar shader bindings m_barShader->bind(); @@ -809,7 +817,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix; // Draw bars to depth buffer - QVector3D shadowScaler(m_scaleX * m_seriesScale * 0.9f, 0.0f, m_scaleZ * 0.9f); + QVector3D shadowScaler(m_scaleX * m_seriesScaleX * 0.9f, 0.0f, + m_scaleZ * m_seriesScaleZ * 0.9f); float seriesPos = m_seriesStart; for (int series = 0; series < seriesCount; series++) { ObjectHelper *barObj = m_visibleSeriesList.at(series).object(); @@ -926,9 +935,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) modelMatrix.translate((colPos - m_rowWidth) / m_scaleFactor, item.height(), (m_columnDepth - rowPos) / m_scaleFactor); - modelMatrix.scale(QVector3D(m_scaleX * m_seriesScale, + modelMatrix.scale(QVector3D(m_scaleX * m_seriesScaleX, item.height(), - m_scaleZ)); + m_scaleZ * m_seriesScaleZ)); MVPMatrix = projectionViewMatrix * modelMatrix; @@ -1049,7 +1058,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) QVector3D baseColor; QVector3D barColor; - QVector3D modelScaler(m_scaleX * m_seriesScale, 0.0f, m_scaleZ); + QVector3D modelScaler(m_scaleX * m_seriesScaleX, 0.0f, m_scaleZ * m_seriesScaleZ); bool somethingSelected = (m_visualSelectedBarPos != Bars3DController::invalidSelectionPosition()); float seriesPos = m_seriesStart; for (int series = 0; series < seriesCount; series++) { @@ -1837,6 +1846,18 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_selectionDirty = false; } +void Bars3DRenderer::updateMultiSeriesScaling(bool uniform) +{ + m_keepSeriesUniform = uniform; + + // Recalculate scale factors + m_seriesScaleX = 1.0f / float(m_visibleSeriesList.size()); + if (m_keepSeriesUniform) + m_seriesScaleZ = m_seriesScaleX; + else + m_seriesScaleZ = 1.0f; +} + void Bars3DRenderer::updateBarSpecs(GLfloat thicknessRatio, const QSizeF &spacing, bool relative) { // Convert ratio to QSizeF, as we need it in that format for autoscaling calculations diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 353ead44..04e2a1ac 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -102,10 +102,12 @@ private: BarRenderItem m_dummyBarRenderItem; QVector<BarRenderItemArray> m_renderingArrays; bool m_noZeroInRange; - float m_seriesScale; + float m_seriesScaleX; + float m_seriesScaleZ; float m_seriesStep; float m_seriesStart; QPoint m_clickedPosition; + bool m_keepSeriesUniform; public: explicit Bars3DRenderer(Bars3DController *controller); @@ -119,6 +121,7 @@ protected: virtual void initializeOpenGL(); public slots: + void updateMultiSeriesScaling(bool uniform); void updateBarSpecs(GLfloat thicknessRatio = 1.0f, const QSizeF &spacing = QSizeF(1.0, 1.0), bool relative = true); diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index 3cc4de0d..1d86f8f0 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -183,6 +183,26 @@ QList<QBar3DSeries *> Q3DBars::seriesList() } /*! + * \property Q3DBars::multiSeriesUniform + * + * This property controls if bars are to be scaled with proportions set to a single series bar even + * if there are multiple series displayed. If set to \c {true}, \l{barSpacing}{bar spacing} will + * affect only X-axis correctly. It is preset to \c false by default. + */ +void Q3DBars::setMultiSeriesUniform(bool uniform) +{ + if (uniform != isMultiSeriesUniform()) { + dptr()->m_shared->setMultiSeriesScaling(uniform); + emit multiSeriesUniformChanged(uniform); + } +} + +bool Q3DBars::isMultiSeriesUniform() const +{ + return dptrc()->m_shared->multiSeriesScaling(); +} + +/*! * \property Q3DBars::barThickness * * Bar thickness ratio between X and Z dimensions. 1.0 means bars are as wide as they are deep, 0.5 @@ -208,7 +228,7 @@ float Q3DBars::barThickness() * Bar spacing, which is the empty space between bars, in X and Z dimensions. It is preset to * \c {(1.0, 1.0)} by default. Spacing is affected by barSpacingRelative -property. * - * \sa barSpacingRelative + * \sa barSpacingRelative, multiSeriesUniform */ void Q3DBars::setBarSpacing(QSizeF spacing) { diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h index bf973c11..636c5720 100644 --- a/src/datavisualization/engine/q3dbars.h +++ b/src/datavisualization/engine/q3dbars.h @@ -34,6 +34,7 @@ class QBar3DSeries; class QT_DATAVISUALIZATION_EXPORT Q3DBars : public QAbstract3DGraph { Q_OBJECT + Q_PROPERTY(bool multiSeriesUniform READ isMultiSeriesUniform WRITE setMultiSeriesUniform NOTIFY multiSeriesUniformChanged) Q_PROPERTY(float barThickness READ barThickness WRITE setBarThickness NOTIFY barThicknessChanged) Q_PROPERTY(QSizeF barSpacing READ barSpacing WRITE setBarSpacing NOTIFY barSpacingChanged) Q_PROPERTY(bool barSpacingRelative READ isBarSpacingRelative WRITE setBarSpacingRelative NOTIFY barSpacingRelativeChanged) @@ -53,6 +54,9 @@ public: void insertSeries(int index, QBar3DSeries *series); QList<QBar3DSeries *> seriesList(); + void setMultiSeriesUniform(bool uniform); + bool isMultiSeriesUniform() const; + void setBarThickness(float thicknessRatio); float barThickness(); @@ -73,6 +77,7 @@ public: QList<QAbstract3DAxis *> axes() const; signals: + void multiSeriesUniformChanged(bool uniform); void barThicknessChanged(float thicknessRatio); void barSpacingChanged(QSizeF spacing); void barSpacingRelativeChanged(bool relative); diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp index 74d60138..b690a6b7 100644 --- a/src/datavisualizationqml2/declarativebars.cpp +++ b/src/datavisualizationqml2/declarativebars.cpp @@ -72,6 +72,19 @@ void DeclarativeBars::setColumnAxis(QCategory3DAxis *axis) m_barsController->setAxisX(axis); } +void DeclarativeBars::setMultiSeriesUniform(bool uniform) +{ + if (uniform != isMultiSeriesUniform()) { + m_barsController->setMultiSeriesScaling(uniform); + emit multiSeriesUniformChanged(uniform); + } +} + +bool DeclarativeBars::isMultiSeriesUniform() const +{ + return m_barsController->multiSeriesScaling(); +} + void DeclarativeBars::setBarThickness(float thicknessRatio) { if (thicknessRatio != barThickness()) { diff --git a/src/datavisualizationqml2/declarativebars_p.h b/src/datavisualizationqml2/declarativebars_p.h index 43b619f1..d4616eb3 100644 --- a/src/datavisualizationqml2/declarativebars_p.h +++ b/src/datavisualizationqml2/declarativebars_p.h @@ -51,6 +51,7 @@ class DeclarativeBars : public AbstractDeclarative Q_PROPERTY(QCategory3DAxis *rowAxis READ rowAxis WRITE setRowAxis NOTIFY rowAxisChanged) Q_PROPERTY(QValue3DAxis *valueAxis READ valueAxis WRITE setValueAxis NOTIFY valueAxisChanged) Q_PROPERTY(QCategory3DAxis *columnAxis READ columnAxis WRITE setColumnAxis NOTIFY columnAxisChanged) + Q_PROPERTY(bool multiSeriesUniform READ isMultiSeriesUniform WRITE setMultiSeriesUniform NOTIFY multiSeriesUniformChanged) Q_PROPERTY(float barThickness READ barThickness WRITE setBarThickness NOTIFY barThicknessChanged) Q_PROPERTY(QSizeF barSpacing READ barSpacing WRITE setBarSpacing NOTIFY barSpacingChanged) Q_PROPERTY(bool barSpacingRelative READ isBarSpacingRelative WRITE setBarSpacingRelative NOTIFY barSpacingRelativeChanged) @@ -69,6 +70,9 @@ public: QCategory3DAxis *columnAxis() const; void setColumnAxis(QCategory3DAxis *axis); + void setMultiSeriesUniform(bool uniform); + bool isMultiSeriesUniform() const; + void setBarThickness(float thicknessRatio); float barThickness() const; @@ -98,6 +102,7 @@ signals: void rowAxisChanged(QCategory3DAxis *axis); void valueAxisChanged(QValue3DAxis *axis); void columnAxisChanged(QCategory3DAxis *axis); + void multiSeriesUniformChanged(bool uniform); void barThicknessChanged(float thicknessRatio); void barSpacingChanged(QSizeF spacing); void barSpacingRelativeChanged(bool relative); |