##// END OF EJS Templates
Fix bug/typo in chartdataset
Jani Honkonen -
r828:efd18f904bfe
parent child
Show More
@@ -1,334 +1,334
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2012 Digia Plc
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "chartdataset_p.h"
21 #include "chartdataset_p.h"
22 #include "qchartaxis.h"
22 #include "qchartaxis.h"
23 //series
23 //series
24 #include "qlineseries.h"
24 #include "qlineseries.h"
25 #include "qareaseries.h"
25 #include "qareaseries.h"
26 #include "qbarseries.h"
26 #include "qbarseries.h"
27 #include "qstackedbarseries.h"
27 #include "qstackedbarseries.h"
28 #include "qpercentbarseries.h"
28 #include "qpercentbarseries.h"
29 #include "qpieseries.h"
29 #include "qpieseries.h"
30 #include "qscatterseries.h"
30 #include "qscatterseries.h"
31 #include "qsplineseries.h"
31 #include "qsplineseries.h"
32
32
33 QTCOMMERCIALCHART_BEGIN_NAMESPACE
33 QTCOMMERCIALCHART_BEGIN_NAMESPACE
34
34
35 ChartDataSet::ChartDataSet(QObject *parent):QObject(parent),
35 ChartDataSet::ChartDataSet(QObject *parent):QObject(parent),
36 m_axisX(new QChartAxis(this)),
36 m_axisX(new QChartAxis(this)),
37 m_axisY(new QChartAxis(this)),
37 m_axisY(new QChartAxis(this)),
38 m_domainIndex(0),
38 m_domainIndex(0),
39 m_axisXInitialized(false)
39 m_axisXInitialized(false)
40 {
40 {
41 }
41 }
42
42
43 ChartDataSet::~ChartDataSet()
43 ChartDataSet::~ChartDataSet()
44 {
44 {
45 }
45 }
46
46
47 void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY)
47 void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY)
48 {
48 {
49 if(axisY==0) axisY = m_axisY;
49 if(axisY==0) axisY = m_axisY;
50
50
51 if (seriesIndex(series) > -1) {
51 if (seriesIndex(series) > -1) {
52 qWarning() << "Can not add series. Series already on the chart";
52 qWarning() << "Can not add series. Series already on the chart";
53 return;
53 return;
54 }
54 }
55
55
56 if(!series->parent()){
56 if(!series->parent()){
57 series->setParent(this); // take ownership
57 series->setParent(this); // take ownership
58 };
58 };
59
59
60 if(!axisY->parent()){
60 if(!axisY->parent()){
61 axisY->setParent(this); // take ownership
61 axisY->setParent(this); // take ownership
62 }
62 }
63
63
64 Domain* domain = m_axisDomainMap.value(axisY);
64 Domain* domain = m_axisDomainMap.value(axisY);
65 if (!domain) {
65 if (!domain) {
66 domain = new Domain(axisY);
66 domain = new Domain(axisY);
67 QObject::connect(axisY,SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisYChanged(qreal,qreal,int,bool)));
67 QObject::connect(axisY,SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisYChanged(qreal,qreal,int,bool)));
68 QObject::connect(axisX(),SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisXChanged(qreal,qreal,int,bool)));
68 QObject::connect(axisX(),SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisXChanged(qreal,qreal,int,bool)));
69 QObject::connect(domain,SIGNAL(rangeYChanged(qreal,qreal,int)),axisY,SLOT(handleAxisRangeChanged(qreal,qreal,int)));
69 QObject::connect(domain,SIGNAL(rangeYChanged(qreal,qreal,int)),axisY,SLOT(handleAxisRangeChanged(qreal,qreal,int)));
70 QObject::connect(domain,SIGNAL(rangeXChanged(qreal,qreal,int)),axisX(),SLOT(handleAxisRangeChanged(qreal,qreal,int)));
70 QObject::connect(domain,SIGNAL(rangeXChanged(qreal,qreal,int)),axisX(),SLOT(handleAxisRangeChanged(qreal,qreal,int)));
71 //initialize
71 //initialize
72 m_axisDomainMap.insert(axisY,domain);
72 m_axisDomainMap.insert(axisY,domain);
73 emit axisAdded(axisY,domain);
73 emit axisAdded(axisY,domain);
74 }
74 }
75
75
76 if (!m_axisXInitialized) {
76 if (!m_axisXInitialized) {
77 emit axisAdded(axisX(), domain);
77 emit axisAdded(axisX(), domain);
78 m_axisXInitialized = true;
78 m_axisXInitialized = true;
79 }
79 }
80
80
81 calculateDomain(series, domain);
81 calculateDomain(series, domain);
82
82
83 m_seriesAxisList.append(QPair<QSeries*, QChartAxis*>(series, axisY));
83 m_seriesAxisList.append(QPair<QSeries*, QChartAxis*>(series, axisY));
84
84
85 emit seriesAdded(series, domain);
85 emit seriesAdded(series, domain);
86 }
86 }
87
87
88 void ChartDataSet::removeSeries(QSeries* series)
88 void ChartDataSet::removeSeries(QSeries* series)
89 {
89 {
90 int index = seriesIndex(series);
90 int index = seriesIndex(series);
91 if (!index < 0) {
91 if (index < 0) {
92 qWarning() << "Can not remove series. Series not found on the chart.";
92 qWarning() << "Can not remove series. Series not found on the chart.";
93 return;
93 return;
94 }
94 }
95
95
96 // Remove the series and the axis from the container
96 // Remove the series and the axis from the container
97 QChartAxis* axis = m_seriesAxisList.at(index).second;
97 QChartAxis* axis = m_seriesAxisList.at(index).second;
98 m_seriesAxisList.removeAt(index);
98 m_seriesAxisList.removeAt(index);
99
99
100 // Delete the series
100 // Delete the series
101 emit seriesRemoved(series);
101 emit seriesRemoved(series);
102 if (series->parent() == this) {
102 if (series->parent() == this) {
103 delete series;
103 delete series;
104 series = 0;
104 series = 0;
105 }
105 }
106
106
107 // Check if the Y axis is still in use
107 // Check if the Y axis is still in use
108 bool yAxisInUse(false);
108 bool yAxisInUse(false);
109 for (int i(0); i < m_seriesAxisList.count(); i++) {
109 for (int i(0); i < m_seriesAxisList.count(); i++) {
110 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.at(i);
110 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.at(i);
111 if (pair.second == axis)
111 if (pair.second == axis)
112 yAxisInUse = true;
112 yAxisInUse = true;
113 }
113 }
114
114
115 // Remove the Y axis if not in use
115 // Remove the Y axis if not in use
116 if (!yAxisInUse) {
116 if (!yAxisInUse) {
117 Domain* domain = m_axisDomainMap.take(axis);
117 Domain* domain = m_axisDomainMap.take(axis);
118 emit axisRemoved(axis);
118 emit axisRemoved(axis);
119 if (axis != axisY()) {
119 if (axis != axisY()) {
120 // Delete the Y axis unless it is the default one
120 // Delete the Y axis unless it is the default one
121 if (axis->parent() == this) {
121 if (axis->parent() == this) {
122 delete axis;
122 delete axis;
123 axis = 0;
123 axis = 0;
124 }
124 }
125 }
125 }
126 delete domain;
126 delete domain;
127 }
127 }
128
128
129 // Remove the x axis in case there are no y-axes left
129 // Remove the x axis in case there are no y-axes left
130 if (m_seriesAxisList.count() == 0) {
130 if (m_seriesAxisList.count() == 0) {
131 m_axisXInitialized = false;
131 m_axisXInitialized = false;
132 emit axisRemoved(axisX());
132 emit axisRemoved(axisX());
133 }
133 }
134 }
134 }
135
135
136 void ChartDataSet::removeAllSeries()
136 void ChartDataSet::removeAllSeries()
137 {
137 {
138 while (m_seriesAxisList.count()) {
138 while (m_seriesAxisList.count()) {
139 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.last();
139 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.last();
140 removeSeries(pair.first);
140 removeSeries(pair.first);
141 }
141 }
142
142
143 Q_ASSERT(m_seriesAxisList.count() == 0);
143 Q_ASSERT(m_seriesAxisList.count() == 0);
144 Q_ASSERT(m_axisDomainMap.count() == 0);
144 Q_ASSERT(m_axisDomainMap.count() == 0);
145 }
145 }
146
146
147 //to be removed with PIMPL
147 //to be removed with PIMPL
148 void ChartDataSet::calculateDomain(QSeries* series,Domain* domain)
148 void ChartDataSet::calculateDomain(QSeries* series,Domain* domain)
149 {
149 {
150 qreal minX(domain->minX());
150 qreal minX(domain->minX());
151 qreal minY(domain->minY());
151 qreal minY(domain->minY());
152 qreal maxX(domain->maxX());
152 qreal maxX(domain->maxX());
153 qreal maxY(domain->maxY());
153 qreal maxY(domain->maxY());
154 int tickXCount(domain->tickXCount());
154 int tickXCount(domain->tickXCount());
155 int tickYCount(domain->tickYCount());
155 int tickYCount(domain->tickYCount());
156
156
157
157
158 switch(series->type())
158 switch(series->type())
159 {
159 {
160 case QSeries::SeriesTypeLine:
160 case QSeries::SeriesTypeLine:
161 case QSeries::SeriesTypeSpline:
161 case QSeries::SeriesTypeSpline:
162 case QSeries::SeriesTypeScatter:
162 case QSeries::SeriesTypeScatter:
163 {
163 {
164
164
165 QXYSeries* xySeries = static_cast<QXYSeries*>(series);
165 QXYSeries* xySeries = static_cast<QXYSeries*>(series);
166
166
167 for (int i = 0; i < xySeries->count(); i++)
167 for (int i = 0; i < xySeries->count(); i++)
168 {
168 {
169 qreal x = xySeries->x(i);
169 qreal x = xySeries->x(i);
170 qreal y = xySeries->y(i);
170 qreal y = xySeries->y(i);
171 minX = qMin(minX, x);
171 minX = qMin(minX, x);
172 minY = qMin(minY, y);
172 minY = qMin(minY, y);
173 maxX = qMax(maxX, x);
173 maxX = qMax(maxX, x);
174 maxY = qMax(maxY, y);
174 maxY = qMax(maxY, y);
175 }
175 }
176 break;
176 break;
177 }
177 }
178 case QSeries::SeriesTypeArea: {
178 case QSeries::SeriesTypeArea: {
179
179
180 QAreaSeries* areaSeries = static_cast<QAreaSeries*>(series);
180 QAreaSeries* areaSeries = static_cast<QAreaSeries*>(series);
181 QLineSeries* upperSeries = areaSeries->upperSeries();
181 QLineSeries* upperSeries = areaSeries->upperSeries();
182 QLineSeries* lowerSeries = areaSeries->lowerSeries();
182 QLineSeries* lowerSeries = areaSeries->lowerSeries();
183
183
184 for (int i = 0; i < upperSeries->count(); i++)
184 for (int i = 0; i < upperSeries->count(); i++)
185 {
185 {
186 qreal x = upperSeries->x(i);
186 qreal x = upperSeries->x(i);
187 qreal y = upperSeries->y(i);
187 qreal y = upperSeries->y(i);
188 minX = qMin(minX, x);
188 minX = qMin(minX, x);
189 minY = qMin(minY, y);
189 minY = qMin(minY, y);
190 maxX = qMax(maxX, x);
190 maxX = qMax(maxX, x);
191 maxY = qMax(maxY, y);
191 maxY = qMax(maxY, y);
192 }
192 }
193 if(lowerSeries) {
193 if(lowerSeries) {
194 for (int i = 0; i < lowerSeries->count(); i++)
194 for (int i = 0; i < lowerSeries->count(); i++)
195 {
195 {
196 qreal x = lowerSeries->x(i);
196 qreal x = lowerSeries->x(i);
197 qreal y = lowerSeries->y(i);
197 qreal y = lowerSeries->y(i);
198 minX = qMin(minX, x);
198 minX = qMin(minX, x);
199 minY = qMin(minY, y);
199 minY = qMin(minY, y);
200 maxX = qMax(maxX, x);
200 maxX = qMax(maxX, x);
201 maxY = qMax(maxY, y);
201 maxY = qMax(maxY, y);
202 }}
202 }}
203 break;
203 break;
204 }
204 }
205 case QSeries::SeriesTypeBar: {
205 case QSeries::SeriesTypeBar: {
206
206
207 QBarSeries* barSeries = static_cast<QBarSeries*>(series);
207 QBarSeries* barSeries = static_cast<QBarSeries*>(series);
208 qreal x = barSeries->categoryCount();
208 qreal x = barSeries->categoryCount();
209 qreal y = barSeries->max();
209 qreal y = barSeries->max();
210 minX = qMin(minX, x);
210 minX = qMin(minX, x);
211 minY = qMin(minY, y);
211 minY = qMin(minY, y);
212 maxX = qMax(maxX, x);
212 maxX = qMax(maxX, x);
213 maxY = qMax(maxY, y);
213 maxY = qMax(maxY, y);
214 tickXCount = x+1;
214 tickXCount = x+1;
215 setupCategories(barSeries);
215 setupCategories(barSeries);
216 break;
216 break;
217 }
217 }
218 case QSeries::SeriesTypeStackedBar: {
218 case QSeries::SeriesTypeStackedBar: {
219
219
220 QStackedBarSeries* stackedBarSeries = static_cast<QStackedBarSeries*>(series);
220 QStackedBarSeries* stackedBarSeries = static_cast<QStackedBarSeries*>(series);
221 qreal x = stackedBarSeries->categoryCount();
221 qreal x = stackedBarSeries->categoryCount();
222 qreal y = stackedBarSeries->maxCategorySum();
222 qreal y = stackedBarSeries->maxCategorySum();
223 minX = qMin(minX, x);
223 minX = qMin(minX, x);
224 minY = qMin(minY, y);
224 minY = qMin(minY, y);
225 maxX = qMax(maxX, x);
225 maxX = qMax(maxX, x);
226 maxY = qMax(maxY, y);
226 maxY = qMax(maxY, y);
227 tickXCount = x+1;
227 tickXCount = x+1;
228 setupCategories(stackedBarSeries);
228 setupCategories(stackedBarSeries);
229 break;
229 break;
230 }
230 }
231 case QSeries::SeriesTypePercentBar: {
231 case QSeries::SeriesTypePercentBar: {
232
232
233 QPercentBarSeries* percentBarSeries = static_cast<QPercentBarSeries*>(series);
233 QPercentBarSeries* percentBarSeries = static_cast<QPercentBarSeries*>(series);
234 qreal x = percentBarSeries->categoryCount();
234 qreal x = percentBarSeries->categoryCount();
235 minX = qMin(minX, x);
235 minX = qMin(minX, x);
236 maxX = qMax(maxX, x);
236 maxX = qMax(maxX, x);
237 minY = 0;
237 minY = 0;
238 maxY = 100;
238 maxY = 100;
239 setupCategories(percentBarSeries);
239 setupCategories(percentBarSeries);
240 break;
240 break;
241 }
241 }
242
242
243 case QSeries::SeriesTypePie: {
243 case QSeries::SeriesTypePie: {
244 //QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
244 //QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
245 // TODO: domain stuff
245 // TODO: domain stuff
246 break;
246 break;
247 }
247 }
248
248
249
249
250 default: {
250 default: {
251 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
251 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
252 return;
252 return;
253 }
253 }
254
254
255 }
255 }
256
256
257 domain->setRangeX(minX,maxX,tickXCount);
257 domain->setRangeX(minX,maxX,tickXCount);
258 domain->setRangeY(minY,maxY,tickYCount);
258 domain->setRangeY(minY,maxY,tickYCount);
259 }
259 }
260
260
261
261
262 void ChartDataSet::setupCategories(QBarSeries* series)
262 void ChartDataSet::setupCategories(QBarSeries* series)
263 {
263 {
264 QChartAxisCategories* categories = axisX()->categories();
264 QChartAxisCategories* categories = axisX()->categories();
265 categories->clear();
265 categories->clear();
266 categories->insert(series->categories());
266 categories->insert(series->categories());
267 }
267 }
268
268
269 void ChartDataSet::zoomInDomain(const QRectF& rect, const QSizeF& size)
269 void ChartDataSet::zoomInDomain(const QRectF& rect, const QSizeF& size)
270 {
270 {
271 QMapIterator<QChartAxis*, Domain*> i(m_axisDomainMap);
271 QMapIterator<QChartAxis*, Domain*> i(m_axisDomainMap);
272 while (i.hasNext()) {
272 while (i.hasNext()) {
273 i.next();
273 i.next();
274 i.value()->zoomIn(rect,size);
274 i.value()->zoomIn(rect,size);
275 }
275 }
276 }
276 }
277
277
278 void ChartDataSet::zoomOutDomain(const QRectF& rect, const QSizeF& size)
278 void ChartDataSet::zoomOutDomain(const QRectF& rect, const QSizeF& size)
279 {
279 {
280 QMapIterator<QChartAxis*, Domain*> i(m_axisDomainMap);
280 QMapIterator<QChartAxis*, Domain*> i(m_axisDomainMap);
281 while (i.hasNext()) {
281 while (i.hasNext()) {
282 i.next();
282 i.next();
283 i.value()->zoomOut(rect,size);
283 i.value()->zoomOut(rect,size);
284 }
284 }
285 }
285 }
286
286
287 int ChartDataSet::seriesIndex(QSeries *series) const
287 int ChartDataSet::seriesIndex(QSeries *series) const
288 {
288 {
289 for (int i(0); i < m_seriesAxisList.count(); i++) {
289 for (int i(0); i < m_seriesAxisList.count(); i++) {
290 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.at(i);
290 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.at(i);
291 if (pair.first == series)
291 if (pair.first == series)
292 return i;
292 return i;
293 }
293 }
294 return -1;
294 return -1;
295 }
295 }
296
296
297 QChartAxis* ChartDataSet::axisY(QSeries* series) const
297 QChartAxis* ChartDataSet::axisY(QSeries* series) const
298 {
298 {
299 if (series == 0)
299 if (series == 0)
300 return m_axisY;
300 return m_axisY;
301
301
302 return m_seriesAxisList.at(seriesIndex(series)).second;
302 return m_seriesAxisList.at(seriesIndex(series)).second;
303 }
303 }
304
304
305 Domain* ChartDataSet::domain(QSeries* series) const
305 Domain* ChartDataSet::domain(QSeries* series) const
306 {
306 {
307 QChartAxis* axis = m_seriesAxisList.at(seriesIndex(series)).second;
307 QChartAxis* axis = m_seriesAxisList.at(seriesIndex(series)).second;
308 if (axis)
308 if (axis)
309 return m_axisDomainMap.value(axis);
309 return m_axisDomainMap.value(axis);
310 return 0;
310 return 0;
311 }
311 }
312
312
313 Domain* ChartDataSet::domain(QChartAxis* axis) const
313 Domain* ChartDataSet::domain(QChartAxis* axis) const
314 {
314 {
315 if(!axis || axis==axisX()) {
315 if(!axis || axis==axisX()) {
316 return m_axisDomainMap.value(axisY());
316 return m_axisDomainMap.value(axisY());
317 }
317 }
318 else {
318 else {
319 return m_axisDomainMap.value(axis);
319 return m_axisDomainMap.value(axis);
320 }
320 }
321 }
321 }
322
322
323 void ChartDataSet::scrollDomain(int dx,int dy,const QSizeF& size)
323 void ChartDataSet::scrollDomain(int dx,int dy,const QSizeF& size)
324 {
324 {
325 QMapIterator<QChartAxis*, Domain*> i( m_axisDomainMap);
325 QMapIterator<QChartAxis*, Domain*> i( m_axisDomainMap);
326 while (i.hasNext()) {
326 while (i.hasNext()) {
327 i.next();
327 i.next();
328 i.value()->move(dx,dy,size);
328 i.value()->move(dx,dy,size);
329 }
329 }
330 }
330 }
331
331
332 #include "moc_chartdataset_p.cpp"
332 #include "moc_chartdataset_p.cpp"
333
333
334 QTCOMMERCIALCHART_END_NAMESPACE
334 QTCOMMERCIALCHART_END_NAMESPACE
General Comments 0
You need to be logged in to leave comments. Login now