barchartmodel.cpp
172 lines
| 3.7 KiB
| text/x-c
|
CppLexer
sauimone
|
r159 | #include <limits.h> | ||
sauimone
|
r161 | #include <QVector> | ||
#include <QDebug> | ||||
sauimone
|
r159 | #include "barchartmodel_p.h" | ||
sauimone
|
r169 | #include "qbarset.h" | ||
sauimone
|
r159 | |||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
sauimone
|
r377 | BarChartModel::BarChartModel(QStringList categories, QObject *parent) : | ||
sauimone
|
r159 | QObject(parent) | ||
sauimone
|
r377 | ,mCategory(categories) | ||
sauimone
|
r159 | { | ||
} | ||||
sauimone
|
r377 | QStringList BarChartModel::category() | ||
sauimone
|
r159 | { | ||
sauimone
|
r377 | return mCategory; | ||
sauimone
|
r169 | } | ||
sauimone
|
r173 | void BarChartModel::addBarSet(QBarSet *set) | ||
sauimone
|
r169 | { | ||
sauimone
|
r173 | mDataModel.append(set); | ||
sauimone
|
r169 | } | ||
sauimone
|
r173 | void BarChartModel::removeBarSet(QBarSet *set) | ||
{ | ||||
if (mDataModel.contains(set)) { | ||||
mDataModel.removeOne(set); | ||||
} | ||||
} | ||||
sauimone
|
r169 | |||
sauimone
|
r357 | QBarSet* BarChartModel::setAt(int index) | ||
sauimone
|
r214 | { | ||
sauimone
|
r357 | return mDataModel.at(index); | ||
sauimone
|
r214 | } | ||
sauimone
|
r357 | QList<QBarSet*> BarChartModel::barSets() | ||
sauimone
|
r214 | { | ||
sauimone
|
r357 | return mDataModel; | ||
sauimone
|
r214 | } | ||
sauimone
|
r524 | QList<QSeries::LegendEntry> BarChartModel::legendEntries() | ||
sauimone
|
r280 | { | ||
sauimone
|
r524 | QList<QSeries::LegendEntry> legend; | ||
sauimone
|
r280 | |||
for (int i=0; i<mDataModel.count(); i++) { | ||||
sauimone
|
r524 | QSeries::LegendEntry l; | ||
sauimone
|
r380 | l.mName = mDataModel.at(i)->name(); | ||
l.mPen = mDataModel.at(i)->pen(); | ||||
legend.append(l); | ||||
sauimone
|
r280 | } | ||
return legend; | ||||
} | ||||
sauimone
|
r387 | int BarChartModel::barsetCount() | ||
sauimone
|
r159 | { | ||
sauimone
|
r161 | return mDataModel.count(); | ||
sauimone
|
r159 | } | ||
sauimone
|
r387 | int BarChartModel::categoryCount() | ||
sauimone
|
r159 | { | ||
sauimone
|
r387 | return mCategory.count(); | ||
sauimone
|
r159 | } | ||
sauimone
|
r167 | qreal BarChartModel::min() | ||
sauimone
|
r159 | { | ||
sauimone
|
r161 | Q_ASSERT(mDataModel.count() > 0); | ||
sauimone
|
r159 | // TODO: make min and max members and update them when data changes. | ||
// This is slower since they are checked every time, even if data is same since previous call. | ||||
sauimone
|
r167 | qreal min = INT_MAX; | ||
sauimone
|
r159 | |||
sauimone
|
r161 | for (int i=0; i <mDataModel.count(); i++) { | ||
sauimone
|
r171 | int itemCount = mDataModel.at(i)->count(); | ||
sauimone
|
r161 | for (int j=0; j<itemCount; j++) { | ||
sauimone
|
r167 | qreal temp = mDataModel.at(i)->valueAt(j); | ||
sauimone
|
r161 | if (temp < min) { | ||
min = temp; | ||||
} | ||||
sauimone
|
r159 | } | ||
} | ||||
return min; | ||||
} | ||||
sauimone
|
r167 | qreal BarChartModel::max() | ||
sauimone
|
r159 | { | ||
sauimone
|
r161 | Q_ASSERT(mDataModel.count() > 0); | ||
sauimone
|
r159 | |||
// TODO: make min and max members and update them when data changes. | ||||
// This is slower since they are checked every time, even if data is same since previous call. | ||||
sauimone
|
r167 | qreal max = INT_MIN; | ||
sauimone
|
r159 | |||
sauimone
|
r161 | for (int i=0; i <mDataModel.count(); i++) { | ||
sauimone
|
r171 | int itemCount = mDataModel.at(i)->count(); | ||
sauimone
|
r161 | for (int j=0; j<itemCount; j++) { | ||
sauimone
|
r167 | qreal temp = mDataModel.at(i)->valueAt(j); | ||
sauimone
|
r161 | if (temp > max) { | ||
max = temp; | ||||
} | ||||
sauimone
|
r159 | } | ||
} | ||||
sauimone
|
r161 | |||
sauimone
|
r159 | return max; | ||
} | ||||
sauimone
|
r171 | qreal BarChartModel::valueAt(int set, int category) | ||
sauimone
|
r159 | { | ||
sauimone
|
r171 | if ((set < 0) || (set >= mDataModel.count())) { | ||
// No set, no value. | ||||
sauimone
|
r159 | return 0; | ||
sauimone
|
r171 | } else if ((category < 0) || (category >= mDataModel.at(set)->count())) { | ||
// No category, no value. | ||||
sauimone
|
r159 | return 0; | ||
} | ||||
sauimone
|
r171 | return mDataModel.at(set)->valueAt(category); | ||
sauimone
|
r161 | } | ||
sauimone
|
r263 | qreal BarChartModel::percentageAt(int set, int category) | ||
{ | ||||
if ((set < 0) || (set >= mDataModel.count())) { | ||||
// No set, no value. | ||||
return 0; | ||||
} else if ((category < 0) || (category >= mDataModel.at(set)->count())) { | ||||
// No category, no value. | ||||
return 0; | ||||
} | ||||
qreal value = mDataModel.at(set)->valueAt(category); | ||||
qreal total = categorySum(category); | ||||
if (0 == total) { | ||||
return 100.0; | ||||
} | ||||
return value / total; | ||||
} | ||||
qreal BarChartModel::categorySum(int category) | ||||
sauimone
|
r161 | { | ||
sauimone
|
r171 | qreal sum(0); | ||
sauimone
|
r263 | int count = mDataModel.count(); // Count sets | ||
sauimone
|
r161 | |||
sauimone
|
r263 | for (int set = 0; set < count; set++) { | ||
if (category < mDataModel.at(set)->count()) { | ||||
sum += mDataModel.at(set)->valueAt(category); | ||||
sauimone
|
r161 | } | ||
} | ||||
return sum; | ||||
} | ||||
sauimone
|
r171 | qreal BarChartModel::maxCategorySum() | ||
sauimone
|
r161 | { | ||
sauimone
|
r171 | qreal max = INT_MIN; | ||
sauimone
|
r387 | int count = categoryCount(); | ||
sauimone
|
r161 | |||
for (int col=0; col<count; col++) { | ||||
sauimone
|
r171 | qreal sum = categorySum(col); | ||
sauimone
|
r161 | if (sum > max) { | ||
max = sum; | ||||
} | ||||
} | ||||
return max; | ||||
sauimone
|
r159 | } | ||
sauimone
|
r412 | QString BarChartModel::categoryName(int category) | ||
sauimone
|
r172 | { | ||
sauimone
|
r377 | return mCategory.at(category); | ||
sauimone
|
r172 | } | ||
sauimone
|
r159 | #include "moc_barchartmodel_p.cpp" | ||
QTCOMMERCIALCHART_END_NAMESPACE | ||||