qbarseries.cpp
688 lines
| 18.6 KiB
| text/x-c
|
CppLexer
Jani Honkonen
|
r794 | /**************************************************************************** | ||
** | ||||
** Copyright (C) 2012 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$ | ||||
** | ||||
****************************************************************************/ | ||||
sauimone
|
r338 | #include "qbarseries.h" | ||
Michal Klocek
|
r938 | #include "qbarseries_p.h" | ||
sauimone
|
r172 | #include "qbarset.h" | ||
Michal Klocek
|
r938 | #include "qbarset_p.h" | ||
Michal Klocek
|
r943 | #include "domain_p.h" | ||
Michal Klocek
|
r950 | #include "legendmarker_p.h" | ||
Michal Klocek
|
r943 | #include "chartdataset_p.h" | ||
#include "charttheme_p.h" | ||||
#include "chartanimator_p.h" | ||||
Michal Klocek
|
r938 | |||
sauimone
|
r56 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
sauimone
|
r313 | /*! | ||
sauimone
|
r338 | \class QBarSeries | ||
sauimone
|
r1502 | \brief Series for creating a bar chart | ||
Tero Ahola
|
r995 | \mainclass | ||
sauimone
|
r313 | |||
sauimone
|
r1208 | QBarSeries represents a series of data shown as bars. The purpose of this class is to draw bars to | ||
the position defined by data. Single bar is defined by QPointF, where x value is the x-coordinate of the bar | ||||
and y-value is the height of the bar. The category names are ignored with this series and x-axis | ||||
shows the x-values. | ||||
sauimone
|
r313 | |||
Tero Ahola
|
r995 | See the \l {BarChart Example} {bar chart example} to learn how to create a simple bar chart. | ||
\image examples_barchart.png | ||||
sauimone
|
r319 | |||
sauimone
|
r377 | \sa QBarSet, QStackedBarSeries, QPercentBarSeries | ||
sauimone
|
r313 | */ | ||
Tero Ahola
|
r1489 | /*! | ||
\qmlclass BarSeries QBarSeries | ||||
\beginfloatleft | ||||
\image demos_qmlchart6.png | ||||
\endfloat | ||||
\clearfloat | ||||
The following QML shows how to create a simple bar chart: | ||||
\snippet ../demos/qmlchart/qml/qmlchart/View6.qml 1 | ||||
*/ | ||||
sauimone
|
r313 | |||
Marek Rosa
|
r1361 | /*! | ||
sauimone
|
r1425 | \property QBarSeries::barWidth | ||
Tero Ahola
|
r1489 | The width of the bars of the series. The unit of \a width is the unit of x-axis. The minimum width for bars | ||
sauimone
|
r1425 | is zero and negative values are treated as zero. Setting the width to zero means that width of the bar on screen | ||
is one pixel no matter what the scale of x-axis is. Bars wider than zero are scaled with x-axis. | ||||
Tero Ahola
|
r1489 | Note that with QGroupedBarSeries this value means the width of one group of bars instead of just one bar. | ||
sauimone
|
r1425 | \sa QGroupedBarSeries | ||
Marek Rosa
|
r1361 | */ | ||
Tero Ahola
|
r1489 | /*! | ||
\qmlproperty real BarSeries::barWidth | ||||
The width of the bars of the series. The unit of width is the unit of x-axis. The minimum width for bars | ||||
is zero and negative values are treated as zero. Setting the width to zero means that width of the bar on screen | ||||
is one pixel no matter what the scale of x-axis is. Bars wider than zero are scaled with x-axis. | ||||
Note that with QGroupedBarSeries this value means the width of one group of bars instead of just one bar. | ||||
*/ | ||||
Marek Rosa
|
r1361 | |||
/*! | ||||
\property QBarSeries::count | ||||
Tero Ahola
|
r1489 | Holds the number of sets in series. | ||
*/ | ||||
/*! | ||||
\qmlproperty int BarSeries::count | ||||
Holds the number of sets in series. | ||||
Marek Rosa
|
r1361 | */ | ||
/*! | ||||
\property QBarSeries::labelsVisible | ||||
Tero Ahola
|
r1489 | Defines the visibility of the labels in series | ||
*/ | ||||
/*! | ||||
\qmlproperty bool BarSeries::labelsVisible | ||||
Defines the visibility of the labels in series | ||||
Marek Rosa
|
r1361 | */ | ||
sauimone
|
r313 | /*! | ||
sauimone
|
r1321 | \fn void QBarSeries::clicked(QBarSet *barset, int index) | ||
Tero Ahola
|
r973 | |||
sauimone
|
r1321 | The signal is emitted if the user clicks with a mouse on top of QBarSet \a barset. | ||
Clicked bar inside set is indexed by \a index | ||||
Tero Ahola
|
r973 | */ | ||
Tero Ahola
|
r1489 | /*! | ||
\qmlsignal BarSeries::onClicked(BarSet barset, int index) | ||||
The signal is emitted if the user clicks with a mouse on top of BarSet. | ||||
Clicked bar inside set is indexed by \a index | ||||
*/ | ||||
Tero Ahola
|
r973 | |||
sauimone
|
r980 | /*! | ||
\fn void QBarSeries::hovered(QBarSet* barset, bool status) | ||||
The signal is emitted if mouse is hovered on top of series. | ||||
Parameter \a barset is the pointer of barset, where hover happened. | ||||
Parameter \a status is true, if mouse entered on top of series, false if mouse left from top of series. | ||||
*/ | ||||
Tero Ahola
|
r1489 | /*! | ||
\qmlsignal BarSeries::onHovered(BarSet barset, bool status) | ||||
The signal is emitted if mouse is hovered on top of series. | ||||
Parameter \a barset is the pointer of barset, where hover happened. | ||||
Parameter \a status is true, if mouse entered on top of series, false if mouse left from top of series. | ||||
*/ | ||||
sauimone
|
r1460 | |||
/*! | ||||
Tero Ahola
|
r1462 | \fn void QBarSeries::countChanged() | ||
Tero Ahola
|
r1489 | This signal is emitted when barset count has been changed, for example by append or remove. | ||
*/ | ||||
/*! | ||||
\qmlsignal BarSeries::countChanged() | ||||
sauimone
|
r1460 | This signal is emitted when barset count has been changed, for example by append or remove. | ||
*/ | ||||
sauimone
|
r980 | |||
Marek Rosa
|
r1361 | /*! | ||
\fn void QBarSeries::labelsVisibleChanged() | ||||
Tero Ahola
|
r1489 | This signal is emitted when labels visibility have changed. | ||
Marek Rosa
|
r1362 | \sa isLabelsVisible(), setLabelsVisible() | ||
Marek Rosa
|
r1361 | */ | ||
/*! | ||||
\fn void QBarSeries::barsetsAdded(QList<QBarSet*> sets) | ||||
This signal is emitted when \a sets have been added to the series. | ||||
\sa append(), insert() | ||||
*/ | ||||
Tero Ahola
|
r1506 | /*! | ||
\qmlsignal BarSeries::added(BarSet barset) | ||||
Emitted when \a barset has been added to the series. | ||||
*/ | ||||
Marek Rosa
|
r1361 | |||
/*! | ||||
\fn void QBarSeries::barsetsRemoved(QList<QBarSet*> sets) | ||||
This signal is emitted when \a sets have been removed from the series. | ||||
\sa remove() | ||||
*/ | ||||
Tero Ahola
|
r1506 | /*! | ||
\qmlsignal BarSeries::removed(BarSet barset) | ||||
Emitted when \a barset has been removed from the series. | ||||
*/ | ||||
Marek Rosa
|
r1361 | |||
sauimone
|
r313 | /*! | ||
sauimone
|
r1208 | Constructs empty QBarSeries. | ||
sauimone
|
r338 | QBarSeries is QObject which is a child of a \a parent. | ||
sauimone
|
r313 | */ | ||
sauimone
|
r1208 | QBarSeries::QBarSeries(QObject *parent) : | ||
QAbstractSeries(*new QBarSeriesPrivate(this),parent) | ||||
Michal Klocek
|
r938 | { | ||
} | ||||
sauimone
|
r980 | /*! | ||
Destructs barseries and owned barsets. | ||||
*/ | ||||
QBarSeries::~QBarSeries() | ||||
{ | ||||
sauimone
|
r1263 | Q_D(QBarSeries); | ||
if(d->m_dataset){ | ||||
d->m_dataset->removeSeries(this); | ||||
} | ||||
sauimone
|
r980 | } | ||
Tero Ahola
|
r973 | /*! | ||
\internal | ||||
*/ | ||||
QBarSeries::QBarSeries(QBarSeriesPrivate &d, QObject *parent) : | ||||
Tero Ahola
|
r988 | QAbstractSeries(d,parent) | ||
Michal Klocek
|
r943 | { | ||
} | ||||
sauimone
|
r980 | /*! | ||
Returns the type of series. Derived classes override this. | ||||
*/ | ||||
Michal Klocek
|
r1107 | QAbstractSeries::SeriesType QBarSeries::type() const | ||
sauimone
|
r71 | { | ||
Tero Ahola
|
r988 | return QAbstractSeries::SeriesTypeBar; | ||
sauimone
|
r71 | } | ||
sauimone
|
r1493 | /*! | ||
Sets the width of the bars of the series. The unit of \a width is the unit of x-axis. The minimum width for bars | ||||
is zero and negative values are treated as zero. Setting the width to zero means that width of the bar on screen | ||||
is one pixel no matter what the scale of x-axis is. Bars wider than zero are scaled with x-axis. | ||||
Note that with \link QGroupedBarSeries \endlink this value means the width of one group of bars instead of just one bar. | ||||
*/ | ||||
sauimone
|
r1425 | void QBarSeries::setBarWidth(qreal width) | ||
sauimone
|
r1283 | { | ||
Q_D(QBarSeries); | ||||
sauimone
|
r1425 | d->setBarWidth(width); | ||
sauimone
|
r1283 | } | ||
sauimone
|
r1493 | /*! | ||
Returns the width of the bars of the series. | ||||
\sa setBarWidth() | ||||
*/ | ||||
sauimone
|
r1425 | qreal QBarSeries::barWidth() const | ||
sauimone
|
r1284 | { | ||
Q_D(const QBarSeries); | ||||
sauimone
|
r1425 | return d->barWidth(); | ||
sauimone
|
r1284 | } | ||
sauimone
|
r313 | /*! | ||
sauimone
|
r1208 | Adds a set of bars to series. Takes ownership of \a set. If the set is null or is already in series, it won't be appended. | ||
Returns true, if appending succeeded. | ||||
sauimone
|
r313 | */ | ||
sauimone
|
r1194 | bool QBarSeries::append(QBarSet *set) | ||
sauimone
|
r171 | { | ||
sauimone
|
r934 | Q_D(QBarSeries); | ||
sauimone
|
r1353 | bool success = d->append(set); | ||
if (success) { | ||||
QList<QBarSet*> sets; | ||||
sets.append(set); | ||||
emit barsetsAdded(sets); | ||||
Tero Ahola
|
r1462 | emit countChanged(); | ||
sauimone
|
r1353 | } | ||
return success; | ||||
sauimone
|
r171 | } | ||
sauimone
|
r313 | /*! | ||
Michal Klocek
|
r974 | Removes a set of bars from series. Releases ownership of \a set. Doesn't delete \a set. | ||
sauimone
|
r1208 | Returns true, if set was removed. | ||
sauimone
|
r313 | */ | ||
sauimone
|
r1194 | bool QBarSeries::remove(QBarSet *set) | ||
sauimone
|
r171 | { | ||
sauimone
|
r934 | Q_D(QBarSeries); | ||
sauimone
|
r1353 | bool success = d->remove(set); | ||
if (success) { | ||||
QList<QBarSet*> sets; | ||||
sets.append(set); | ||||
emit barsetsRemoved(sets); | ||||
Tero Ahola
|
r1462 | emit countChanged(); | ||
sauimone
|
r1353 | } | ||
return success; | ||||
sauimone
|
r850 | } | ||
/*! | ||||
Adds a list of barsets to series. Takes ownership of \a sets. | ||||
sauimone
|
r1208 | Returns true, if all sets were appended succesfully. If any of the sets is null or is already appended to series, | ||
nothing is appended and function returns false. If any of the sets is in list more than once, nothing is appended | ||||
and function returns false. | ||||
sauimone
|
r850 | */ | ||
sauimone
|
r1194 | bool QBarSeries::append(QList<QBarSet* > sets) | ||
sauimone
|
r850 | { | ||
sauimone
|
r934 | Q_D(QBarSeries); | ||
sauimone
|
r1353 | bool success = d->append(sets); | ||
if (success) { | ||||
emit barsetsAdded(sets); | ||||
Tero Ahola
|
r1462 | emit countChanged(); | ||
sauimone
|
r1353 | } | ||
return success; | ||||
sauimone
|
r850 | } | ||
Marek Rosa
|
r1362 | /*! | ||
Insert a set of bars to series at \a index postion. Takes ownership of \a set. If the set is null or is already in series, it won't be appended. | ||||
Returns true, if inserting succeeded. | ||||
*/ | ||||
bool QBarSeries::insert(int index, QBarSet *set) | ||||
{ | ||||
Q_D(QBarSeries); | ||||
bool success = d->insert(index, set); | ||||
if (success) { | ||||
QList<QBarSet*> sets; | ||||
sets.append(set); | ||||
emit barsetsAdded(sets); | ||||
Tero Ahola
|
r1462 | emit countChanged(); | ||
Marek Rosa
|
r1362 | } | ||
return success; | ||||
} | ||||
Marek Rosa
|
r1356 | /*! | ||
Removes all of the bar sets from the series | ||||
*/ | ||||
Marek Rosa
|
r1295 | void QBarSeries::clear() | ||
{ | ||||
Q_D(QBarSeries); | ||||
Marek Rosa
|
r1364 | QList<QBarSet *> sets = barSets(); | ||
bool success = d->remove(sets); | ||||
Marek Rosa
|
r1363 | if (success) { | ||
emit barsetsRemoved(sets); | ||||
Tero Ahola
|
r1462 | emit countChanged(); | ||
Marek Rosa
|
r1363 | } | ||
Marek Rosa
|
r1295 | } | ||
sauimone
|
r313 | /*! | ||
Returns number of sets in series. | ||||
*/ | ||||
Tero Ahola
|
r1462 | int QBarSeries::count() const | ||
sauimone
|
r214 | { | ||
sauimone
|
r934 | Q_D(const QBarSeries); | ||
sauimone
|
r1005 | return d->m_barSets.count(); | ||
sauimone
|
r214 | } | ||
sauimone
|
r313 | /*! | ||
sauimone
|
r357 | Returns a list of sets in series. Keeps ownership of sets. | ||
*/ | ||||
sauimone
|
r776 | QList<QBarSet*> QBarSeries::barSets() const | ||
sauimone
|
r214 | { | ||
sauimone
|
r934 | Q_D(const QBarSeries); | ||
sauimone
|
r1005 | return d->m_barSets; | ||
sauimone
|
r214 | } | ||
sauimone
|
r839 | /*! | ||
Sets the visibility of labels in series to \a visible | ||||
*/ | ||||
sauimone
|
r820 | void QBarSeries::setLabelsVisible(bool visible) | ||
sauimone
|
r813 | { | ||
sauimone
|
r1246 | Q_D(QBarSeries); | ||
if (d->m_labelsVisible != visible) { | ||||
sauimone
|
r1353 | d->setLabelsVisible(visible); | ||
emit labelsVisibleChanged(); | ||||
sauimone
|
r813 | } | ||
} | ||||
sauimone
|
r1299 | /*! | ||
Returns the visibility of labels | ||||
*/ | ||||
Marek Rosa
|
r1362 | bool QBarSeries::isLabelsVisible() const | ||
sauimone
|
r1246 | { | ||
Q_D(const QBarSeries); | ||||
return d->m_labelsVisible; | ||||
} | ||||
Michal Klocek
|
r938 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
sauimone
|
r1167 | QBarSeriesPrivate::QBarSeriesPrivate(QBarSeries *q) : | ||
Tero Ahola
|
r988 | QAbstractSeriesPrivate(q), | ||
sauimone
|
r1425 | m_barWidth(0.5), // Default value is 50% of category width | ||
sauimone
|
r1284 | m_labelsVisible(false), | ||
m_visible(true) | ||||
Michal Klocek
|
r938 | { | ||
} | ||||
sauimone
|
r1208 | int QBarSeriesPrivate::categoryCount() const | ||
{ | ||||
// No categories defined. return count of longest set. | ||||
int count = 0; | ||||
for (int i=0; i<m_barSets.count(); i++) { | ||||
if (m_barSets.at(i)->count() > count) { | ||||
count = m_barSets.at(i)->count(); | ||||
} | ||||
} | ||||
return count; | ||||
} | ||||
sauimone
|
r1425 | void QBarSeriesPrivate::setBarWidth(qreal width) | ||
sauimone
|
r1167 | { | ||
sauimone
|
r1425 | if (width < 0.0) { | ||
width = 0.0; | ||||
sauimone
|
r1167 | } | ||
sauimone
|
r1425 | m_barWidth = width; | ||
sauimone
|
r1167 | emit updatedBars(); | ||
} | ||||
sauimone
|
r1425 | qreal QBarSeriesPrivate::barWidth() const | ||
sauimone
|
r1167 | { | ||
sauimone
|
r1425 | return m_barWidth; | ||
sauimone
|
r1167 | } | ||
sauimone
|
r1112 | |||
Michal Klocek
|
r938 | QBarSet* QBarSeriesPrivate::barsetAt(int index) | ||
{ | ||||
sauimone
|
r1005 | return m_barSets.at(index); | ||
Michal Klocek
|
r938 | } | ||
sauimone
|
r1284 | void QBarSeriesPrivate::setVisible(bool visible) | ||
{ | ||||
sauimone
|
r1353 | m_visible = visible; | ||
emit updatedBars(); | ||||
sauimone
|
r1284 | } | ||
sauimone
|
r1353 | void QBarSeriesPrivate::setLabelsVisible(bool visible) | ||
sauimone
|
r1284 | { | ||
sauimone
|
r1353 | m_labelsVisible = visible; | ||
emit labelsVisibleChanged(visible); | ||||
sauimone
|
r1284 | } | ||
Michal Klocek
|
r938 | qreal QBarSeriesPrivate::min() | ||
{ | ||||
sauimone
|
r1005 | if (m_barSets.count() <= 0) { | ||
return 0; | ||||
} | ||||
qreal min = INT_MAX; | ||||
for (int i = 0; i < m_barSets.count(); i++) { | ||||
int categoryCount = m_barSets.at(i)->count(); | ||||
for (int j = 0; j < categoryCount; j++) { | ||||
sauimone
|
r1167 | qreal temp = m_barSets.at(i)->at(j).y(); | ||
sauimone
|
r1005 | if (temp < min) | ||
min = temp; | ||||
} | ||||
} | ||||
return min; | ||||
Michal Klocek
|
r938 | } | ||
qreal QBarSeriesPrivate::max() | ||||
{ | ||||
sauimone
|
r1005 | if (m_barSets.count() <= 0) { | ||
return 0; | ||||
} | ||||
qreal max = INT_MIN; | ||||
for (int i = 0; i < m_barSets.count(); i++) { | ||||
int categoryCount = m_barSets.at(i)->count(); | ||||
for (int j = 0; j < categoryCount; j++) { | ||||
sauimone
|
r1167 | qreal temp = m_barSets.at(i)->at(j).y(); | ||
sauimone
|
r1005 | if (temp > max) | ||
max = temp; | ||||
} | ||||
} | ||||
return max; | ||||
Michal Klocek
|
r938 | } | ||
qreal QBarSeriesPrivate::valueAt(int set, int category) | ||||
{ | ||||
sauimone
|
r1005 | if ((set < 0) || (set >= m_barSets.count())) { | ||
// No set, no value. | ||||
return 0; | ||||
} else if ((category < 0) || (category >= m_barSets.at(set)->count())) { | ||||
// No category, no value. | ||||
return 0; | ||||
} | ||||
sauimone
|
r1167 | return m_barSets.at(set)->at(category).y(); | ||
Michal Klocek
|
r938 | } | ||
qreal QBarSeriesPrivate::percentageAt(int set, int category) | ||||
{ | ||||
sauimone
|
r1005 | if ((set < 0) || (set >= m_barSets.count())) { | ||
// No set, no value. | ||||
return 0; | ||||
} else if ((category < 0) || (category >= m_barSets.at(set)->count())) { | ||||
// No category, no value. | ||||
return 0; | ||||
} | ||||
sauimone
|
r1167 | qreal value = m_barSets.at(set)->at(category).y(); | ||
sauimone
|
r1005 | qreal sum = categorySum(category); | ||
if ( qFuzzyIsNull(sum) ) { | ||||
return 0; | ||||
} | ||||
return value / sum; | ||||
Michal Klocek
|
r938 | } | ||
qreal QBarSeriesPrivate::categorySum(int category) | ||||
{ | ||||
sauimone
|
r1005 | qreal sum(0); | ||
int count = m_barSets.count(); // Count sets | ||||
for (int set = 0; set < count; set++) { | ||||
if (category < m_barSets.at(set)->count()) | ||||
sauimone
|
r1167 | sum += m_barSets.at(set)->at(category).y(); | ||
sauimone
|
r1005 | } | ||
return sum; | ||||
Michal Klocek
|
r938 | } | ||
qreal QBarSeriesPrivate::absoluteCategorySum(int category) | ||||
{ | ||||
sauimone
|
r1005 | qreal sum(0); | ||
int count = m_barSets.count(); // Count sets | ||||
for (int set = 0; set < count; set++) { | ||||
if (category < m_barSets.at(set)->count()) | ||||
sauimone
|
r1167 | sum += qAbs(m_barSets.at(set)->at(category).y()); | ||
sauimone
|
r1005 | } | ||
return sum; | ||||
Michal Klocek
|
r938 | } | ||
qreal QBarSeriesPrivate::maxCategorySum() | ||||
{ | ||||
sauimone
|
r1005 | qreal max = INT_MIN; | ||
sauimone
|
r1208 | int count = categoryCount(); | ||
sauimone
|
r1005 | for (int i = 0; i < count; i++) { | ||
qreal sum = categorySum(i); | ||||
if (sum > max) | ||||
max = sum; | ||||
} | ||||
return max; | ||||
Michal Klocek
|
r938 | } | ||
sauimone
|
r1423 | qreal QBarSeriesPrivate::minX() | ||
{ | ||||
if (m_barSets.count() <= 0) { | ||||
return 0; | ||||
} | ||||
qreal min = INT_MAX; | ||||
for (int i = 0; i < m_barSets.count(); i++) { | ||||
int categoryCount = m_barSets.at(i)->count(); | ||||
for (int j = 0; j < categoryCount; j++) { | ||||
qreal temp = m_barSets.at(i)->at(j).x(); | ||||
if (temp < min) | ||||
min = temp; | ||||
} | ||||
} | ||||
return min; | ||||
} | ||||
qreal QBarSeriesPrivate::maxX() | ||||
{ | ||||
if (m_barSets.count() <= 0) { | ||||
return 0; | ||||
} | ||||
qreal max = INT_MIN; | ||||
for (int i = 0; i < m_barSets.count(); i++) { | ||||
int categoryCount = m_barSets.at(i)->count(); | ||||
for (int j = 0; j < categoryCount; j++) { | ||||
qreal temp = m_barSets.at(i)->at(j).x(); | ||||
if (temp > max) | ||||
max = temp; | ||||
} | ||||
} | ||||
return max; | ||||
} | ||||
Michal Klocek
|
r943 | void QBarSeriesPrivate::scaleDomain(Domain& domain) | ||
{ | ||||
qreal minX(domain.minX()); | ||||
qreal minY(domain.minY()); | ||||
qreal maxX(domain.maxX()); | ||||
qreal maxY(domain.maxY()); | ||||
int tickXCount(domain.tickXCount()); | ||||
int tickYCount(domain.tickYCount()); | ||||
sauimone
|
r1423 | qreal seriesMinX = this->minX(); | ||
qreal seriesMaxX = this->maxX(); | ||||
sauimone
|
r962 | qreal y = max(); | ||
sauimone
|
r1423 | minX = qMin(minX, seriesMinX - 0.5); | ||
Michal Klocek
|
r943 | minY = qMin(minY, y); | ||
sauimone
|
r1423 | maxX = qMax(maxX, seriesMaxX + 0.5); | ||
Michal Klocek
|
r943 | maxY = qMax(maxY, y); | ||
sauimone
|
r1423 | tickXCount = categoryCount()+1; | ||
Michal Klocek
|
r943 | |||
Michal Klocek
|
r1078 | domain.setRange(minX,maxX,minY,maxY,tickXCount,tickYCount); | ||
Michal Klocek
|
r943 | } | ||
Chart* QBarSeriesPrivate::createGraphics(ChartPresenter* presenter) | ||||
{ | ||||
Q_Q(QBarSeries); | ||||
BarChartItem* bar = new BarChartItem(q,presenter); | ||||
if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { | ||||
presenter->animator()->addAnimation(bar); | ||||
} | ||||
presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); | ||||
return bar; | ||||
} | ||||
Michal Klocek
|
r950 | QList<LegendMarker*> QBarSeriesPrivate::createLegendMarker(QLegend* legend) | ||
{ | ||||
Q_Q(QBarSeries); | ||||
QList<LegendMarker*> markers; | ||||
foreach(QBarSet* set, q->barSets()) { | ||||
BarLegendMarker* marker = new BarLegendMarker(q,set,legend); | ||||
markers << marker; | ||||
} | ||||
return markers; | ||||
} | ||||
sauimone
|
r1263 | bool QBarSeriesPrivate::append(QBarSet *set) | ||
{ | ||||
Q_Q(QBarSeries); | ||||
if ((m_barSets.contains(set)) || (set == 0)) { | ||||
// Fail if set is already in list or set is null. | ||||
return false; | ||||
} | ||||
m_barSets.append(set); | ||||
sauimone
|
r1339 | QObject::connect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); | ||
QObject::connect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); | ||||
sauimone
|
r1437 | emit restructuredBars(); // this notifies barchartitem | ||
sauimone
|
r1263 | if (m_dataset) { | ||
m_dataset->updateSeries(q); // this notifies legend | ||||
} | ||||
return true; | ||||
} | ||||
bool QBarSeriesPrivate::remove(QBarSet *set) | ||||
{ | ||||
Q_Q(QBarSeries); | ||||
if (!m_barSets.contains(set)) { | ||||
// Fail if set is not in list | ||||
return false; | ||||
} | ||||
m_barSets.removeOne(set); | ||||
sauimone
|
r1339 | QObject::disconnect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); | ||
QObject::disconnect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); | ||||
sauimone
|
r1437 | emit restructuredBars(); // this notifies barchartitem | ||
sauimone
|
r1263 | if (m_dataset) { | ||
m_dataset->updateSeries(q); // this notifies legend | ||||
} | ||||
return true; | ||||
} | ||||
bool QBarSeriesPrivate::append(QList<QBarSet* > sets) | ||||
{ | ||||
Q_Q(QBarSeries); | ||||
foreach (QBarSet* set, sets) { | ||||
if ((set == 0) || (m_barSets.contains(set))) { | ||||
// Fail if any of the sets is null or is already appended. | ||||
return false; | ||||
} | ||||
if (sets.count(set) != 1) { | ||||
// Also fail if same set is more than once in given list. | ||||
return false; | ||||
} | ||||
} | ||||
foreach (QBarSet* set, sets) { | ||||
m_barSets.append(set); | ||||
sauimone
|
r1339 | QObject::connect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); | ||
QObject::connect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); | ||||
sauimone
|
r1263 | } | ||
sauimone
|
r1437 | emit restructuredBars(); // this notifies barchartitem | ||
sauimone
|
r1263 | if (m_dataset) { | ||
m_dataset->updateSeries(q); // this notifies legend | ||||
} | ||||
return true; | ||||
} | ||||
bool QBarSeriesPrivate::remove(QList<QBarSet* > sets) | ||||
{ | ||||
Q_Q(QBarSeries); | ||||
sauimone
|
r1371 | if (sets.count() == 0) { | ||
return false; | ||||
} | ||||
sauimone
|
r1263 | foreach (QBarSet* set, sets) { | ||
sauimone
|
r1353 | if ((set == 0) || (!m_barSets.contains(set))) { | ||
// Fail if any of the sets is null or is not in series | ||||
return false; | ||||
} | ||||
if (sets.count(set) != 1) { | ||||
// Also fail if same set is more than once in given list. | ||||
return false; | ||||
sauimone
|
r1263 | } | ||
} | ||||
sauimone
|
r1353 | foreach (QBarSet* set, sets) { | ||
m_barSets.removeOne(set); | ||||
QObject::disconnect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); | ||||
QObject::disconnect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); | ||||
sauimone
|
r1263 | } | ||
sauimone
|
r1353 | |||
sauimone
|
r1437 | emit restructuredBars(); // this notifies barchartitem | ||
sauimone
|
r1353 | if (m_dataset) { | ||
m_dataset->updateSeries(q); // this notifies legend | ||||
} | ||||
return true; | ||||
sauimone
|
r1263 | } | ||
Marek Rosa
|
r1362 | bool QBarSeriesPrivate::insert(int index, QBarSet *set) | ||
{ | ||||
Q_Q(QBarSeries); | ||||
if ((m_barSets.contains(set)) || (set == 0)) { | ||||
// Fail if set is already in list or set is null. | ||||
return false; | ||||
} | ||||
m_barSets.insert(index, set); | ||||
QObject::connect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); | ||||
QObject::connect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); | ||||
sauimone
|
r1437 | emit restructuredBars(); // this notifies barchartitem | ||
Marek Rosa
|
r1362 | if (m_dataset) { | ||
m_dataset->updateSeries(q); // this notifies legend | ||||
} | ||||
return true; | ||||
} | ||||
sauimone
|
r338 | #include "moc_qbarseries.cpp" | ||
Michal Klocek
|
r938 | #include "moc_qbarseries_p.cpp" | ||
sauimone
|
r71 | |||
sauimone
|
r56 | QTCOMMERCIALCHART_END_NAMESPACE | ||