diff options
author | Sami Varanka <sami.varanka@qt.io> | 2021-08-18 14:33:26 +0300 |
---|---|---|
committer | Sami Varanka <sami.varanka@qt.io> | 2021-08-24 07:25:12 +0000 |
commit | d01fa6654f9b3d5ae4b542a85f10277318cfebd4 (patch) | |
tree | ceb71e9903b00181cca3623d77758544182b12d5 /src/datavisualization | |
parent | 6248cca3f2a801b27059ffc0a720db1686832f41 (diff) |
Add: Margin between series columns in Bars3D
Added a new property to Bars3D. The property
controls the margin between the columns of
series. It can be used to show bars belonging
to same column, but different series
side by side. Also added autotest for qml and
cpp.
Fixes: QTBUG-69036
Change-Id: I3c353e9097a8be8cafc05f8f5120e4266baa4a5c
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/datavisualization')
-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 |
7 files changed, 96 insertions, 6 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); |