diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-12-09 10:49:49 +0200 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-12-10 09:01:45 +0200 |
commit | 3573055abe42ff283d011d8550bc8495156338a1 (patch) | |
tree | bb45d4f7e32a0c63329d9f52639081162b34e17e /src/datavisualizationqml2/declarativeseries.cpp | |
parent | 22557b312570cbefde584466a28f2b9bfcc570ba (diff) |
Move series specific visual elements to series, part 4
Colors to series
- Multiselection labels in bar slices still buggy
- Selection in bars doesn't work correctly if not all
series have items in that grid
Task-number: QTRD-2557
Change-Id: Icd38428e5337a26b8410476104bb1f1f784cdc7f
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualizationqml2/declarativeseries.cpp')
-rw-r--r-- | src/datavisualizationqml2/declarativeseries.cpp | 226 |
1 files changed, 223 insertions, 3 deletions
diff --git a/src/datavisualizationqml2/declarativeseries.cpp b/src/datavisualizationqml2/declarativeseries.cpp index 57610c1a..cb80cd5e 100644 --- a/src/datavisualizationqml2/declarativeseries.cpp +++ b/src/datavisualizationqml2/declarativeseries.cpp @@ -20,11 +20,81 @@ #include "qbardataproxy.h" #include "qscatterdataproxy.h" #include "qsurfacedataproxy.h" +#include <QMetaMethod> QT_DATAVISUALIZATION_BEGIN_NAMESPACE +static void setSeriesGradient(QAbstract3DSeries *series, const ColorGradient &gradient, GradientType type) +{ + QLinearGradient newGradient; + QGradientStops stops; + QList<ColorGradientStop *> qmlstops = gradient.m_stops; + + // Get sorted gradient stops + for (int i = 0; i < qmlstops.size(); i++) { + int j = 0; + while (j < stops.size() && stops.at(j).first < qmlstops[i]->position()) + j++; + stops.insert(j, QGradientStop(qmlstops.at(i)->position(), qmlstops.at(i)->color())); + } + + newGradient.setStops(stops); + switch (type) { + case GradientTypeBase: + series->setBaseGradient(newGradient); + break; + case GradientTypeSingle: + series->setSingleHighlightGradient(newGradient); + break; + case GradientTypeMulti: + series->setMultiHighlightGradient(newGradient); + break; + default: // Never goes here + break; + } +} + +static void connectSeriesGradient(QAbstract3DSeries *series, ColorGradient *newGradient, + GradientType type, ColorGradient **memberGradient) +{ + // connect new / disconnect old + if (newGradient != *memberGradient) { + if (*memberGradient) + QObject::disconnect(*memberGradient, 0, series, 0); + + *memberGradient = newGradient; + + int updatedIndex = newGradient->metaObject()->indexOfSignal("updated()"); + QMetaMethod updateFunction = newGradient->metaObject()->method(updatedIndex); + int handleIndex; + switch (type) { + case GradientTypeBase: + handleIndex = series->metaObject()->indexOfSlot("handleBaseGradientUpdate()"); + break; + case GradientTypeSingle: + handleIndex = series->metaObject()->indexOfSlot("handleSingleHighlightGradientUpdate()"); + break; + case GradientTypeMulti: + handleIndex = series->metaObject()->indexOfSlot("handleMultiHighlightGradientUpdate()"); + break; + default: // Never goes here + break; + } + QMetaMethod handleFunction = series->metaObject()->method(handleIndex); + + if (*memberGradient) + QObject::connect(*memberGradient, updateFunction, series, handleFunction); + } + + if (*memberGradient) + setSeriesGradient(series, **memberGradient, type); +} + DeclarativeBar3DSeries::DeclarativeBar3DSeries(QObject *parent) - : QBar3DSeries(parent) + : QBar3DSeries(parent), + m_baseGradient(0), + m_singleHighlightGradient(0), + m_multiHighlightGradient(0) { QObject::connect(this, &QBar3DSeries::selectedBarChanged, this, &DeclarativeBar3DSeries::selectedBarChanged); @@ -62,8 +132,59 @@ QPointF DeclarativeBar3DSeries::invalidSelectionPosition() const return QPointF(QBar3DSeries::invalidSelectionPosition()); } +void DeclarativeBar3DSeries::setBaseGradient(ColorGradient *gradient) +{ + connectSeriesGradient(this, gradient, GradientTypeBase, &m_baseGradient); +} + +ColorGradient *DeclarativeBar3DSeries::baseGradient() const +{ + return m_baseGradient; +} + +void DeclarativeBar3DSeries::setSingleHighlightGradient(ColorGradient *gradient) +{ + connectSeriesGradient(this, gradient, GradientTypeSingle, &m_singleHighlightGradient); +} + +ColorGradient *DeclarativeBar3DSeries::singleHighlightGradient() const +{ + return m_singleHighlightGradient; +} + +void DeclarativeBar3DSeries::setMultiHighlightGradient(ColorGradient *gradient) +{ + connectSeriesGradient(this, gradient, GradientTypeMulti, &m_multiHighlightGradient); +} + +ColorGradient *DeclarativeBar3DSeries::multiHighlightGradient() const +{ + return m_multiHighlightGradient; +} + +void DeclarativeBar3DSeries::handleBaseGradientUpdate() +{ + if (m_baseGradient) + setSeriesGradient(this, *m_baseGradient, GradientTypeBase); +} + +void DeclarativeBar3DSeries::handleSingleHighlightGradientUpdate() +{ + if (m_singleHighlightGradient) + setSeriesGradient(this, *m_singleHighlightGradient, GradientTypeSingle); +} + +void DeclarativeBar3DSeries::handleMultiHighlightGradientUpdate() +{ + if (m_multiHighlightGradient) + setSeriesGradient(this, *m_multiHighlightGradient, GradientTypeMulti); +} + DeclarativeScatter3DSeries::DeclarativeScatter3DSeries(QObject *parent) - : QScatter3DSeries(parent) + : QScatter3DSeries(parent), + m_baseGradient(0), + m_singleHighlightGradient(0), + m_multiHighlightGradient(0) { } @@ -84,8 +205,59 @@ void DeclarativeScatter3DSeries::appendSeriesChildren(QQmlListProperty<QObject> reinterpret_cast<DeclarativeScatter3DSeries *>(list->data)->setDataProxy(proxy); } +void DeclarativeScatter3DSeries::setBaseGradient(ColorGradient *gradient) +{ + connectSeriesGradient(this, gradient, GradientTypeBase, &m_baseGradient); +} + +ColorGradient *DeclarativeScatter3DSeries::baseGradient() const +{ + return m_baseGradient; +} + +void DeclarativeScatter3DSeries::setSingleHighlightGradient(ColorGradient *gradient) +{ + connectSeriesGradient(this, gradient, GradientTypeSingle, &m_singleHighlightGradient); +} + +ColorGradient *DeclarativeScatter3DSeries::singleHighlightGradient() const +{ + return m_singleHighlightGradient; +} + +void DeclarativeScatter3DSeries::setMultiHighlightGradient(ColorGradient *gradient) +{ + connectSeriesGradient(this, gradient, GradientTypeMulti, &m_multiHighlightGradient); +} + +ColorGradient *DeclarativeScatter3DSeries::multiHighlightGradient() const +{ + return m_multiHighlightGradient; +} + +void DeclarativeScatter3DSeries::handleBaseGradientUpdate() +{ + if (m_baseGradient) + setSeriesGradient(this, *m_baseGradient, GradientTypeBase); +} + +void DeclarativeScatter3DSeries::handleSingleHighlightGradientUpdate() +{ + if (m_singleHighlightGradient) + setSeriesGradient(this, *m_singleHighlightGradient, GradientTypeSingle); +} + +void DeclarativeScatter3DSeries::handleMultiHighlightGradientUpdate() +{ + if (m_multiHighlightGradient) + setSeriesGradient(this, *m_multiHighlightGradient, GradientTypeMulti); +} + DeclarativeSurface3DSeries::DeclarativeSurface3DSeries(QObject *parent) - : QSurface3DSeries(parent) + : QSurface3DSeries(parent), + m_baseGradient(0), + m_singleHighlightGradient(0), + m_multiHighlightGradient(0) { QObject::connect(this, &QSurface3DSeries::selectedPointChanged, this, &DeclarativeSurface3DSeries::selectedPointChanged); @@ -123,4 +295,52 @@ void DeclarativeSurface3DSeries::appendSeriesChildren(QQmlListProperty<QObject> reinterpret_cast<DeclarativeSurface3DSeries *>(list->data)->setDataProxy(proxy); } +void DeclarativeSurface3DSeries::setBaseGradient(ColorGradient *gradient) +{ + connectSeriesGradient(this, gradient, GradientTypeBase, &m_baseGradient); +} + +ColorGradient *DeclarativeSurface3DSeries::baseGradient() const +{ + return m_baseGradient; +} + +void DeclarativeSurface3DSeries::setSingleHighlightGradient(ColorGradient *gradient) +{ + connectSeriesGradient(this, gradient, GradientTypeSingle, &m_singleHighlightGradient); +} + +ColorGradient *DeclarativeSurface3DSeries::singleHighlightGradient() const +{ + return m_singleHighlightGradient; +} + +void DeclarativeSurface3DSeries::setMultiHighlightGradient(ColorGradient *gradient) +{ + connectSeriesGradient(this, gradient, GradientTypeMulti, &m_multiHighlightGradient); +} + +ColorGradient *DeclarativeSurface3DSeries::multiHighlightGradient() const +{ + return m_multiHighlightGradient; +} + +void DeclarativeSurface3DSeries::handleBaseGradientUpdate() +{ + if (m_baseGradient) + setSeriesGradient(this, *m_baseGradient, GradientTypeBase); +} + +void DeclarativeSurface3DSeries::handleSingleHighlightGradientUpdate() +{ + if (m_singleHighlightGradient) + setSeriesGradient(this, *m_singleHighlightGradient, GradientTypeSingle); +} + +void DeclarativeSurface3DSeries::handleMultiHighlightGradientUpdate() +{ + if (m_multiHighlightGradient) + setSeriesGradient(this, *m_multiHighlightGradient, GradientTypeMulti); +} + QT_DATAVISUALIZATION_END_NAMESPACE |