diff options
author | Mika Salmela <mika.salmela@digia.com> | 2013-06-03 15:01:25 +0300 |
---|---|---|
committer | Mika Salmela <mika.salmela@digia.com> | 2013-06-03 15:08:00 +0300 |
commit | b76baa838f46089ff6d50a2f003b7903594fd443 (patch) | |
tree | 8a4c55272934f9d0b741806bfa3ce829081dd1b8 /plugins | |
parent | 1ed4427c0b81a534f6318c037115164138073706 (diff) |
A new box-and-whiskers series type added to charts.
Change-Id: Iab7a05c44026db9925fa0d68afd2b533b3ea2f91
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/declarative/declarative.pri | 6 | ||||
-rw-r--r-- | plugins/declarative/declarativeboxplotseries.cpp | 124 | ||||
-rw-r--r-- | plugins/declarative/declarativeboxplotseries.h | 119 | ||||
-rw-r--r-- | plugins/declarative/declarativechart.cpp | 6 | ||||
-rw-r--r-- | plugins/declarative/declarativechart.h | 1 | ||||
-rw-r--r-- | plugins/declarative/plugin.cpp | 5 |
6 files changed, 259 insertions, 2 deletions
diff --git a/plugins/declarative/declarative.pri b/plugins/declarative/declarative.pri index 305e6861..d183549a 100644 --- a/plugins/declarative/declarative.pri +++ b/plugins/declarative/declarative.pri @@ -29,7 +29,8 @@ SOURCES += \ ../declarative/declarativecategoryaxis.cpp \ ../declarative/declarativemargins.cpp \ ../declarative/declarativeaxes.cpp \ - ../declarative/declarativepolarchart.cpp + ../declarative/declarativepolarchart.cpp \ + ../declarative/declarativeboxplotseries.cpp HEADERS += \ ../declarative/declarativechart.h \ @@ -45,7 +46,8 @@ HEADERS += \ ../declarative/declarativemargins.h \ ../declarative/declarativeaxes.h \ ../declarative/declarativepolarchart.h \ - ../declarative/shared_defines.h + ../declarative/shared_defines.h \ + ../declarative/declarativeboxplotseries.h TARGETPATH = QtCommercial/Chart target.path = $$IMPORT_INSTALL_PATH/$$TARGETPATH diff --git a/plugins/declarative/declarativeboxplotseries.cpp b/plugins/declarative/declarativeboxplotseries.cpp new file mode 100644 index 00000000..64507efe --- /dev/null +++ b/plugins/declarative/declarativeboxplotseries.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Commercial Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "declarativebarseries.h" +#include "declarativeboxplotseries.h" +#include "qboxset.h" +#include "qvboxplotmodelmapper.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +DeclarativeBoxSet::DeclarativeBoxSet(const QString label, QObject *parent) + : QBoxSet(label, parent) +{ + connect(this, SIGNAL(valuesChanged()), this, SIGNAL(changedValues())); + connect(this, SIGNAL(valueChanged(int)), this, SIGNAL(changedValue(int))); +} + +QVariantList DeclarativeBoxSet::values() +{ + QVariantList values; + for (int i(0); i < 5; i++) + values.append(QVariant(QBoxSet::at(i))); + return values; +} + +void DeclarativeBoxSet::setValues(QVariantList values) +{ + for (int i(0); i < values.count(); i++) { + if (values.at(i).canConvert(QVariant::Double)) + QBoxSet::append(values[i].toDouble()); + } +} + +// ===================================================== + +DeclarativeBoxPlotSeries::DeclarativeBoxPlotSeries(QDeclarativeItem *parent) : + QBoxPlotSeries(parent), + m_axes(new DeclarativeAxes(this)) +{ + connect(m_axes, SIGNAL(axisXChanged(QAbstractAxis*)), this, SIGNAL(axisXChanged(QAbstractAxis*))); + connect(m_axes, SIGNAL(axisYChanged(QAbstractAxis*)), this, SIGNAL(axisYChanged(QAbstractAxis*))); + connect(m_axes, SIGNAL(axisXTopChanged(QAbstractAxis*)), this, SIGNAL(axisXTopChanged(QAbstractAxis*))); + connect(m_axes, SIGNAL(axisYRightChanged(QAbstractAxis*)), this, SIGNAL(axisYRightChanged(QAbstractAxis*))); + connect(this, SIGNAL(hovered(bool, QBoxSet*)), this, SLOT(onHovered(bool, QBoxSet*))); + connect(this, SIGNAL(clicked(QBoxSet*)), this, SLOT(onClicked(QBoxSet*))); +} + +void DeclarativeBoxPlotSeries::classBegin() +{ +} + +void DeclarativeBoxPlotSeries::componentComplete() +{ + foreach (QObject *child, children()) { + if (qobject_cast<DeclarativeBoxSet *>(child)) { + QBoxPlotSeries::append(qobject_cast<DeclarativeBoxSet *>(child)); + } else if (qobject_cast<QVBoxPlotModelMapper *>(child)) { + QVBoxPlotModelMapper *mapper = qobject_cast<QVBoxPlotModelMapper *>(child); + mapper->setSeries(this); + } + } +} + +QDeclarativeListProperty<QObject> DeclarativeBoxPlotSeries::seriesChildren() +{ + return QDeclarativeListProperty<QObject>(this, 0, &DeclarativeBoxPlotSeries::appendSeriesChildren); +} + +void DeclarativeBoxPlotSeries::appendSeriesChildren(QDeclarativeListProperty<QObject> *list, QObject *element) +{ + // Empty implementation; the children are parsed in componentComplete instead + Q_UNUSED(list); + Q_UNUSED(element); +} + +DeclarativeBoxSet *DeclarativeBoxPlotSeries::at(int index) +{ + QList<QBoxSet *> setList = boxSets(); + if (index >= 0 && index < setList.count()) + return qobject_cast<DeclarativeBoxSet *>(setList[index]); + + return 0; +} + +DeclarativeBoxSet *DeclarativeBoxPlotSeries::insert(int index, const QString label, QVariantList values) +{ + DeclarativeBoxSet *barset = new DeclarativeBoxSet(label, this); + barset->setValues(values); + if (QBoxPlotSeries::insert(index, barset)) + return barset; + delete barset; + return 0; +} + +void DeclarativeBoxPlotSeries::onHovered(bool status, QBoxSet *boxset) +{ + emit hovered(status, qobject_cast<DeclarativeBoxSet *>(boxset)); +} + +void DeclarativeBoxPlotSeries::onClicked(QBoxSet *boxset) +{ + emit clicked(qobject_cast<DeclarativeBoxSet *>(boxset)); +} + +#include "moc_declarativeboxplotseries.cpp" + +QTCOMMERCIALCHART_END_NAMESPACE diff --git a/plugins/declarative/declarativeboxplotseries.h b/plugins/declarative/declarativeboxplotseries.h new file mode 100644 index 00000000..4822b717 --- /dev/null +++ b/plugins/declarative/declarativeboxplotseries.h @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Commercial Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DECLARATIVEBOXPLOT_H +#define DECLARATIVEBOXPLOT_H + +#include "qboxset.h" +#include "declarativeaxes.h" +#include "qboxplotseries.h" +#include <QtDeclarative/QDeclarativeItem> +#include <QtDeclarative/QDeclarativeParserStatus> + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +class DeclarativeBoxSet : public QBoxSet +{ + Q_OBJECT + Q_PROPERTY(QVariantList values READ values WRITE setValues) + Q_PROPERTY(QString label READ label WRITE setLabel) + Q_PROPERTY(int count READ count) + Q_ENUMS(ValuePositions) + +public: // duplicate from QBoxSet + enum ValuePositions { + LowerExtreme = 0x0, + LowerQuartile, + Median, + UpperQuartile, + UpperExtreme + }; + +public: + explicit DeclarativeBoxSet(const QString label = "", QObject *parent = 0); + QVariantList values(); + void setValues(QVariantList values); + +public: // From QBoxSet + Q_INVOKABLE void append(qreal value) { QBoxSet::append(value); } + Q_INVOKABLE void clear() {QBoxSet::clear(); } + Q_INVOKABLE qreal at(int index) { return QBoxSet::at(index); } + Q_INVOKABLE void setValue(int index, qreal value) { QBoxSet::setValue(index, value); } + +Q_SIGNALS: + void changedValues(); + void changedValue(int index); +}; + +class DeclarativeBoxPlotSeries : public QBoxPlotSeries, public QDeclarativeParserStatus +{ + Q_OBJECT + Q_INTERFACES(QDeclarativeParserStatus) + Q_PROPERTY(QAbstractAxis *axisX READ axisX WRITE setAxisX NOTIFY axisXChanged) + Q_PROPERTY(QAbstractAxis *axisY READ axisY WRITE setAxisY NOTIFY axisYChanged) + Q_PROPERTY(QAbstractAxis *axisXTop READ axisXTop WRITE setAxisXTop NOTIFY axisXTopChanged) + Q_PROPERTY(QAbstractAxis *axisYRight READ axisYRight WRITE setAxisYRight NOTIFY axisYRightChanged) + Q_PROPERTY(QDeclarativeListProperty<QObject> seriesChildren READ seriesChildren) + Q_CLASSINFO("DefaultProperty", "seriesChildren") + +public: + explicit DeclarativeBoxPlotSeries(QDeclarativeItem *parent = 0); + QAbstractAxis *axisX() { return m_axes->axisX(); } + void setAxisX(QAbstractAxis *axis) { m_axes->setAxisX(axis); } + QAbstractAxis *axisY() { return m_axes->axisY(); } + void setAxisY(QAbstractAxis *axis) { m_axes->setAxisY(axis); } + QAbstractAxis *axisXTop() { return m_axes->axisXTop(); } + void setAxisXTop(QAbstractAxis *axis) { m_axes->setAxisXTop(axis); } + QAbstractAxis *axisYRight() { return m_axes->axisYRight(); } + void setAxisYRight(QAbstractAxis *axis) { m_axes->setAxisYRight(axis); } + QDeclarativeListProperty<QObject> seriesChildren(); + +public: + Q_INVOKABLE DeclarativeBoxSet *at(int index); + Q_INVOKABLE DeclarativeBoxSet *append(const QString label, QVariantList values) { return insert(count(), label, values); } + Q_INVOKABLE void append(DeclarativeBoxSet *box) { QBoxPlotSeries::append(box); } + Q_INVOKABLE DeclarativeBoxSet *insert(int index, const QString label, QVariantList values); + Q_INVOKABLE bool remove(DeclarativeBoxSet *box) { return QBoxPlotSeries::remove(qobject_cast<QBoxSet *>(box)); } + Q_INVOKABLE void clear() { return QBoxPlotSeries::clear(); } + +public: // from QDeclarativeParserStatus + void classBegin(); + void componentComplete(); + +Q_SIGNALS: + void axisXChanged(QAbstractAxis *axis); + void axisYChanged(QAbstractAxis *axis); + void axisXTopChanged(QAbstractAxis *axis); + void axisYRightChanged(QAbstractAxis *axis); + void clicked(DeclarativeBoxSet *boxset); + void hovered(bool status, DeclarativeBoxSet *boxset); + +public Q_SLOTS: + static void appendSeriesChildren(QDeclarativeListProperty<QObject> *list, QObject *element); + void onHovered(bool status, QBoxSet *boxset); + void onClicked(QBoxSet *boxset); + +public: + DeclarativeAxes *m_axes; +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif // DECLARATIVEBOXPLOT_H diff --git a/plugins/declarative/declarativechart.cpp b/plugins/declarative/declarativechart.cpp index 3caeb39b..bb62e077 100644 --- a/plugins/declarative/declarativechart.cpp +++ b/plugins/declarative/declarativechart.cpp @@ -25,6 +25,7 @@ #include "declarativebarseries.h" #include "declarativepieseries.h" #include "declarativesplineseries.h" +#include "declarativeboxplotseries.h" #include "declarativescatterseries.h" #include "qbarcategoryaxis.h" #include "qvalueaxis.h" @@ -849,6 +850,9 @@ QAbstractSeries *DeclarativeChart::createSeries(int type, QString name, QAbstrac case DeclarativeChart::SeriesTypeHorizontalStackedBar: series = new DeclarativeHorizontalStackedBarSeries(); break; + case DeclarativeChart::SeriesTypeBoxPlot: + series = new DeclarativeBoxPlotSeries(); + break; case DeclarativeChart::SeriesTypePie: series = new DeclarativePieSeries(); break; @@ -964,6 +968,8 @@ void DeclarativeChart::initializeAxes(QAbstractSeries *series) doInitializeAxes(series, qobject_cast<DeclarativeHorizontalStackedBarSeries *>(series)->m_axes); else if (qobject_cast<DeclarativeHorizontalPercentBarSeries *>(series)) doInitializeAxes(series, qobject_cast<DeclarativeHorizontalPercentBarSeries *>(series)->m_axes); + else if (qobject_cast<DeclarativeBoxPlotSeries *>(series)) + doInitializeAxes(series, qobject_cast<DeclarativeBoxPlotSeries *>(series)->m_axes); // else: do nothing } diff --git a/plugins/declarative/declarativechart.h b/plugins/declarative/declarativechart.h index ae4c5362..2717ee06 100644 --- a/plugins/declarative/declarativechart.h +++ b/plugins/declarative/declarativechart.h @@ -95,6 +95,7 @@ public: SeriesTypeBar, SeriesTypeStackedBar, SeriesTypePercentBar, + SeriesTypeBoxPlot, SeriesTypePie, SeriesTypeScatter, SeriesTypeSpline, diff --git a/plugins/declarative/plugin.cpp b/plugins/declarative/plugin.cpp index 029e6df9..52cfc555 100644 --- a/plugins/declarative/plugin.cpp +++ b/plugins/declarative/plugin.cpp @@ -32,6 +32,7 @@ #include "declarativeareaseries.h" #include "declarativescatterseries.h" #include "declarativebarseries.h" +#include "declarativeboxplotseries.h" #include "declarativepieseries.h" #include "declarativeaxes.h" #include "qvxymodelmapper.h" @@ -74,6 +75,8 @@ Q_DECLARE_METATYPE(DeclarativeMargins *) Q_DECLARE_METATYPE(DeclarativeAreaSeries *) Q_DECLARE_METATYPE(DeclarativeBarSeries *) Q_DECLARE_METATYPE(DeclarativeBarSet *) +Q_DECLARE_METATYPE(DeclarativeBoxPlotSeries *) +Q_DECLARE_METATYPE(DeclarativeBoxSet *) Q_DECLARE_METATYPE(DeclarativeLineSeries *) Q_DECLARE_METATYPE(DeclarativePieSeries *) Q_DECLARE_METATYPE(DeclarativeScatterSeries *) @@ -236,6 +239,8 @@ public: qmlRegisterType<DeclarativeLineSeries, 3>(uri, 1, 3, "LineSeries"); qmlRegisterType<DeclarativeAreaSeries, 3>(uri, 1, 3, "AreaSeries"); qmlRegisterType<QLogValueAxis>(uri, 1, 3, "LogValueAxis"); + qmlRegisterType<DeclarativeBoxPlotSeries>(uri, 1, 3, "BoxPlotSeries"); + qmlRegisterType<DeclarativeBoxSet>(uri, 1, 3, "BoxSet"); } }; |