diff options
Diffstat (limited to 'src/charts/boxplotchart/qboxset.cpp')
-rw-r--r-- | src/charts/boxplotchart/qboxset.cpp | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/src/charts/boxplotchart/qboxset.cpp b/src/charts/boxplotchart/qboxset.cpp new file mode 100644 index 00000000..065746f3 --- /dev/null +++ b/src/charts/boxplotchart/qboxset.cpp @@ -0,0 +1,336 @@ +/**************************************************************************** +** +** Copyright (C) 2014 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 Enterprise Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise 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 "qboxset.h" +#include "qboxset_p.h" +#include "charthelpers_p.h" + +QT_CHARTS_BEGIN_NAMESPACE + +/*! + \class QBoxSet + \inmodule Qt Charts + \brief Building block for box-and-whiskers chart. + + QBoxSet represents one box-and-whiskers item. It takes five values to create a graphical representation + of range and three medians. There are two ways to give the values. The first one is with constructor + or stream operator (<<). The values have to be given in the following order: lower extreme, + lower quartile, median, upper quartile and upper extreme. The Second method is to create an empty QBoxSet instance and + give the values using setValue method. + + \mainclass + + \sa QBoxPlotSeries +*/ +/*! + \enum QBoxSet::ValuePositions + + \value LowerExtreme + \value LowerQuartile + \value Median + \value UpperQuartile + \value UpperExtreme +*/ +/*! + \property QBoxSet::pen + \brief Defines the pen used by the box-and-whiskers set. +*/ +/*! + \property QBoxSet::brush + \brief Defines the brush used by the box-and-whiskers set. +*/ + +/*! + \qmlproperty QString BoxSet::brushFilename + The name of the file used as a brush for the box-and-whiskers set. +*/ + +/*! + \fn void QBoxSet::clicked() + The signal is emitted if the user clicks with a mouse on top of box-and-whisker item. +*/ +/*! + \fn void QBoxSet::hovered(bool status) + + The signal is emitted if mouse is hovered on top of box-and-whisker item. + Parameter \a status is true, if mouse entered on top of item, false if mouse left from top of item. +*/ +/*! + \fn void QBoxSet::penChanged() + This signal is emitted when the pen of the box-and-whisker item has changed. + \sa pen +*/ +/*! + \fn void QBoxSet::brushChanged() + This signal is emitted when the brush of the box-and-whisker item has changed. + \sa brush +*/ +/*! + \fn void QBoxSet::valuesChanged() + This signal is emitted when multiple values have been changed on the box-and-whisker item. + \sa append() +*/ +/*! + \fn void QBoxSet::valueChanged(int index) + This signal is emitted values the value in the box-and-whisker item has been modified. + Parameter \a index indicates the position of the modified value. + \sa at() +*/ +/*! + \fn void QBoxSet::cleared() + This signal is emitted when all the values on the set are cleared to 0. +*/ + +/*! + Constructs QBoxSet with optional \a label and parent of \a parent +*/ +QBoxSet::QBoxSet(const QString label, QObject *parent) + : QObject(parent), + d_ptr(new QBoxSetPrivate(label, this)) +{ +} + +/*! + Constructs QBoxSet with given ordered values. \a le for lower extreme, \a lq for lower quartile, \a m for median, + \a uq for upper quartile and \a ue for upper quartile. \a label and \a parent are optional. + */ +QBoxSet::QBoxSet(const qreal le, const qreal lq, const qreal m, const qreal uq, const qreal ue, const QString label, QObject *parent) + : QObject(parent), + d_ptr(new QBoxSetPrivate(label, this)) +{ + d_ptr->append(le); + d_ptr->append(lq); + d_ptr->append(m); + d_ptr->append(uq); + d_ptr->append(ue); +} + +/*! + Destroys the boxset +*/ +QBoxSet::~QBoxSet() +{ +} + +/*! + Appends new value \a value to the end of set. +*/ +void QBoxSet::append(const qreal value) +{ + if (d_ptr->append(value)) + emit valueChanged(d_ptr->m_appendCount - 1); +} + +/*! + Appends a list of reals to set. Works like append with single real value. The \a values in list + are appended to end of boxset. + \sa append() +*/ +void QBoxSet::append(const QList<qreal> &values) +{ + if (d_ptr->append(values)) + emit valuesChanged(); +} + +/*! + Sets new \a label for set. +*/ +void QBoxSet::setLabel(const QString label) +{ + d_ptr->m_label = label; +} + +/*! + Returns label of the set. +*/ +QString QBoxSet::label() const +{ + return d_ptr->m_label; +} + +/*! + Convenience operator. Same as append, with real \a value. + \sa append() +*/ +QBoxSet &QBoxSet::operator << (const qreal &value) +{ + append(value); + return *this; +} + +/*! + Sets a new \a value on the \a index position. For \a index ValuePositions can be used. +*/ +void QBoxSet::setValue(const int index, const qreal value) +{ + d_ptr->setValue(index, value); + emit valueChanged(index); +} + +/*! + Sets all values on the set to 0. + */ +void QBoxSet::clear() +{ + d_ptr->clear(); + emit cleared(); +} + +/*! + Returns value of set indexed by \a index. For \a index ValuePositions can be used. + If the index is out of bounds 0.0 is returned. +*/ +qreal QBoxSet::at(const int index) const +{ + if (index < 0 || index >= 5) + return 0; + return d_ptr->m_values[index]; +} + +/*! + Returns value of set indexed by \a index. For \a index ValuePositions can be used. + If the index is out of bounds 0.0 is returned. +*/ +qreal QBoxSet::operator [](const int index) const +{ + return at(index); +} + +/*! + Returns count of values appended to the set. +*/ +int QBoxSet::count() const +{ + return d_ptr->m_appendCount; +} + +/*! + Sets pen for set. Boxes of this set are drawn using \a pen +*/ +void QBoxSet::setPen(const QPen &pen) +{ + if (d_ptr->m_pen != pen) { + d_ptr->m_pen = pen; + emit d_ptr->updatedBox(); + emit penChanged(); + } +} + +/*! + Returns pen of the set. +*/ +QPen QBoxSet::pen() const +{ + return d_ptr->m_pen; +} + +/*! + Sets brush for the set. Boxes of this set are drawn using \a brush +*/ +void QBoxSet::setBrush(const QBrush &brush) +{ + if (d_ptr->m_brush != brush) { + d_ptr->m_brush = brush; + emit d_ptr->updatedBox(); + emit brushChanged(); + } +} + +/*! + Returns brush of the set. +*/ +QBrush QBoxSet::brush() const +{ + return d_ptr->m_brush; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QBoxSetPrivate::QBoxSetPrivate(const QString label, QBoxSet *parent) : QObject(parent), + q_ptr(parent), + m_label(label), + m_valuesCount(5), + m_appendCount(0), + m_pen(QPen(Qt::NoPen)), + m_brush(QBrush(Qt::NoBrush)), + m_series(0) +{ + m_values = new qreal[m_valuesCount]; +} + +QBoxSetPrivate::~QBoxSetPrivate() +{ +} + +bool QBoxSetPrivate::append(qreal value) +{ + if (isValidValue(value) && m_appendCount < m_valuesCount) { + m_values[m_appendCount++] = value; + emit restructuredBox(); + + return true; + } + return false; +} + +bool QBoxSetPrivate::append(QList<qreal> values) +{ + bool success = false; + + for (int i = 0; i < values.count(); i++) { + if (isValidValue(values.at(i)) && m_appendCount < m_valuesCount) { + success = true; + m_values[m_appendCount++] = values.at(i); + } + } + + if (success) + emit restructuredBox(); + + return success; +} + +void QBoxSetPrivate::clear() +{ + m_appendCount = 0; + for (int i = 0; i < m_valuesCount; i++) + m_values[i] = 0.0; + emit restructuredBox(); +} + +void QBoxSetPrivate::setValue(const int index, const qreal value) +{ + if (index < m_valuesCount) { + m_values[index] = value; + emit updatedLayout(); + } +} + +qreal QBoxSetPrivate::value(const int index) +{ + if (index < 0 || index >= m_valuesCount) + return 0; + return m_values[index]; +} + +#include "moc_qboxset.cpp" +#include "moc_qboxset_p.cpp" + +QT_CHARTS_END_NAMESPACE |