summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorMika Salmela <mika.salmela@digia.com>2013-06-03 15:01:25 +0300
committerMika Salmela <mika.salmela@digia.com>2013-06-03 15:08:00 +0300
commitb76baa838f46089ff6d50a2f003b7903594fd443 (patch)
tree8a4c55272934f9d0b741806bfa3ce829081dd1b8 /plugins
parent1ed4427c0b81a534f6318c037115164138073706 (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.pri6
-rw-r--r--plugins/declarative/declarativeboxplotseries.cpp124
-rw-r--r--plugins/declarative/declarativeboxplotseries.h119
-rw-r--r--plugins/declarative/declarativechart.cpp6
-rw-r--r--plugins/declarative/declarativechart.h1
-rw-r--r--plugins/declarative/plugin.cpp5
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");
}
};