diff options
author | Sami Varanka <sami.varanka@qt.io> | 2021-09-29 14:53:35 +0300 |
---|---|---|
committer | Sami Varanka <sami.varanka@qt.io> | 2021-10-08 13:47:25 +0300 |
commit | 6d31e42632f0779212b2a265f3c9a7c97a0e63b0 (patch) | |
tree | aa59e7a7d845c8f5bb44f5690b8c08764975736a /src | |
parent | 9f9d5bc9d45ea99726cc23b5552cce19918771b9 (diff) |
Add row colors for Bar3DSeries
Added rowColors property for Bar3DSeries.
The property can be used draw the individual
rows in the series in different colors.
Autotests and a manualtest for the property were
added also.
Fixes: QTBUG-96682
Change-Id: I5c4f778189d079206500a9289490792584eab2b9
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/datavisualization/data/qbar3dseries.cpp | 43 | ||||
-rw-r--r-- | src/datavisualization/data/qbar3dseries.h | 5 | ||||
-rw-r--r-- | src/datavisualization/data/qbar3dseries_p.h | 4 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller.cpp | 5 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller_p.h | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer.cpp | 13 | ||||
-rw-r--r-- | src/datavisualizationqml/declarativeseries.cpp | 101 | ||||
-rw-r--r-- | src/datavisualizationqml/declarativeseries_p.h | 19 |
8 files changed, 187 insertions, 4 deletions
diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp index afc3b3ba..1cd4c754 100644 --- a/src/datavisualization/data/qbar3dseries.cpp +++ b/src/datavisualization/data/qbar3dseries.cpp @@ -147,6 +147,18 @@ QT_BEGIN_NAMESPACE */ /*! + * \qmlproperty list<ThemeColor> Bar3DSeries::rowColors + * \since 6.3 + * This property can be used to draw the rows of the series in different colors. + * The \l{Theme3D::colorStyle}{Theme3D.colorStyle} must be set to + * \c ColorStyleUniform to use this property. + * \note If the property is set and the theme is changed, + * the rowColors list is not cleared automatically. + * + * \sa Q3DTheme::ColorStyleUniform + */ + +/*! * Constructsa bar 3D series with the parent \a parent. */ QBar3DSeries::QBar3DSeries(QObject *parent) : @@ -282,6 +294,27 @@ float QBar3DSeries::meshAngle() const } /*! + * \property QBar3DSeries::rowColors + * \since 6.3 + * + * \brief The list of row colors in the series. + * + * This property can be used to color + * the rows of the series in different colors. + * The Q3DTheme::ColorStyle must be set to + * Q3DTheme::ColorStyleUniform to use this property. + * + * \sa Q3DTheme::ColorStyleUniform + */ +void QBar3DSeries::setRowColors(const QList<QColor> &colors) +{ + dptr()->setRowColors(colors); +} +QList<QColor> QBar3DSeries::rowColors() const +{ + return dptrc()->m_rowColors; +} +/*! * \internal */ QBar3DSeriesPrivate *QBar3DSeries::dptr() @@ -355,6 +388,8 @@ void QBar3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newCon &Bars3DController::handleDataColumnLabelsChanged); QObject::connect(qptr(), &QBar3DSeries::dataProxyChanged, controller, &Bars3DController::handleArrayReset); + QObject::connect(qptr(), &QBar3DSeries::rowColorsChanged, controller, + &Bars3DController::handleRowColorsChanged); } } @@ -432,4 +467,12 @@ void QBar3DSeriesPrivate::connectSignals() &QBar3DSeriesPrivate::handleMeshRotationChanged); } +void QBar3DSeriesPrivate::setRowColors(const QList<QColor> &colors) +{ + if (m_rowColors != colors) { + m_rowColors = colors; + emit qptr()->rowColorsChanged(m_rowColors); + } +} + QT_END_NAMESPACE diff --git a/src/datavisualization/data/qbar3dseries.h b/src/datavisualization/data/qbar3dseries.h index 99fbad77..a174f0f5 100644 --- a/src/datavisualization/data/qbar3dseries.h +++ b/src/datavisualization/data/qbar3dseries.h @@ -44,6 +44,7 @@ class Q_DATAVISUALIZATION_EXPORT QBar3DSeries : public QAbstract3DSeries Q_PROPERTY(QBarDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged) Q_PROPERTY(QPoint selectedBar READ selectedBar WRITE setSelectedBar NOTIFY selectedBarChanged) Q_PROPERTY(float meshAngle READ meshAngle WRITE setMeshAngle NOTIFY meshAngleChanged) + Q_PROPERTY(QList<QColor> rowColors READ rowColors WRITE setRowColors NOTIFY rowColorsChanged REVISION(6, 3)) public: explicit QBar3DSeries(QObject *parent = nullptr); @@ -60,10 +61,14 @@ public: void setMeshAngle(float angle); float meshAngle() const; + QList<QColor> rowColors() const; + void setRowColors(const QList<QColor> &colors); + Q_SIGNALS: void dataProxyChanged(QBarDataProxy *proxy); void selectedBarChanged(const QPoint &position); void meshAngleChanged(float angle); + Q_REVISION(6, 3) void rowColorsChanged(const QList<QColor> &rowcolors); protected: QBar3DSeriesPrivate *dptr(); diff --git a/src/datavisualization/data/qbar3dseries_p.h b/src/datavisualization/data/qbar3dseries_p.h index 0f5bb43a..cd94b7f4 100644 --- a/src/datavisualization/data/qbar3dseries_p.h +++ b/src/datavisualization/data/qbar3dseries_p.h @@ -62,11 +62,15 @@ public: void connectSignals(); + void setRowColors(const QList<QColor> &colors); + private: QBar3DSeries *qptr(); QPoint m_selectedBar; + QList<QColor> m_rowColors; + private: friend class QBar3DSeries; }; diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 74ea1076..b5910c8e 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -328,6 +328,11 @@ void Bars3DController::handleDataColumnLabelsChanged() } } +void Bars3DController::handleRowColorsChanged() +{ + emitNeedRender(); +} + void Bars3DController::handleAxisAutoAdjustRangeChangedInOrientation( QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust) { diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h index 818eea4f..fb028e92 100644 --- a/src/datavisualization/engine/bars3dcontroller_p.h +++ b/src/datavisualization/engine/bars3dcontroller_p.h @@ -165,6 +165,7 @@ public Q_SLOTS: void handleItemChanged(int rowIndex, int columnIndex); void handleDataRowLabelsChanged(); void handleDataColumnLabelsChanged(); + void handleRowColorsChanged(); Q_SIGNALS: void primarySeriesChanged(QBar3DSeries *series); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 0c51d187..a0c58b45 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -1628,10 +1628,17 @@ bool Bars3DRenderer::drawBars(BarRenderItem **selectedBar, } case Bars3DController::SelectionNone: { // Current bar is not selected, nor on a row or column - if (colorStyleIsUniform) - barColor = baseColor; - else + if (colorStyleIsUniform) { + QList<QColor> rowColors = cache->series()->rowColors(); + if (rowColors.size() == 0) { + barColor = baseColor; + } else { + int rowColorIndex = row % rowColors.size(); + barColor = Utils::vectorFromColor(rowColors[rowColorIndex]); + } + } else { gradientTexture = cache->baseGradientTexture(); + } break; } } diff --git a/src/datavisualizationqml/declarativeseries.cpp b/src/datavisualizationqml/declarativeseries.cpp index 38263a32..2afa3450 100644 --- a/src/datavisualizationqml/declarativeseries.cpp +++ b/src/datavisualizationqml/declarativeseries.cpp @@ -103,7 +103,8 @@ DeclarativeBar3DSeries::DeclarativeBar3DSeries(QObject *parent) : QBar3DSeries(parent), m_baseGradient(0), m_singleHighlightGradient(0), - m_multiHighlightGradient(0) + m_multiHighlightGradient(0), + m_dummyColors(false) { QObject::connect(this, &QBar3DSeries::selectedBarChanged, this, &DeclarativeBar3DSeries::selectedBarChanged); @@ -171,6 +172,37 @@ ColorGradient *DeclarativeBar3DSeries::multiHighlightGradient() const return m_multiHighlightGradient; } +QQmlListProperty<DeclarativeColor> DeclarativeBar3DSeries::rowColors() +{ + return QQmlListProperty<DeclarativeColor>(this, this, + &DeclarativeBar3DSeries::appendRowColorsFunc, + &DeclarativeBar3DSeries::countRowColorsFunc, + &DeclarativeBar3DSeries::atRowColorsFunc, + &DeclarativeBar3DSeries::clearRowColorsFunc); +} + +void DeclarativeBar3DSeries::appendRowColorsFunc(QQmlListProperty<DeclarativeColor> *list, + DeclarativeColor *color) +{ + reinterpret_cast<DeclarativeBar3DSeries *>(list->data)->addColor(color); +} + +qsizetype DeclarativeBar3DSeries::countRowColorsFunc(QQmlListProperty<DeclarativeColor> *list) +{ + return reinterpret_cast<DeclarativeBar3DSeries *>(list->data)->colorList().count(); +} + +DeclarativeColor *DeclarativeBar3DSeries::atRowColorsFunc(QQmlListProperty<DeclarativeColor> *list, + qsizetype index) +{ + return reinterpret_cast<DeclarativeBar3DSeries *>(list->data)->colorList().at(index); +} + +void DeclarativeBar3DSeries::clearRowColorsFunc(QQmlListProperty<DeclarativeColor> *list) +{ + reinterpret_cast<DeclarativeBar3DSeries *>(list->data)->clearColors(); +} + void DeclarativeBar3DSeries::handleBaseGradientUpdate() { if (m_baseGradient) @@ -189,6 +221,73 @@ void DeclarativeBar3DSeries::handleMultiHighlightGradientUpdate() setSeriesGradient(this, *m_multiHighlightGradient, GradientTypeMulti); } +void DeclarativeBar3DSeries::handleRowColorUpdate() +{ + int colorCount = m_rowColors.size(); + int changed = 0; + + DeclarativeColor *color = qobject_cast<DeclarativeColor*>(QObject::sender()); + for (int i = 0; i < colorCount; i++) { + if (color == m_rowColors.at(i)) { + changed = i; + break; + } + } + QList<QColor> list = QBar3DSeries::rowColors(); + list[changed] = m_rowColors.at(changed)->color(); + QBar3DSeries::setRowColors(list); +} + +void DeclarativeBar3DSeries::addColor(DeclarativeColor *color) +{ + if (!color) { + qWarning("Color is invalid, use ThemeColor"); + return; + } + clearDummyColors(); + m_rowColors.append(color); + connect(color, &DeclarativeColor::colorChanged, this, + &DeclarativeBar3DSeries::handleRowColorUpdate); + QList<QColor> list = QBar3DSeries::rowColors(); + list.append(color->color()); + QBar3DSeries::setRowColors(list); +} + +QList<DeclarativeColor *> DeclarativeBar3DSeries::colorList() +{ + if (m_rowColors.isEmpty()) { + m_dummyColors = true; + const QList<QColor> list = QBar3DSeries::rowColors(); + for (const QColor &item : list) { + DeclarativeColor *color = new DeclarativeColor(this); + color->setColor(item); + m_rowColors.append(color); + connect(color, &DeclarativeColor::colorChanged, this, + &DeclarativeBar3DSeries::handleRowColorUpdate); + } + } + return m_rowColors; +} + +void DeclarativeBar3DSeries::clearColors() +{ + clearDummyColors(); + for (const auto color : qAsConst(m_rowColors)) + disconnect(color, 0, this, 0); + + m_rowColors.clear(); + QBar3DSeries::setRowColors(QList<QColor>()); +} + +void DeclarativeBar3DSeries::clearDummyColors() +{ + if (m_dummyColors) { + qDeleteAll(m_rowColors); + m_rowColors.clear(); + m_dummyColors = false; + } +} + DeclarativeScatter3DSeries::DeclarativeScatter3DSeries(QObject *parent) : QScatter3DSeries(parent), m_baseGradient(0), diff --git a/src/datavisualizationqml/declarativeseries_p.h b/src/datavisualizationqml/declarativeseries_p.h index da45cb3f..3e1593d5 100644 --- a/src/datavisualizationqml/declarativeseries_p.h +++ b/src/datavisualizationqml/declarativeseries_p.h @@ -44,6 +44,7 @@ #include "qscatter3dseries.h" #include "qsurface3dseries.h" #include "colorgradient_p.h" +#include "declarativecolor_p.h" #include <private/datavisualizationglobal_p.h> #include <QtQml/qqml.h> @@ -68,6 +69,7 @@ class DeclarativeBar3DSeries : public QBar3DSeries Q_PROPERTY(ColorGradient *baseGradient READ baseGradient WRITE setBaseGradient NOTIFY baseGradientChanged) Q_PROPERTY(ColorGradient *singleHighlightGradient READ singleHighlightGradient WRITE setSingleHighlightGradient NOTIFY singleHighlightGradientChanged) Q_PROPERTY(ColorGradient *multiHighlightGradient READ multiHighlightGradient WRITE setMultiHighlightGradient NOTIFY multiHighlightGradientChanged) + Q_PROPERTY(QQmlListProperty<DeclarativeColor> rowColors READ rowColors REVISION(6, 3)) Q_CLASSINFO("DefaultProperty", "seriesChildren") QML_NAMED_ELEMENT(Bar3DSeries) @@ -91,10 +93,19 @@ public: void setMultiHighlightGradient(ColorGradient *gradient); ColorGradient *multiHighlightGradient() const; + QQmlListProperty<DeclarativeColor> rowColors(); + static void appendRowColorsFunc(QQmlListProperty<DeclarativeColor> *list, + DeclarativeColor *color); + static qsizetype countRowColorsFunc(QQmlListProperty<DeclarativeColor> *list); + static DeclarativeColor *atRowColorsFunc(QQmlListProperty<DeclarativeColor> *list, + qsizetype index); + static void clearRowColorsFunc(QQmlListProperty<DeclarativeColor> *list); + public Q_SLOTS: void handleBaseGradientUpdate(); void handleSingleHighlightGradientUpdate(); void handleMultiHighlightGradientUpdate(); + void handleRowColorUpdate(); Q_SIGNALS: void selectedBarChanged(const QPointF &position); @@ -106,6 +117,14 @@ private: ColorGradient *m_baseGradient; // Not owned ColorGradient *m_singleHighlightGradient; // Not owned ColorGradient *m_multiHighlightGradient; // Not owned + + QList<DeclarativeColor *> m_rowColors; + bool m_dummyColors; + + void addColor(DeclarativeColor *color); + QList<DeclarativeColor *> colorList(); + void clearColors(); + void clearDummyColors(); }; class DeclarativeScatter3DSeries : public QScatter3DSeries |