diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc | 8 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller.cpp | 18 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller_p.h | 8 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer.cpp | 33 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer_p.h | 3 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.cpp | 27 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.h | 5 | ||||
-rw-r--r-- | src/datavisualizationqml/declarativebars.cpp | 15 | ||||
-rw-r--r-- | src/datavisualizationqml/declarativebars_p.h | 7 |
9 files changed, 116 insertions, 8 deletions
diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc index 9fd5107c..0a18a912 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc @@ -108,6 +108,14 @@ */ /*! + * \qmlproperty size Bars3D::barSeriesMargin + * \since 6.3 + * + * Margin between series columns in X and Z dimensions. Preset to \c {(0.0, 0.0)} by default. + * Sensible values are on the range [0,1). + */ + +/*! * \qmlproperty Bar3DSeries Bars3D::selectedSeries * The selected series or \c null. If \l {QAbstract3DGraph::selectionMode}{selectionMode} has * the \c SelectionMultiSeries flag set, this property holds the series that diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 2a007360..74ea1076 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -49,6 +49,7 @@ Bars3DController::Bars3DController(QRect boundRect, Q3DScene *scene) m_barThicknessRatio(1.0f), m_barSpacing(QSizeF(1.0, 1.0)), m_floorLevel(0.0f), + m_barSeriesMargin(0.0f, 0.0f), m_renderer(0) { // Setting a null axis creates a new default axis according to orientation and graph type. @@ -108,6 +109,11 @@ void Bars3DController::synchDataToRenderer() m_changeTracker.floorLevelChanged = false; } + if (m_changeTracker.barSeriesMarginChanged) { + m_renderer->updateBarSeriesMargin(m_barSeriesMargin); + m_changeTracker.barSeriesMarginChanged = false; + } + Abstract3DController::synchDataToRenderer(); // Notify changes to renderer @@ -510,6 +516,18 @@ QSizeF Bars3DController::barSpacing() return m_barSpacing; } +void Bars3DController::setBarSeriesMargin(const QSizeF &margin) +{ + m_barSeriesMargin = margin; + m_changeTracker.barSeriesMarginChanged = true; + emitNeedRender(); +} + +QSizeF Bars3DController::barSeriesMargin() +{ + return m_barSeriesMargin; +} + bool Bars3DController::isBarSpecRelative() { return m_isBarSpecRelative; diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h index e57263a1..3662b43c 100644 --- a/src/datavisualization/engine/bars3dcontroller_p.h +++ b/src/datavisualization/engine/bars3dcontroller_p.h @@ -55,6 +55,7 @@ struct Bars3DChangeBitField { bool rowsChanged : 1; bool itemChanged : 1; bool floorLevelChanged : 1; + bool barSeriesMarginChanged : 1; Bars3DChangeBitField() : multiSeriesScalingChanged(true), @@ -62,7 +63,8 @@ struct Bars3DChangeBitField { selectedBarChanged(true), rowsChanged(false), itemChanged(false), - floorLevelChanged(false) + floorLevelChanged(false), + barSeriesMarginChanged(false) { } }; @@ -98,6 +100,7 @@ private: GLfloat m_barThicknessRatio; QSizeF m_barSpacing; float m_floorLevel; + QSizeF m_barSeriesMargin; // Rendering Bars3DRenderer *m_renderer; @@ -118,6 +121,9 @@ public: void setBarSpecs(GLfloat thicknessRatio = 1.0f, const QSizeF &spacing = QSizeF(1.0, 1.0), bool relative = true); + void setBarSeriesMargin(const QSizeF &margin); + QSizeF barSeriesMargin(); + GLfloat barThickness(); QSizeF barSpacing(); bool isBarSpecRelative(); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 3f36f8d1..0c51d187 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -49,6 +49,7 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_cachedIsSlicingActivated(false), m_cachedRowCount(0), m_cachedColumnCount(0), + m_cachedBarSeriesMargin(0.0f, 0.0f), m_selectedBar(0), m_sliceCache(0), m_sliceTitleItem(0), @@ -198,7 +199,8 @@ void Bars3DRenderer::updateData() m_seriesScaleX = 1.0f / float(m_visibleSeriesCount); m_seriesStep = 1.0f / float(m_visibleSeriesCount); - m_seriesStart = -((float(m_visibleSeriesCount) - 1.0f) / 2.0f) * m_seriesStep; + m_seriesStart = -((float(m_visibleSeriesCount) - 1.0f) / 2.0f) + * (m_seriesStep - (m_seriesStep * m_cachedBarSeriesMargin.width())); if (m_keepSeriesUniform) m_seriesScaleZ = m_seriesScaleX; @@ -1077,7 +1079,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) foreach (SeriesRenderCache *baseCache, m_renderCacheList) { if (baseCache->isVisible()) { BarSeriesRenderCache *cache = static_cast<BarSeriesRenderCache *>(baseCache); - float seriesPos = m_seriesStart + m_seriesStep * cache->visualIndex() + 0.5f; + float seriesPos = m_seriesStart + m_seriesStep + * (cache->visualIndex() - (cache->visualIndex() + * m_cachedBarSeriesMargin.width())) + 0.5f; ObjectHelper *barObj = cache->object(); QQuaternion seriesRotation(cache->meshRotation()); const BarRenderItemArray &renderArray = cache->renderArray(); @@ -1199,7 +1203,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) foreach (SeriesRenderCache *baseCache, m_renderCacheList) { if (baseCache->isVisible()) { BarSeriesRenderCache *cache = static_cast<BarSeriesRenderCache *>(baseCache); - float seriesPos = m_seriesStart + m_seriesStep * cache->visualIndex() + 0.5f; + float seriesPos = m_seriesStart + m_seriesStep + * (cache->visualIndex() - (cache->visualIndex() + * m_cachedBarSeriesMargin.width())) + 0.5f; ObjectHelper *barObj = cache->object(); QQuaternion seriesRotation(cache->meshRotation()); const BarRenderItemArray &renderArray = cache->renderArray(); @@ -1459,7 +1465,9 @@ bool Bars3DRenderer::drawBars(BarRenderItem **selectedBar, foreach (SeriesRenderCache *baseCache, m_renderCacheList) { if (baseCache->isVisible()) { BarSeriesRenderCache *cache = static_cast<BarSeriesRenderCache *>(baseCache); - float seriesPos = m_seriesStart + m_seriesStep * cache->visualIndex() + 0.5f; + float seriesPos = m_seriesStart + m_seriesStep + * (cache->visualIndex() - (cache->visualIndex() + * m_cachedBarSeriesMargin.width())) + 0.5f; ObjectHelper *barObj = cache->object(); QQuaternion seriesRotation(cache->meshRotation()); Q3DTheme::ColorStyle colorStyle = cache->colorStyle(); @@ -2464,6 +2472,13 @@ void Bars3DRenderer::updateBarSpecs(GLfloat thicknessRatio, const QSizeF &spacin calculateSceneScalingFactors(); } +void Bars3DRenderer::updateBarSeriesMargin(const QSizeF &margin) +{ + m_cachedBarSeriesMargin = margin; + calculateSeriesStartPosition(); + calculateSceneScalingFactors(); +} + void Bars3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min, float max) { @@ -2596,6 +2611,10 @@ void Bars3DRenderer::calculateSceneScalingFactors() m_scaleX = m_cachedBarThickness.width() / m_scaleFactor; m_scaleZ = m_cachedBarThickness.height() / m_scaleFactor; + // Adjust scaling according to margin + m_scaleX -= m_scaleX * m_cachedBarSeriesMargin.width(); + m_scaleZ -= m_scaleZ * m_cachedBarSeriesMargin.height(); + // Whole graph scale factors m_xScaleFactor = m_rowWidth / m_scaleFactor; m_zScaleFactor = m_columnDepth / m_scaleFactor; @@ -2659,6 +2678,12 @@ void Bars3DRenderer::calculateHeightAdjustment() } } +void Bars3DRenderer::calculateSeriesStartPosition() +{ + m_seriesStart = -((float(m_visibleSeriesCount) - 1.0f) / 2.0f) + * (m_seriesStep - (m_seriesStep * m_cachedBarSeriesMargin.width())); +} + Bars3DController::SelectionType Bars3DRenderer::isSelected(int row, int bar, const BarSeriesRenderCache *cache) { diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 6c96c3e2..9f7e7c1d 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -68,6 +68,7 @@ private: bool m_cachedIsSlicingActivated; int m_cachedRowCount; int m_cachedColumnCount; + QSizeF m_cachedBarSeriesMargin; // Internal state BarRenderItem *m_selectedBar; // points to renderitem array @@ -144,6 +145,7 @@ public Q_SLOTS: void updateBarSpecs(GLfloat thicknessRatio = 1.0f, const QSizeF &spacing = QSizeF(1.0, 1.0), bool relative = true); + void updateBarSeriesMargin(const QSizeF &margin); void updateSlicingActive(bool isSlicing); void updateSelectedBar(const QPoint &position, QBar3DSeries *series); inline QPoint clickedPosition() const { return m_clickedPosition; } @@ -186,6 +188,7 @@ private: void updateDepthBuffer() override; void calculateSceneScalingFactors(); void calculateHeightAdjustment(); + void calculateSeriesStartPosition(); Abstract3DController::SelectionType isSelected(int row, int bar, const BarSeriesRenderCache *cache); QPoint selectionColorToArrayPosition(const QVector4D &selectionColor); diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index 53519a4d..ccc8edd5 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -247,7 +247,7 @@ float Q3DBars::barThickness() const * Preset to \c {(1.0, 1.0)} by default. Spacing is affected by the * barSpacingRelative property. * - * \sa barSpacingRelative, multiSeriesUniform + * \sa barSpacingRelative, multiSeriesUniform, barSeriesMargin */ void Q3DBars::setBarSpacing(const QSizeF &spacing) { @@ -285,6 +285,31 @@ bool Q3DBars::isBarSpacingRelative() const } /*! + * \property Q3DBars::barSeriesMargin + * \since 6.3 + * + * \brief Margin between series columns in X and Z dimensions. + * Sensible values are on the range [0,1). + * + * Preset to \c {(0.0, 0.0)} by default. This property enables + * showing bars from different series side by side, but with space between columns. + * + * \sa barSpacing + */ +void Q3DBars::setBarSeriesMargin(const QSizeF &margin) +{ + if (margin != barSeriesMargin()) { + dptr()->m_shared->setBarSeriesMargin(margin); + emit barSeriesMarginChanged(margin); + } +} + +QSizeF Q3DBars::barSeriesMargin() const +{ + return dptrc()->m_shared->barSeriesMargin(); +} + +/*! * \property Q3DBars::rowAxis * * \brief The axis attached to the active row. diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h index 5b782931..cc4e6634 100644 --- a/src/datavisualization/engine/q3dbars.h +++ b/src/datavisualization/engine/q3dbars.h @@ -46,6 +46,7 @@ class QT_DATAVISUALIZATION_EXPORT Q3DBars : public QAbstract3DGraph 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) + Q_PROPERTY(QSizeF barSeriesMargin READ barSeriesMargin WRITE setBarSeriesMargin NOTIFY barSeriesMarginChanged REVISION(6, 3)) Q_PROPERTY(QCategory3DAxis *rowAxis READ rowAxis WRITE setRowAxis NOTIFY rowAxisChanged) Q_PROPERTY(QCategory3DAxis *columnAxis READ columnAxis WRITE setColumnAxis NOTIFY columnAxisChanged) Q_PROPERTY(QValue3DAxis *valueAxis READ valueAxis WRITE setValueAxis NOTIFY valueAxisChanged) @@ -76,6 +77,9 @@ public: void setBarSpacingRelative(bool relative); bool isBarSpacingRelative() const; + void setBarSeriesMargin(const QSizeF &margin); + QSizeF barSeriesMargin() const; + void setRowAxis(QCategory3DAxis *axis); QCategory3DAxis *rowAxis() const; void setColumnAxis(QCategory3DAxis *axis); @@ -95,6 +99,7 @@ Q_SIGNALS: void barThicknessChanged(float thicknessRatio); void barSpacingChanged(const QSizeF &spacing); void barSpacingRelativeChanged(bool relative); + Q_REVISION(6, 3) void barSeriesMarginChanged(const QSizeF &margin); void rowAxisChanged(QCategory3DAxis *axis); void columnAxisChanged(QCategory3DAxis *axis); void valueAxisChanged(QValue3DAxis *axis); diff --git a/src/datavisualizationqml/declarativebars.cpp b/src/datavisualizationqml/declarativebars.cpp index fe90e159..59d64f4e 100644 --- a/src/datavisualizationqml/declarativebars.cpp +++ b/src/datavisualizationqml/declarativebars.cpp @@ -112,7 +112,7 @@ float DeclarativeBars::barThickness() const return m_barsController->barThickness(); } -void DeclarativeBars::setBarSpacing(QSizeF spacing) +void DeclarativeBars::setBarSpacing(const QSizeF &spacing) { if (spacing != barSpacing()) { m_barsController->setBarSpecs(GLfloat(barThickness()), spacing, isBarSpacingRelative()); @@ -138,6 +138,19 @@ bool DeclarativeBars::isBarSpacingRelative() const return m_barsController->isBarSpecRelative(); } +void DeclarativeBars::setBarSeriesMargin(const QSizeF &margin) +{ + if (margin != barSeriesMargin()) { + m_barsController->setBarSeriesMargin(margin); + emit barSeriesMarginChanged(barSeriesMargin()); + } +} + +QSizeF DeclarativeBars::barSeriesMargin() const +{ + return m_barsController->barSeriesMargin(); +} + QBar3DSeries *DeclarativeBars::selectedSeries() const { return m_barsController->selectedSeries(); diff --git a/src/datavisualizationqml/declarativebars_p.h b/src/datavisualizationqml/declarativebars_p.h index acf1a030..d63eafc1 100644 --- a/src/datavisualizationqml/declarativebars_p.h +++ b/src/datavisualizationqml/declarativebars_p.h @@ -56,6 +56,7 @@ class DeclarativeBars : public AbstractDeclarative 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) + Q_PROPERTY(QSizeF barSeriesMargin READ barSeriesMargin WRITE setBarSeriesMargin NOTIFY barSeriesMarginChanged REVISION(6, 3)) Q_PROPERTY(QQmlListProperty<QBar3DSeries> seriesList READ seriesList) Q_PROPERTY(QBar3DSeries *selectedSeries READ selectedSeries NOTIFY selectedSeriesChanged) Q_PROPERTY(QBar3DSeries *primarySeries READ primarySeries WRITE setPrimarySeries NOTIFY primarySeriesChanged) @@ -82,12 +83,15 @@ public: void setBarThickness(float thicknessRatio); float barThickness() const; - void setBarSpacing(QSizeF spacing); + void setBarSpacing(const QSizeF &spacing); QSizeF barSpacing() const; void setBarSpacingRelative(bool relative); bool isBarSpacingRelative() const; + void setBarSeriesMargin(const QSizeF &margin); + QSizeF barSeriesMargin() const; + QQmlListProperty<QBar3DSeries> seriesList(); static void appendSeriesFunc(QQmlListProperty<QBar3DSeries> *list, QBar3DSeries *series); static qsizetype countSeriesFunc(QQmlListProperty<QBar3DSeries> *list); @@ -116,6 +120,7 @@ Q_SIGNALS: void barThicknessChanged(float thicknessRatio); void barSpacingChanged(QSizeF spacing); void barSpacingRelativeChanged(bool relative); + Q_REVISION(6, 3) void barSeriesMarginChanged(QSizeF margin); void meshFileNameChanged(QString filename); void primarySeriesChanged(QBar3DSeries *series); void selectedSeriesChanged(QBar3DSeries *series); |