summaryrefslogtreecommitdiffstats
path: root/src/charts/barchart/qbarset.cpp
diff options
context:
space:
mode:
authorTitta Heikkala <titta.heikkala@digia.com>2014-07-01 07:10:00 +0300
committerTitta Heikkala <titta.heikkala@theqtcompany.com>2014-10-14 13:04:52 +0300
commitc544258484ff4fd5d2b88402fbaa5d154b89a3a2 (patch)
tree7659625abb566dec55d3783ed820b928542d9b2b /src/charts/barchart/qbarset.cpp
parent76339f714f088645e911cee65bdb66055fe029aa (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.cpp676
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