chartpresenter.cpp
265 lines
| 9.0 KiB
| text/x-c
|
CppLexer
/ src / chartpresenter.cpp
Michal Klocek
|
r139 | #include "qchart.h" | ||
Michal Klocek
|
r140 | #include "qchartaxis.h" | ||
Michal Klocek
|
r131 | #include "chartpresenter_p.h" | ||
#include "chartdataset_p.h" | ||||
Michal Klocek
|
r143 | #include "charttheme_p.h" | ||
Michal Klocek
|
r139 | //series | ||
#include "barchartseries.h" | ||||
#include "stackedbarchartseries.h" | ||||
#include "percentbarchartseries.h" | ||||
Michal Klocek
|
r145 | #include "qlinechartseries.h" | ||
Jani Honkonen
|
r142 | #include "qpieseries.h" | ||
Tero Ahola
|
r158 | #include "qscatterseries.h" | ||
Michal Klocek
|
r139 | //items | ||
Michal Klocek
|
r140 | #include "axisitem_p.h" | ||
Michal Klocek
|
r139 | #include "bargroup.h" | ||
#include "stackedbargroup.h" | ||||
Michal Klocek
|
r145 | #include "linechartitem_p.h" | ||
Michal Klocek
|
r139 | #include "percentbargroup.h" | ||
Michal Klocek
|
r131 | #include "linechartanimationitem_p.h" | ||
Jani Honkonen
|
r146 | #include "piepresenter.h" | ||
Tero Ahola
|
r158 | #include "scatterpresenter.h" | ||
Michal Klocek
|
r131 | |||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(chart), | ||||
m_chart(chart), | ||||
m_dataset(dataset), | ||||
Michal Klocek
|
r143 | m_chartTheme(0), | ||
Michal Klocek
|
r139 | m_domainIndex(0), | ||
m_marginSize(0), | ||||
Michal Klocek
|
r155 | m_axisX(new QChartAxis(this)), | ||
m_axisY(new QChartAxis(this)), | ||||
Michal Klocek
|
r131 | m_rect(QRectF(QPoint(0,0),m_chart->size())) | ||
{ | ||||
Michal Klocek
|
r153 | setChartTheme(QChart::ChartThemeDefault); | ||
Michal Klocek
|
r155 | m_axisItems[m_axisX] = new AxisItem(m_axisX,AxisItem::X_AXIS,m_chart); | ||
m_axisItems[m_axisY] = new AxisItem(m_axisY,AxisItem::Y_AXIS,m_chart); | ||||
Michal Klocek
|
r140 | createConnections(); | ||
Michal Klocek
|
r131 | } | ||
ChartPresenter::~ChartPresenter() | ||||
{ | ||||
} | ||||
Michal Klocek
|
r140 | void ChartPresenter::createConnections() | ||
Michal Klocek
|
r131 | { | ||
QObject::connect(m_chart,SIGNAL(geometryChanged()),this,SLOT(handleGeometryChanged())); | ||||
QObject::connect(m_dataset,SIGNAL(seriesAdded(QChartSeries*)),this,SLOT(handleSeriesAdded(QChartSeries*))); | ||||
Michal Klocek
|
r155 | |||
QMapIterator<QChartAxis*,AxisItem*> i(m_axisItems); | ||||
while (i.hasNext()) { | ||||
i.next(); | ||||
QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),i.value(),SLOT(handleGeometryChanged(const QRectF&))); | ||||
QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),i.value(),SLOT(handleDomainChanged(const Domain&))); | ||||
} | ||||
Michal Klocek
|
r131 | } | ||
void ChartPresenter::handleGeometryChanged() | ||||
{ | ||||
m_rect = QRectF(QPoint(0,0),m_chart->size()); | ||||
Michal Klocek
|
r139 | m_rect.adjust(m_marginSize,m_marginSize, -m_marginSize, -m_marginSize); | ||
Michal Klocek
|
r147 | Q_ASSERT(m_rect.isValid()); | ||
Michal Klocek
|
r139 | emit geometryChanged(m_rect); | ||
} | ||||
Michal Klocek
|
r131 | |||
Michal Klocek
|
r139 | int ChartPresenter::margin() const | ||
{ | ||||
return m_marginSize; | ||||
} | ||||
Michal Klocek
|
r131 | |||
Michal Klocek
|
r139 | void ChartPresenter::setMargin(int margin) | ||
{ | ||||
m_marginSize = margin; | ||||
Michal Klocek
|
r131 | } | ||
void ChartPresenter::handleSeriesAdded(QChartSeries* series) | ||||
{ | ||||
sauimone
|
r173 | qDebug() << " ChartPresenter::handleSeriesAdded"; | ||
Michal Klocek
|
r131 | switch(series->type()) | ||
{ | ||||
case QChartSeries::SeriesTypeLine: { | ||||
Michal Klocek
|
r145 | QLineChartSeries* lineSeries = static_cast<QLineChartSeries*>(series); | ||
LineChartItem* item = new LineChartAnimationItem(this,lineSeries,m_chart); | ||||
Michal Klocek
|
r143 | m_chartTheme->decorate(item,lineSeries,m_chartItems.count()); | ||
Michal Klocek
|
r139 | QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&))); | ||
QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&))); | ||||
QObject::connect(lineSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int))); | ||||
m_chartItems.insert(series,item); | ||||
break; | ||||
} | ||||
case QChartSeries::SeriesTypeBar: { | ||||
BarChartSeries* barSeries = static_cast<BarChartSeries*>(series); | ||||
sauimone
|
r172 | BarGroup* item = new BarGroup(barSeries->model(),m_chart); | ||
Michal Klocek
|
r143 | m_chartTheme->decorate(item,barSeries,m_chartItems.count()); | ||
Michal Klocek
|
r139 | QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&))); | ||
QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&))); | ||||
QObject::connect(barSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int))); | ||||
Michal Klocek
|
r131 | m_chartItems.insert(series,item); | ||
Michal Klocek
|
r139 | // m_axisXItem->setVisible(false); | ||
Michal Klocek
|
r131 | break; | ||
} | ||||
Michal Klocek
|
r139 | case QChartSeries::SeriesTypeStackedBar: { | ||
StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series); | ||||
sauimone
|
r172 | StackedBarGroup* item = new StackedBarGroup(stackedBarSeries->model(),m_chart); | ||
Michal Klocek
|
r143 | m_chartTheme->decorate(item,stackedBarSeries,m_chartItems.count()); | ||
Michal Klocek
|
r139 | QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&))); | ||
QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&))); | ||||
QObject::connect(stackedBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int))); | ||||
m_chartItems.insert(series,item); | ||||
break; | ||||
} | ||||
case QChartSeries::SeriesTypePercentBar: { | ||||
PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series); | ||||
sauimone
|
r172 | PercentBarGroup* item = new PercentBarGroup(percentBarSeries->model(),m_chart); | ||
Michal Klocek
|
r143 | m_chartTheme->decorate(item,percentBarSeries ,m_chartItems.count()); | ||
Michal Klocek
|
r139 | QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&))); | ||
QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&))); | ||||
QObject::connect(percentBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int))); | ||||
m_chartItems.insert(series,item); | ||||
break; | ||||
Michal Klocek
|
r140 | } | ||
Tero Ahola
|
r158 | case QChartSeries::SeriesTypeScatter: { | ||
QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series); | ||||
ScatterPresenter *scatterPresenter = new ScatterPresenter(scatterSeries, m_chart); | ||||
QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), | ||||
scatterPresenter, SLOT(handleGeometryChanged(const QRectF&))); | ||||
QObject::connect(m_dataset, SIGNAL(domainChanged(const Domain&)), | ||||
scatterPresenter, SLOT(handleDomainChanged(const Domain&))); | ||||
// scatterSeries->d->m_theme = m_chartTheme->themeForSeries(); | ||||
// scatterSeries->d->setParentItem(this); | ||||
// scatterSeries->d->m_boundingRect = m_rect.adjusted(margin(),margin(), -margin(), -margin()); | ||||
m_chartItems.insert(scatterSeries, scatterPresenter); | ||||
break; | ||||
} | ||||
Jani Honkonen
|
r142 | case QChartSeries::SeriesTypePie: { | ||
Jani Honkonen
|
r163 | QPieSeries *s = qobject_cast<QPieSeries *>(series); | ||
PiePresenter* pie = new PiePresenter(m_chart, s); | ||||
Jani Honkonen
|
r166 | m_chartTheme->decorate(pie, s, m_chartItems.count()); | ||
Jani Honkonen
|
r146 | QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), pie, SLOT(handleGeometryChanged(const QRectF&))); | ||
QObject::connect(m_dataset, SIGNAL(domainChanged(const Domain&)), pie, SLOT(handleDomainChanged(const Domain&))); | ||||
m_chartItems.insert(series, pie); | ||||
Jani Honkonen
|
r142 | break; | ||
} | ||||
Michal Klocek
|
r131 | default: { | ||
Michal Klocek
|
r139 | qDebug()<< "Series type" << series->type() << "not implemented."; | ||
break; | ||||
Michal Klocek
|
r131 | } | ||
} | ||||
Michal Klocek
|
r148 | |||
if(m_rect.isValid()) emit geometryChanged(m_rect); | ||||
Michal Klocek
|
r131 | } | ||
void ChartPresenter::handleSeriesChanged(QChartSeries* series) | ||||
{ | ||||
Michal Klocek
|
r140 | //TODO: | ||
Michal Klocek
|
r139 | } | ||
void ChartPresenter::zoomInToRect(const QRectF& rect) | ||||
{ | ||||
if(!rect.isValid()) return; | ||||
QRectF r = rect.normalized(); | ||||
r.translate(-m_marginSize, -m_marginSize); | ||||
Michal Klocek
|
r151 | Domain domain (m_dataset->domain().subDomain(r,m_rect.width(),m_rect.height())); | ||
Michal Klocek
|
r139 | m_dataset->addDomain(domain); | ||
} | ||||
Michal Klocek
|
r131 | |||
Michal Klocek
|
r139 | void ChartPresenter::zoomIn() | ||
{ | ||||
if (!m_dataset->nextDomain()) { | ||||
QRectF rect = m_rect; | ||||
rect.setWidth(rect.width()/2); | ||||
rect.setHeight(rect.height()/2); | ||||
rect.moveCenter(m_rect.center()); | ||||
Domain domain (m_dataset->domain().subDomain(rect,m_rect.width(),m_rect.height())); | ||||
m_dataset->addDomain(domain); | ||||
} | ||||
} | ||||
Michal Klocek
|
r131 | |||
Michal Klocek
|
r139 | void ChartPresenter::zoomOut() | ||
{ | ||||
m_dataset->previousDomain(); | ||||
Michal Klocek
|
r131 | } | ||
Michal Klocek
|
r139 | void ChartPresenter::zoomReset() | ||
{ | ||||
m_dataset->clearDomains(); | ||||
} | ||||
Michal Klocek
|
r153 | void ChartPresenter::setChartTheme(QChart::ChartTheme theme) | ||
Michal Klocek
|
r143 | { | ||
delete m_chartTheme; | ||||
m_chartTheme = ChartTheme::createTheme(theme); | ||||
m_chartTheme->decorate(m_chart); | ||||
QMapIterator<QChartSeries*,ChartItem*> i(m_chartItems); | ||||
int index=0; | ||||
while (i.hasNext()) { | ||||
i.next(); | ||||
index++; | ||||
m_chartTheme->decorate(i.value(),i.key(),index); | ||||
} | ||||
} | ||||
Michal Klocek
|
r153 | QChart::ChartTheme ChartPresenter::chartTheme() | ||
Michal Klocek
|
r143 | { | ||
Michal Klocek
|
r153 | return m_chartTheme->id(); | ||
} | ||||
Michal Klocek
|
r155 | QChartAxis* ChartPresenter::axisX() | ||
Michal Klocek
|
r153 | { | ||
Michal Klocek
|
r155 | return m_axisX; | ||
} | ||||
Michal Klocek
|
r153 | |||
Michal Klocek
|
r155 | QChartAxis* ChartPresenter::axisY() | ||
{ | ||||
return m_axisY; | ||||
} | ||||
QChartAxis* ChartPresenter::addAxisX() | ||||
{ | ||||
//only one axis | ||||
if(m_axisX==0){ | ||||
m_axisX = new QChartAxis(this); | ||||
m_axisItems[m_axisX] = new AxisItem(m_axisX,AxisItem::X_AXIS,m_chart); | ||||
} | ||||
return m_axisX; | ||||
Michal Klocek
|
r153 | } | ||
Michal Klocek
|
r155 | QChartAxis* ChartPresenter::addAxisY() | ||
Michal Klocek
|
r153 | { | ||
Michal Klocek
|
r155 | if(m_axisY==0){ | ||
m_axisY = new QChartAxis(this); | ||||
m_axisItems[m_axisY] = new AxisItem(m_axisY,AxisItem::Y_AXIS,m_chart); | ||||
return m_axisY; | ||||
} | ||||
QChartAxis* axis = new QChartAxis(this); | ||||
m_axisItems[axis] = new AxisItem(axis,AxisItem::Y_AXIS,m_chart); | ||||
return axis; | ||||
} | ||||
Michal Klocek
|
r153 | |||
Michal Klocek
|
r155 | void ChartPresenter::removeAxis(QChartAxis* axis) | ||
{ | ||||
AxisItem* item = m_axisItems.take(axis); | ||||
if(item){ | ||||
delete item; | ||||
delete axis; | ||||
} | ||||
//reset pointers to default ones | ||||
if(axis == m_axisX) m_axisX=0; | ||||
else if(axis == m_axisY) m_axisY=0; | ||||
Michal Klocek
|
r143 | } | ||
Michal Klocek
|
r131 | #include "moc_chartpresenter_p.cpp" | ||
QTCOMMERCIALCHART_END_NAMESPACE | ||||