##// END OF EJS Templates
Bug fix for bar presenters. It appears that order of childItems may change. Relying on order caused crash
Bug fix for bar presenters. It appears that order of childItems may change. Relying on order caused crash

File last commit:

r248:ded845353666
r256:bd68fc4fe7ab
Show More
chartdataset.cpp
334 lines | 9.7 KiB | text/x-c | CppLexer
/ src / chartdataset.cpp
Michal Klocek
Refactors qchart , adds line animation...
r131 #include "chartdataset_p.h"
Michal Klocek
Refactors axis handling...
r223 #include "qchartaxis.h"
Michal Klocek
Refactored for MVP...
r139 //series
Michal Klocek
Fix previous broken commit
r145 #include "qlinechartseries.h"
sauimone
Common naming convention for barcharts
r216 #include "qbarchartseries.h"
#include "qstackedbarchartseries.h"
#include "qpercentbarchartseries.h"
Jani Honkonen
Moved pie stuff to own .pri file and rename stuff
r146 #include "qpieseries.h"
Tero Ahola
Integrated scatter again. Missing functionality....
r158 #include "qscatterseries.h"
Michal Klocek
Refactors qchart , adds line animation...
r131
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Michal Klocek
Refactors axis handling...
r223 ChartDataSet::ChartDataSet(QObject *parent):QObject(parent),
m_axisX(new QChartAxis(this)),
m_axisY(new QChartAxis(this)),
m_domainIndex(0),
m_axisXInitialized(false)
Michal Klocek
Refactors qchart , adds line animation...
r131 {
}
ChartDataSet::~ChartDataSet()
{
// TODO Auto-generated destructor stub
}
Michal Klocek
Refactors axis handling...
r223 const Domain ChartDataSet::domain(QChartAxis *axisY) const
Michal Klocek
Refactors qchart , adds line animation...
r131 {
Michal Klocek
Refactors axis handling...
r223 int i = m_domainMap.count(axisY);
if(i == 0){
return Domain();
}
i = i - m_domainIndex -1;
return m_domainMap.values(axisY).at(i);
Michal Klocek
Refactors qchart , adds line animation...
r131 }
Michal Klocek
Refactors axis handling...
r223 void ChartDataSet::addSeries(QChartSeries* series, QChartAxis *axisY)
Michal Klocek
Refactors qchart , adds line animation...
r131 {
Michal Klocek
Refactored for MVP...
r139 // TODO: we should check the series not already added
Jani Honkonen
Fix a major memory leak
r229 series->setParent(this); // take ownership
Michal Klocek
Refactors axis handling...
r223 clearDomains();
if(axisY==0) axisY = m_axisY;
Michal Klocek
Add ownerships takeover to chartaxis
r248 axisY->setParent(this); // take ownership
Michal Klocek
Refactors axis handling...
r223
QList<QChartSeries*> seriesList = m_seriesMap.values(axisY);
QList<Domain> domainList = m_domainMap.values(axisY);
Q_ASSERT(domainList.size()<=1);
Domain domain;
if(domainList.size()>0) domain = domainList.at(0);
Michal Klocek
Refactored for MVP...
r139
switch(series->type())
{
case QChartSeries::SeriesTypeLine: {
Michal Klocek
Fix previous broken commit
r145 QLineChartSeries* xyseries = static_cast<QLineChartSeries*>(series);
Michal Klocek
Refactored for MVP...
r139
for (int i = 0; i < xyseries->count(); i++)
{
qreal x = xyseries->x(i);
qreal y = xyseries->y(i);
domain.m_minX = qMin(domain.m_minX,x);
domain.m_minY = qMin(domain.m_minY,y);
domain.m_maxX = qMax(domain.m_maxX,x);
domain.m_maxY = qMax(domain.m_maxY,y);
}
break;
}
case QChartSeries::SeriesTypeBar: {
sauimone
fixed bug in category implementation. model now owns the category and sets
r173 qDebug() << "QChartSeries::SeriesTypeBar";
sauimone
Common naming convention for barcharts
r216 QBarChartSeries* barSeries = static_cast<QBarChartSeries*>(series);
sauimone
removed barchartseriesbase. functionality is now in model
r172 qreal x = barSeries->countCategories();
Michal Klocek
Refactored for MVP...
r139 qreal y = barSeries->max();
domain.m_minX = qMin(domain.m_minX,x);
domain.m_minY = qMin(domain.m_minY,y);
domain.m_maxX = qMax(domain.m_maxX,x);
domain.m_maxY = qMax(domain.m_maxY,y);
sauimone
added labels to series, intergrated with test app. minor hack to test app
r167 break;
Michal Klocek
Refactored for MVP...
r139 }
case QChartSeries::SeriesTypeStackedBar: {
sauimone
fixed bug in category implementation. model now owns the category and sets
r173 qDebug() << "QChartSeries::SeriesTypeStackedBar";
Michal Klocek
Refactored for MVP...
r139
sauimone
Common naming convention for barcharts
r216 QStackedBarChartSeries* stackedBarSeries = static_cast<QStackedBarChartSeries*>(series);
sauimone
removed barchartseriesbase. functionality is now in model
r172 qreal x = stackedBarSeries->countCategories();
qreal y = stackedBarSeries->maxCategorySum();
Michal Klocek
Refactored for MVP...
r139 domain.m_minX = qMin(domain.m_minX,x);
domain.m_minY = qMin(domain.m_minY,y);
domain.m_maxX = qMax(domain.m_maxX,x);
domain.m_maxY = qMax(domain.m_maxY,y);
break;
sauimone
added labels to series, intergrated with test app. minor hack to test app
r167 }
Michal Klocek
Refactored for MVP...
r139 case QChartSeries::SeriesTypePercentBar: {
sauimone
fixed bug in category implementation. model now owns the category and sets
r173 qDebug() << "QChartSeries::SeriesTypePercentBar";
Michal Klocek
Refactored for MVP...
r139
sauimone
Common naming convention for barcharts
r216 QPercentBarChartSeries* percentBarSeries = static_cast<QPercentBarChartSeries*>(series);
sauimone
removed barchartseriesbase. functionality is now in model
r172 qreal x = percentBarSeries->countCategories();
Michal Klocek
Refactored for MVP...
r139 domain.m_minX = qMin(domain.m_minX,x);
domain.m_minY = 0;
domain.m_maxX = qMax(domain.m_maxX,x);
domain.m_maxY = 100;
break;
sauimone
added labels to series, intergrated with test app. minor hack to test app
r167 }
Michal Klocek
Refactored for MVP...
r139
Jani Honkonen
Pie chart refactoring
r142 case QChartSeries::SeriesTypePie: {
QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
// TODO: domain stuff
break;
}
Tero Ahola
Integrated scatter again. Missing functionality....
r158 case QChartSeries::SeriesTypeScatter: {
QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
Q_ASSERT(scatterSeries);
foreach (QPointF point, scatterSeries->data()) {
domain.m_minX = qMin(domain.m_minX, point.x());
domain.m_maxX = qMax(domain.m_maxX, point.x());
domain.m_minY = qMin(domain.m_minY, point.y());
domain.m_maxY = qMax(domain.m_maxY, point.y());
}
break;
}
Michal Klocek
Refactored for MVP...
r139 default: {
qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
return;
break;
}
}
Michal Klocek
Refactors axis handling...
r223 if(!m_domainMap.contains(axisY))
{
emit axisAdded(axisY);
QObject::connect(axisY,SIGNAL(minChanged(qreal)),this,SLOT(handleMinChanged(qreal)));
QObject::connect(axisY,SIGNAL(maxChanged(qreal)),this,SLOT(handleMaxChanged(qreal)));
QObject::connect(axisY,SIGNAL(ticksChanged(QChartAxis*)),this,SLOT(handleTickChanged(QChartAxis*)));
}
m_domainMap.replace(axisY,domain);
m_seriesMap.insert(axisY,series);
if(!m_axisXInitialized)
{
emit axisAdded(axisX());
QObject::connect(axisX(),SIGNAL(minChanged(qreal)),this,SLOT(handleMinChanged(qreal)));
QObject::connect(axisX(),SIGNAL(maxChanged(qreal)),this,SLOT(handleMaxChanged(qreal)));
QObject::connect(axisX(),SIGNAL(ticksChanged(QChartAxis*)),this,SLOT(handleTickChanged(QChartAxis*)));
m_axisXInitialized=true;
}
Michal Klocek
Refactored for MVP...
r139 emit seriesAdded(series);
Michal Klocek
Refactors axis handling...
r223 QStringList ylabels = createLabels(axisY,domain.m_minY,domain.m_maxY);
QStringList xlabels = createLabels(axisX(),domain.m_minX,domain.m_maxX);
emit axisLabelsChanged(axisY,ylabels);
emit axisLabelsChanged(axisX(),xlabels);
emit seriesDomainChanged(series,domain);
}
void ChartDataSet::removeSeries(QChartSeries* series)
{
QList<QChartAxis*> keys = m_seriesMap.uniqueKeys();
foreach(QChartAxis* axis , keys) {
if(m_seriesMap.contains(axis,series)){
emit seriesRemoved(series);
m_seriesMap.remove(axis,series);
//remove axis if no longer there
if(!m_seriesMap.contains(axis) && axis != m_axisY){
emit axisRemoved(axis);
m_domainMap.remove(axis);
delete axis;
}
break;
}
}
Michal Klocek
Refactored for MVP...
r139 }
bool ChartDataSet::nextDomain()
{
Michal Klocek
Refactors axis handling...
r223 int limit = (m_domainMap.values().size()/m_domainMap.uniqueKeys().size())-1;
if (m_domainIndex < limit) {
Michal Klocek
Refactored for MVP...
r139 m_domainIndex++;
Michal Klocek
Refactors axis handling...
r223 setDomain(m_domainIndex);
Michal Klocek
Refactored for MVP...
r139 return true;
}
else {
return false;
}
}
bool ChartDataSet::previousDomain()
{
if (m_domainIndex > 0) {
m_domainIndex--;
Michal Klocek
Refactors axis handling...
r223 setDomain(m_domainIndex);
Michal Klocek
Refactored for MVP...
r139 return true;
}
else {
return false;
}
}
Michal Klocek
Refactors axis handling...
r223 void ChartDataSet::setDomain(int index)
Michal Klocek
Refactored for MVP...
r139 {
Michal Klocek
Refactors axis handling...
r223 QList<QChartAxis*> domainList = m_domainMap.uniqueKeys();
foreach (QChartAxis* axis , domainList) {
int i = m_domainMap.count(axis) - index -1;
Q_ASSERT(i>=0);
Domain domain = m_domainMap.values(axis).at(i);
QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY);
QList<QChartSeries*> seriesList = m_seriesMap.values(axis);
foreach(QChartSeries* series, seriesList) {
emit seriesDomainChanged(series,domain);
}
emit axisLabelsChanged(axis,labels);
}
Domain domain = m_domainMap.value(axisY());
QStringList labels = createLabels(axisX(),domain.m_minX,domain.m_maxX);
emit axisLabelsChanged(axisX(),labels);
}
void ChartDataSet::clearDomains(int toIndex)
{
Q_ASSERT(toIndex>=0);
m_domainIndex = toIndex;
QList<QChartAxis*> keys = m_domainMap.uniqueKeys();
foreach (QChartAxis* key , keys)
{
QList<Domain> domains = m_domainMap.values(key);
m_domainMap.remove(key);
int i = domains.size() - toIndex - 1;
while(i--){
domains.removeFirst();
}
for(int j=domains.size()-1; j>=0 ;j--)
m_domainMap.insert(key,domains.at(j));
Michal Klocek
Refactored for MVP...
r139 }
}
Michal Klocek
Refactors axis handling...
r223 void ChartDataSet::addDomain(const QRectF& rect, const QRectF& viewport)
Michal Klocek
Refactored for MVP...
r139 {
Michal Klocek
Refactors axis handling...
r223 Q_ASSERT(rect.isValid());
Q_ASSERT(viewport.isValid());
clearDomains(m_domainIndex);
QList<QChartAxis*> domainList = m_domainMap.uniqueKeys();
foreach (QChartAxis* axis , domainList){
Domain domain(m_domainMap.value(axis).subDomain(rect,viewport.width(),viewport.height()));
QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY);
QList<QChartSeries*> seriesList = m_seriesMap.values(axis);
foreach(QChartSeries* series, seriesList){
emit seriesDomainChanged(series,domain);
}
emit axisLabelsChanged(axis,labels);
m_domainMap.insert(axis,domain);
}
Domain domain = m_domainMap.value(axisY());
QStringList labels = createLabels(axisX(),domain.m_minX,domain.m_maxX);
emit axisLabelsChanged(axisX(),labels);
Michal Klocek
Refactored for MVP...
r139 m_domainIndex++;
Michal Klocek
Refactors axis handling...
r223 }
QChartAxis* ChartDataSet::axisY(QChartSeries* series) const
{
if(series == 0) return m_axisY;
QList<QChartAxis*> keys = m_seriesMap.uniqueKeys();
foreach(QChartAxis* axis , keys) {
if(m_seriesMap.contains(axis,series)){
return axis;
}
}
return 0;
}
QStringList ChartDataSet::createLabels(QChartAxis* axis,qreal min, qreal max)
{
Q_ASSERT(max>=min);
Michal Klocek
Refactored for MVP...
r139
Michal Klocek
Refactors axis handling...
r223 QStringList labels;
Michal Klocek
Bugfix shades not updated aftet tick changed
r241 int ticks = axis->ticksCount()-1;
Michal Klocek
Refactors axis handling...
r223
for(int i=0; i<= ticks; i++){
qreal value = min + (i * (max - min)/ ticks);
QString label = axis->axisTickLabel(value);
if(label.isEmpty()){
labels << QString::number(value);
}else{
labels << label;
}
}
return labels;
}
void ChartDataSet::handleMinChanged(qreal min)
{
}
void ChartDataSet::handleMaxChanged(qreal max)
{
}
void ChartDataSet::handleTickChanged(QChartAxis* axis)
{
Domain domain = m_domainMap.value(axisY());
if(axis==axisX()){
QStringList labels = createLabels(axis,domain.m_minX,domain.m_maxX);
emit axisLabelsChanged(axis,labels);
}else{
QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY);
emit axisLabelsChanged(axis,labels);
}
Michal Klocek
Refactors qchart , adds line animation...
r131 }
#include "moc_chartdataset_p.cpp"
QTCOMMERCIALCHART_END_NAMESPACE