summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2014-01-24 08:26:09 +0200
committerTomi Korpipää <tomi.korpipaa@digia.com>2014-01-24 08:27:55 +0200
commit8802cf50ef296ce8cc56a2ba97fa237237f62d15 (patch)
treefafd0f2fb8a99b13ccfb85128f547668c9240c31 /src
parentf5a67847b72cf372f076657405769b024d5f6756 (diff)
Multiseries bars uniform scaling support added
Task-number: QTRD-2805 Change-Id: I7172662b2bed0a222ceb7560718450bcabd2879d Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc6
-rw-r--r--src/datavisualization/engine/bars3dcontroller.cpp18
-rw-r--r--src/datavisualization/engine/bars3dcontroller_p.h12
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp45
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h5
-rw-r--r--src/datavisualization/engine/q3dbars.cpp22
-rw-r--r--src/datavisualization/engine/q3dbars.h5
-rw-r--r--src/datavisualizationqml2/declarativebars.cpp13
-rw-r--r--src/datavisualizationqml2/declarativebars_p.h5
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);