summaryrefslogtreecommitdiffstats
path: root/src/datavisualizationqml2/declarativeseries.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-12-09 10:49:49 +0200
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-12-10 09:01:45 +0200
commit3573055abe42ff283d011d8550bc8495156338a1 (patch)
treebb45d4f7e32a0c63329d9f52639081162b34e17e /src/datavisualizationqml2/declarativeseries.cpp
parent22557b312570cbefde584466a28f2b9bfcc570ba (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.cpp226
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