diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-01-24 08:26:09 +0200 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-01-24 08:27:55 +0200 |
commit | 8802cf50ef296ce8cc56a2ba97fa237237f62d15 (patch) | |
tree | fafd0f2fb8a99b13ccfb85128f547668c9240c31 | |
parent | f5a67847b72cf372f076657405769b024d5f6756 (diff) |
Multiseries bars uniform scaling support added
Task-number: QTRD-2805
Change-Id: I7172662b2bed0a222ceb7560718450bcabd2879d
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
-rw-r--r-- | examples/bars/graphmodifier.cpp | 8 | ||||
-rw-r--r-- | examples/qmlbars/qml/qmlbars/main.qml | 16 | ||||
-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 | ||||
-rw-r--r-- | tests/barstest/chart.cpp | 5 | ||||
-rw-r--r-- | tests/barstest/chart.h | 1 | ||||
-rw-r--r-- | tests/barstest/main.cpp | 6 |
14 files changed, 135 insertions, 32 deletions
diff --git a/examples/bars/graphmodifier.cpp b/examples/bars/graphmodifier.cpp index 1b84ae7b..4a50c77d 100644 --- a/examples/bars/graphmodifier.cpp +++ b/examples/bars/graphmodifier.cpp @@ -56,6 +56,7 @@ GraphModifier::GraphModifier(Q3DBars *bargraph) m_graph->activeTheme()->setBackgroundEnabled(false); m_graph->activeTheme()->setFont(QFont("Times New Roman", m_fontSize)); m_graph->activeTheme()->setLabelBackgroundEnabled(true); + m_graph->setMultiSeriesUniform(true); //! [2] m_months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December"; @@ -266,11 +267,4 @@ void GraphModifier::setSmoothBars(int smooth) void GraphModifier::setSeriesVisibility(int enabled) { m_secondarySeries->setVisible(bool(enabled)); - if (enabled) { - m_graph->setBarThickness(2.0f); - m_graph->setBarSpacing(QSizeF(1.0, 3.0)); - } else { - m_graph->setBarThickness(1.0f); - m_graph->setBarSpacing(QSizeF(1.0, 1.0)); - } } diff --git a/examples/qmlbars/qml/qmlbars/main.qml b/examples/qmlbars/qml/qmlbars/main.qml index d5f7fd34..faa10c5f 100644 --- a/examples/qmlbars/qml/qmlbars/main.qml +++ b/examples/qmlbars/qml/qmlbars/main.qml @@ -76,7 +76,7 @@ Item { anchors.bottom: mainview.bottom Bars3D { - id: testGraph + id: barGraph width: dataView.width height: dataView.height shadowQuality: AbstractGraph3D.ShadowQualityMedium @@ -189,7 +189,7 @@ Item { clip: true //! [1] onClicked: { - if (testGraph.rowAxis.max !== 6) { + if (barGraph.rowAxis.max !== 6) { text = "Show 2010 - 2012" modelProxy.autoRowCategories = true secondaryProxy.autoRowCategories = true @@ -213,11 +213,11 @@ Item { text: "Hide Shadows" clip: true onClicked: { - if (testGraph.shadowQuality == AbstractGraph3D.ShadowQualityNone) { - testGraph.shadowQuality = AbstractGraph3D.ShadowQualityMedium; + if (barGraph.shadowQuality == AbstractGraph3D.ShadowQualityNone) { + barGraph.shadowQuality = AbstractGraph3D.ShadowQualityMedium; text = "Hide Shadows" } else { - testGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone; + barGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone; text = "Show Shadows" } } @@ -233,17 +233,17 @@ Item { onClicked: { if (!secondarySeries.visible) { text = "Show Both" - testGraph.valueAxis = graphAxes.expenses + barGraph.valueAxis = graphAxes.expenses barSeries.visible = false secondarySeries.visible = true } else if (!barSeries.visible){ barSeries.visible = true text = "Show Income" - testGraph.valueAxis = graphAxes.income + barGraph.valueAxis = graphAxes.income } else { secondarySeries.visible = false text = "Show Expenses" - testGraph.valueAxis = graphAxes.income + barGraph.valueAxis = graphAxes.income } } //! [0] 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); diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index abbf2a59..6b0345ad 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -1223,3 +1223,8 @@ void GraphModifier::setGradient() m_graph->activeTheme()->setColorStyle(Q3DTheme::ColorStyleObjectGradient); } + +void GraphModifier::toggleMultiseriesScaling() +{ + m_graph->setMultiSeriesUniform(!m_graph->isMultiSeriesUniform()); +} diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h index 425af521..8e3271cc 100644 --- a/tests/barstest/chart.h +++ b/tests/barstest/chart.h @@ -88,6 +88,7 @@ public: public slots: void flipViews(); void setGradient(); + void toggleMultiseriesScaling(); void changeShadowQuality(int quality); void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality); void handleSelectionChange(const QPoint &position); diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp index a0e1bfc3..52d79468 100644 --- a/tests/barstest/main.cpp +++ b/tests/barstest/main.cpp @@ -110,6 +110,9 @@ int main(int argc, char **argv) QPushButton *labelButton = new QPushButton(widget); labelButton->setText(QStringLiteral("Change label style")); + QPushButton *multiScaleButton = new QPushButton(widget); + multiScaleButton->setText(QStringLiteral("Change multiseries scaling")); + QPushButton *styleButton = new QPushButton(widget); styleButton->setText(QStringLiteral("Change bar style")); @@ -292,6 +295,7 @@ int main(int argc, char **argv) vLayout->addWidget(showFiveSeriesButton, 0, Qt::AlignTop); vLayout->addWidget(themeButton, 0, Qt::AlignTop); vLayout->addWidget(labelButton, 0, Qt::AlignTop); + vLayout->addWidget(multiScaleButton, 0, Qt::AlignTop); vLayout->addWidget(styleButton, 0, Qt::AlignTop); vLayout->addWidget(cameraButton, 0, Qt::AlignTop); vLayout->addWidget(selectionButton, 0, Qt::AlignTop); @@ -367,6 +371,8 @@ int main(int argc, char **argv) QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier, &GraphModifier::changeFontSize); + QObject::connect(multiScaleButton, &QPushButton::clicked, modifier, + &GraphModifier::toggleMultiseriesScaling); QObject::connect(styleButton, &QPushButton::clicked, modifier, &GraphModifier::changeStyle); QObject::connect(cameraButton, &QPushButton::clicked, modifier, &GraphModifier::changePresetCamera); |