diff options
author | Titta Heikkala <titta.heikkala@digia.com> | 2014-07-01 07:10:00 +0300 |
---|---|---|
committer | Titta Heikkala <titta.heikkala@theqtcompany.com> | 2014-10-14 13:04:52 +0300 |
commit | c544258484ff4fd5d2b88402fbaa5d154b89a3a2 (patch) | |
tree | 7659625abb566dec55d3783ed820b928542d9b2b /src/charts/barchart/qbarset.cpp | |
parent | 76339f714f088645e911cee65bdb66055fe029aa (diff) |
Qt Charts project file structure change
Charts repository structure is changed to follow the structure of a
Qt Add-On module. The task includes following changes:
- All macros and definitions named 'commercial' have been renamed.
- Compile errors related to QString and qSort usage have been fixed.
- Old demos are moved under examples. The QML examples now support only
Qt Quick 2.0, the support for Qt Quick 1 is removed.
- The QML examples with multiple views are updated so that they are
usable also with touch devices.
- Unnecessary version checks are removed from examples.
- The build stamp has been removed as it was only meant for Charts
development purposes and it's no longer needed. Also development
build related debug prints are removed as __DATE__ can't be used
for all OS thus it doesn't make much sense.
- Documentation structure has been updated based on the new module
structure. The raw HTML files have been removed. Demos are
combined to examples.
- Unnecessary .qdocinc files are no longer needed. The content is
moved to the corresponding .cpp files.
- The Charts widget designer plugin is updated according to the module
change.
- The test cases updated according to the project structure change.
Tests are added also for version 2.0.
- cmake modules generation is not needed with Qt 5.4 and Qt Charts
so it's disabled.
- The new module name and version are updated to the plugin.qmltypes
file.
Task-number: QTRD-2844, QTRD-3217, QTRD-3218, QTRD-3277, QTRD-3228,
QTRD-2526, QTRD-3233, QTRD-3222
Change-Id: Ib7fb26057cde710ffaf6bc780c8bf52a16f45160
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>
Diffstat (limited to 'src/charts/barchart/qbarset.cpp')
-rw-r--r-- | src/charts/barchart/qbarset.cpp | 676 |
1 files changed, 676 insertions, 0 deletions
diff --git a/src/charts/barchart/qbarset.cpp b/src/charts/barchart/qbarset.cpp new file mode 100644 index 00000000..e378b327 --- /dev/null +++ b/src/charts/barchart/qbarset.cpp @@ -0,0 +1,676 @@ +/**************************************************************************** +** +** 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 "qbarset.h" +#include "qbarset_p.h" +#include "charthelpers_p.h" +#include "qchart_p.h" + +QT_CHARTS_BEGIN_NAMESPACE + +/*! + \class QBarSet + \inmodule Qt Charts + \brief Building block for different bar charts. + + QBarSet represents one set of bars. Set of bars contains one data value for each category. + First value of set is assumed to belong to first category, second to second category and so on. + If set has fewer values than there are categories, then the missing values are assumed to be + at the end of set. For missing values in middle of a set, numerical value of zero is used. + + \mainclass + + \sa QAbstractBarSeries, QBarSeries, QStackedBarSeries, QPercentBarSeries +*/ +/*! + \qmltype BarSet + \instantiates QBarSet + \inqmlmodule QtCharts + + \brief Building block for different bar charts. + + BarSet represents one set of bars. Set of bars contains one data value for each category. + First value of set is assumed to belong to first category, second to second category and so on. + If set has fewer values than there are categories, then the missing values are assumed to be + at the end of set. For missing values in middle of a set, numerical value of zero is used. + \sa AbstractBarSeries, BarSeries, StackedBarSeries, PercentBarSeries +*/ + +/*! + \property QBarSet::label + Defines the label of the bar set. +*/ +/*! + \qmlproperty string BarSet::label + Defines the label of the bar set. +*/ + +/*! + \property QBarSet::pen + \brief Defines the pen used by the bar set. +*/ + +/*! + \property QBarSet::brush + \brief Defines the brush used by the bar set. +*/ + +/*! + \qmlproperty QString BarSet::brushFilename + The name of the file used as a brush for the set. +*/ + +/*! + \property QBarSet::labelBrush + \brief Defines the brush used by the bar set's label. +*/ + +/*! + \property QBarSet::labelFont + \brief Defines the font used by the bar set's label. +*/ + +/*! + \qmlproperty Font BarSet::labelFont + Defines the font used by the bar set's label. + + See the Qt documentation for more details of Font. +*/ + +/*! + \property QBarSet::color + The fill (brush) color of the bar set. +*/ +/*! + \qmlproperty color BarSet::color + The fill (brush) color of the bar set. +*/ + +/*! + \property QBarSet::borderColor + The line (pen) color of the bar set. +*/ +/*! + \qmlproperty color BarSet::borderColor + The line (pen) color of the bar set. +*/ + +/*! + \qmlproperty real BarSet::borderWidth + The width of the border line. By default the width is 2.0. +*/ + +/*! + \property QBarSet::labelColor + The text (label) color of the bar set. +*/ +/*! + \qmlproperty color BarSet::labelColor + The text (label) color of the bar set. +*/ + +/*! + \fn void QBarSet::clicked(int index) + + The signal is emitted if the user clicks with a mouse on top of bar set. + Clicked bar inside set is indexed by \a index +*/ + +/*! + \fn void QBarSet::hovered(bool status) + + The signal is emitted if mouse is hovered on top of bar set. + Parameter \a status is true, if mouse entered on top of bar set, false if mouse left from top of bar set. +*/ + +/*! + \fn void QBarSet::hovered(bool status, int index) + + The signal is emitted if mouse is hovered on top of bar set. + Parameter \a status is true, if mouse entered on top of bar set, false if mouse left from top of bar set. + Hovered bar inside the set is indexed by \a index. +*/ + + +/*! + \fn void QBarSet::labelChanged() + This signal is emitted when the label of the bar set has changed. + \sa label +*/ +/*! + \qmlsignal BarSet::onLabelChanged() + This signal is emitted when the label of the bar set has changed. +*/ + +/*! + \fn void QBarSet::penChanged() + This signal is emitted when the pen of the bar set has changed. + \sa pen +*/ + +/*! + \fn void QBarSet::brushChanged() + This signal is emitted when the brush of the bar set has changed. + \sa brush +*/ + +/*! + \fn void QBarSet::labelBrushChanged() + This signal is emitted when the brush of the bar set's label has changed. + \sa labelBrush +*/ + +/*! + \fn void QBarSet::labelFontChanged() + This signal is emitted when the font of the bar set's label has changed. + \sa labelBrush +*/ + +/*! + \fn void QBarSet::colorChanged(QColor) + This signal is emitted when the fill (brush) color of the set has changed to \a color. +*/ +/*! + \qmlsignal BarSet::onColorChanged(color color) + This signal is emitted when the fill (brush) color of the set has changed to \a color. +*/ + +/*! + \fn void QBarSet::borderColorChanged(QColor) + This signal is emitted when the line (pen) color of the set has changed to \a color. +*/ +/*! + \qmlsignal BarSet::onBorderColorChanged(color color) + This signal is emitted when the line (pen) color of the set has changed to \a color. +*/ + +/*! + \fn void QBarSet::labelColorChanged(QColor) + This signal is emitted when the text (label) color of the set has changed to \a color. +*/ +/*! + \qmlsignal BarSet::onLabelColorChanged(color color) + This signal is emitted when the text (label) color of the set has changed to \a color. +*/ + +/*! + \fn void QBarSet::valuesAdded(int index, int count) + This signal is emitted when new values have been added to the set. + Parameter \a index indicates the position of the first inserted value. + Parameter \a count is the number of inserted values. + \sa append(), insert() +*/ +/*! + \qmlsignal BarSet::onValuesAdded(int index, int count) + This signal is emitted when new values have been added to the set. + Parameter \a index indicates the position of the first inserted value. + Parameter \a count is the number of inserted values. +*/ + +/*! + \fn void QBarSet::valuesRemoved(int index, int count) + This signal is emitted values have been removed from the set. + Parameter \a index indicates the position of the first removed value. + Parameter \a count is the number of removed values. + \sa remove() +*/ +/*! + \qmlsignal BarSet::onValuesRemoved(int index, int count) + This signal is emitted values have been removed from the set. + Parameter \a index indicates the position of the first removed value. + Parameter \a count is the number of removed values. +*/ + +/*! + \fn void QBarSet::valueChanged(int index) + This signal is emitted values the value in the set has been modified. + Parameter \a index indicates the position of the modified value. + \sa at() +*/ +/*! + \qmlsignal BarSet::onValueChanged(int index) + This signal is emitted values the value in the set has been modified. + Parameter \a index indicates the position of the modified value. +*/ + +/*! + \qmlproperty int BarSet::count + The count of values on the bar set +*/ + +/*! + \qmlproperty QVariantList BarSet::values + The values of the bar set. You can set either a list of reals or a list of points as values. If you set a list of + reals as values, the values are automatically completed to points by using the index of a value as it's + x-coordinate. For example the following sets have equal values: + \code + myBarSet1.values = [0, 5, 1, 5]; + myBarSet2.values = [Qt.point(0, 0), Qt.point(1, 5), Qt.point(2, 1), Qt.point(3, 5)]; + \endcode +*/ + +/*! + Constructs QBarSet with a label of \a label and with parent of \a parent. +*/ +QBarSet::QBarSet(const QString label, QObject *parent) + : QObject(parent), + d_ptr(new QBarSetPrivate(label, this)) +{ +} + +/*! + Destroys the bar set. +*/ +QBarSet::~QBarSet() +{ + // NOTE: d_ptr destroyed by QObject +} + +/*! + Sets new \a label for set. +*/ +void QBarSet::setLabel(const QString label) +{ + d_ptr->m_label = label; + emit labelChanged(); +} + +/*! + Returns label of the set. +*/ +QString QBarSet::label() const +{ + return d_ptr->m_label; +} + +/*! + Appends new value \a value to the end of set. +*/ +void QBarSet::append(const qreal value) +{ + // Convert to QPointF + int index = d_ptr->m_values.count(); + d_ptr->append(QPointF(d_ptr->m_values.count(), value)); + emit valuesAdded(index, 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 bar set. + \sa append() +*/ +void QBarSet::append(const QList<qreal> &values) +{ + int index = d_ptr->m_values.count(); + d_ptr->append(values); + emit valuesAdded(index, values.count()); +} + +/*! + Convenience operator. Same as append, with real \a value. + \sa append() +*/ +QBarSet &QBarSet::operator << (const qreal &value) +{ + append(value); + return *this; +} + +/*! + Inserts new \a value on the \a index position. + The value that is currently at this postion is moved to position index + 1 + \sa remove() +*/ +void QBarSet::insert(const int index, const qreal value) +{ + d_ptr->insert(index, value); + emit valuesAdded(index, 1); +} + +/*! + Removes \a count number of values from the set starting at \a index. + \sa insert() +*/ +void QBarSet::remove(const int index, const int count) +{ + int removedCount = d_ptr->remove(index, count); + if (removedCount > 0) + emit valuesRemoved(index, removedCount); + return; +} + +/*! + Sets a new value \a value to set, indexed by \a index. +*/ +void QBarSet::replace(const int index, const qreal value) +{ + if (index >= 0 && index < d_ptr->m_values.count()) { + d_ptr->replace(index, value); + emit valueChanged(index); + } +} + + +/*! + Returns value of set indexed by \a index. + If the index is out of bounds 0.0 is returned. +*/ +qreal QBarSet::at(const int index) const +{ + if (index < 0 || index >= d_ptr->m_values.count()) + return 0; + return d_ptr->m_values.at(index).y(); +} + +/*! + Returns value of set indexed by \a index. + If the index is out of bounds 0.0 is returned. +*/ +qreal QBarSet::operator [](const int index) const +{ + return at(index); +} + +/*! + Returns count of values in set. +*/ +int QBarSet::count() const +{ + return d_ptr->m_values.count(); +} + +/*! + Returns sum of all values in the bar set. +*/ +qreal QBarSet::sum() const +{ + qreal total(0); + for (int i = 0; i < d_ptr->m_values.count(); i++) + total += d_ptr->m_values.at(i).y(); + return total; +} + +/*! + Sets pen for set. Bars of this set are drawn using \a pen +*/ +void QBarSet::setPen(const QPen &pen) +{ + if (d_ptr->m_pen != pen) { + d_ptr->m_pen = pen; + emit d_ptr->updatedBars(); + emit penChanged(); + } +} + +/*! + Returns pen of the set. +*/ +QPen QBarSet::pen() const +{ + if (d_ptr->m_pen == QChartPrivate::defaultPen()) + return QPen(); + else + return d_ptr->m_pen; +} + +/*! + Sets brush for the set. Bars of this set are drawn using \a brush. +*/ +void QBarSet::setBrush(const QBrush &brush) +{ + if (d_ptr->m_brush != brush) { + d_ptr->m_brush = brush; + emit d_ptr->updatedBars(); + emit brushChanged(); + } +} + +/*! + Returns brush of the set. +*/ +QBrush QBarSet::brush() const +{ + if (d_ptr->m_brush == QChartPrivate::defaultBrush()) + return QBrush(); + else + return d_ptr->m_brush; +} + +/*! + Sets \a brush of the values that are drawn on top of this bar set. +*/ +void QBarSet::setLabelBrush(const QBrush &brush) +{ + if (d_ptr->m_labelBrush != brush) { + d_ptr->m_labelBrush = brush; + emit d_ptr->updatedBars(); + emit labelBrushChanged(); + } +} + +/*! + Returns brush of the values that are drawn on top of this bar set. +*/ +QBrush QBarSet::labelBrush() const +{ + if (d_ptr->m_labelBrush == QChartPrivate::defaultBrush()) + return QBrush(); + else + return d_ptr->m_labelBrush; +} + +/*! + Sets the \a font for values that are drawn on top of this bar set. +*/ +void QBarSet::setLabelFont(const QFont &font) +{ + if (d_ptr->m_labelFont != font) { + d_ptr->m_labelFont = font; + emit d_ptr->updatedBars(); + emit labelFontChanged(); + } + +} + +/*! + Returns the pen for values that are drawn on top of this bar set. +*/ +QFont QBarSet::labelFont() const +{ + return d_ptr->m_labelFont; +} + +/*! + Returns the color of the brush of bar set. +*/ +QColor QBarSet::color() +{ + return brush().color(); +} + +/*! + Sets the \a color of brush for this bar set. +*/ +void QBarSet::setColor(QColor color) +{ + QBrush b = brush(); + if ((b.color() != color) || (b.style() == Qt::NoBrush)) { + b.setColor(color); + if (b.style() == Qt::NoBrush) { + // Set tyle to Qt::SolidPattern. (Default is Qt::NoBrush) + // This prevents theme to override color defined in QML side: + // BarSet { label: "Bob"; color:"red"; values: [1,2,3] } + // The color must be obeyed, since user wanted it. + b.setStyle(Qt::SolidPattern); + } + setBrush(b); + emit colorChanged(color); + } +} + +/*! + Returns the color of pen of this bar set. +*/ +QColor QBarSet::borderColor() +{ + return pen().color(); +} + +/*! + Sets the color of pen for this bar set. +*/ +void QBarSet::setBorderColor(QColor color) +{ + QPen p = pen(); + if (p.color() != color) { + p.setColor(color); + setPen(p); + emit borderColorChanged(color); + } +} + +/*! + Returns the color of labels of this bar set. +*/ +QColor QBarSet::labelColor() +{ + return labelBrush().color(); +} + +/*! + Sets the color of labels for this bar set. +*/ +void QBarSet::setLabelColor(QColor color) +{ + QBrush b = labelBrush(); + if (b == QBrush()) + b.setStyle(Qt::SolidPattern); + + if (b.color() != color) { + b.setColor(color); + setLabelBrush(b); + emit labelColorChanged(color); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QBarSetPrivate::QBarSetPrivate(const QString label, QBarSet *parent) : QObject(parent), + q_ptr(parent), + m_label(label), + m_pen(QChartPrivate::defaultPen()), + m_brush(QChartPrivate::defaultBrush()), + m_labelBrush(QChartPrivate::defaultBrush()) +{ +} + +QBarSetPrivate::~QBarSetPrivate() +{ +} + +void QBarSetPrivate::append(QPointF value) +{ + if (isValidValue(value)) { + m_values.append(value); + emit restructuredBars(); + } +} + +void QBarSetPrivate::append(QList<QPointF> values) +{ + for (int i = 0; i < values.count(); i++) { + if (isValidValue(values.at(i))) + m_values.append(values.at(i)); + } + emit restructuredBars(); +} + +void QBarSetPrivate::append(QList<qreal> values) +{ + int index = m_values.count(); + for (int i = 0; i < values.count(); i++) { + if (isValidValue(values.at(i))) { + m_values.append(QPointF(index, values.at(i))); + index++; + } + } + emit restructuredBars(); +} + +void QBarSetPrivate::insert(const int index, const qreal value) +{ + m_values.insert(index, QPointF(index, value)); + emit restructuredBars(); +} + +void QBarSetPrivate::insert(const int index, const QPointF value) +{ + m_values.insert(index, value); + emit restructuredBars(); +} + +int QBarSetPrivate::remove(const int index, const int count) +{ + int removeCount = count; + + if ((index < 0) || (m_values.count() == 0)) + return 0; // Invalid index or not values in list, remove nothing. + else if ((index + count) > m_values.count()) + removeCount = m_values.count() - index; // Trying to remove more items than list has. Limit amount to be removed. + + int c = 0; + while (c < removeCount) { + m_values.removeAt(index); + c++; + } + emit restructuredBars(); + return removeCount; +} + +void QBarSetPrivate::replace(const int index, const qreal value) +{ + m_values.replace(index, QPointF(index, value)); + emit updatedLayout(); +} + +void QBarSetPrivate::replace(const int index, const QPointF value) +{ + m_values.replace(index, value); + emit updatedLayout(); +} + +qreal QBarSetPrivate::pos(const int index) +{ + if (index < 0 || index >= m_values.count()) + return 0; + return m_values.at(index).x(); +} + +qreal QBarSetPrivate::value(const int index) +{ + if (index < 0 || index >= m_values.count()) + return 0; + return m_values.at(index).y(); +} + +#include "moc_qbarset.cpp" +#include "moc_qbarset_p.cpp" + +QT_CHARTS_END_NAMESPACE |