##// END OF EJS Templates
Blocks initalization of axes, TODO after release
Michal Klocek -
r1667:2b787e94878f
parent child
Show More
@@ -1,467 +1,467
1 1 /****************************************************************************
2 2 **
3 3 ** Copyright (C) 2012 Digia Plc
4 4 ** All rights reserved.
5 5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 6 **
7 7 ** This file is part of the Qt Commercial Charts Add-on.
8 8 **
9 9 ** $QT_BEGIN_LICENSE$
10 10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 11 ** accordance with the Qt Commercial License Agreement provided with the
12 12 ** Software or, alternatively, in accordance with the terms contained in
13 13 ** a written agreement between you and Digia.
14 14 **
15 15 ** If you have questions regarding the use of this file, please use
16 16 ** contact form at http://qt.digia.com
17 17 ** $QT_END_LICENSE$
18 18 **
19 19 ****************************************************************************/
20 20
21 21 #include "chartdataset_p.h"
22 22 #include "qchart.h"
23 23 #include "qvaluesaxis.h"
24 24 #include "qbarcategoriesaxis.h"
25 25 #include "qvaluesaxis_p.h"
26 26 #include "qabstractseries_p.h"
27 27 #include "qabstractbarseries.h"
28 28 #include "qstackedbarseries.h"
29 29 #include "qpercentbarseries.h"
30 30 #include "qpieseries.h"
31 31
32 32 QTCOMMERCIALCHART_BEGIN_NAMESPACE
33 33
34 34 ChartDataSet::ChartDataSet(QChart *parent):QObject(parent),
35 35 m_domainIndex(0)
36 36 {
37 37
38 38 }
39 39
40 40 ChartDataSet::~ChartDataSet()
41 41 {
42 42 removeAllSeries();
43 43 }
44 44
45 45 void ChartDataSet::addSeries(QAbstractSeries* series)
46 46 {
47 47 Domain* domain = m_seriesDomainMap.value(series);
48 48
49 49 if(domain) {
50 50 qWarning() << "Can not add series. Series already on the chart";
51 51 return;
52 52 }
53 53
54 54 series->setParent(this); // take ownership
55 55
56 56 domain = new Domain(series);
57 57
58 58 m_seriesDomainMap.insert(series,domain);
59 59
60 60 series->d_ptr->scaleDomain(*domain);
61 61
62 62 QMapIterator<int, QAbstractSeries*> i(m_indexSeriesMap);
63 63
64 64 int key=0;
65 65 while (i.hasNext()) {
66 66 i.next();
67 67 if(i.key()!=key) {
68 68 break;
69 69 }
70 70 key++;
71 71 }
72 72
73 73 m_indexSeriesMap.insert(key,series);
74 74
75 75 series->d_ptr->m_chart = qobject_cast<QChart*>(parent());
76 76 series->d_ptr->m_dataset = this;
77 77
78 78 emit seriesAdded(series,domain);
79 79
80 80 }
81 81
82 82 void ChartDataSet::createDefaultAxes()
83 83 {
84 84
85 85 if(m_seriesDomainMap.isEmpty()) return;
86 86
87 87 QAbstractAxis::AxisTypes typeX(0);
88 88 QAbstractAxis::AxisTypes typeY(0);
89 89
90 90 QMapIterator<QAbstractSeries*, Domain*> i(m_seriesDomainMap);
91 91 while (i.hasNext()) {
92 92 i.next();
93 93 removeAxes(i.key());
94 94 }
95 95
96 96 i.toFront();
97 97
98 98 while (i.hasNext()) {
99 99 i.next();
100 100 QAbstractAxis* axisX = m_seriesAxisXMap.value(i.key());
101 101 QAbstractAxis* axisY = m_seriesAxisYMap.value(i.key());
102 102 if(axisX) typeX&=axisX->type();
103 103 else typeX|=i.key()->d_ptr->defaultAxisXType();
104 104 if(axisY) typeY&=axisY->type();
105 105 else typeY|=i.key()->d_ptr->defaultAxisYType();
106 106 }
107 107
108 108
109 109 if(typeX.testFlag(QAbstractAxis::AxisTypeValues) && typeX.testFlag(QAbstractAxis::AxisTypeCategories))
110 110 {
111 111 i.toFront();
112 112 while (i.hasNext()) {
113 113 i.next();
114 114 QAbstractAxis* axis = createAxis(i.key()->d_ptr->defaultAxisXType());
115 115 if(!axis) continue;
116 116 i.key()->d_ptr->initializeAxisX(axis);
117 117 addAxisX(axis,i.key());
118 118 emit axisAdded(axis,i.value());
119 119 }
120 120
121 121 }else if(!typeY.testFlag(QAbstractAxis::AxisTypeNoAxis)){
122 122 QAbstractAxis* axis = createAxis(QAbstractAxis::AxisType(int(typeX)));
123 123 i.toFront();
124 124 while (i.hasNext()) {
125 125 i.next();
126 126 i.key()->d_ptr->initializeAxisX(axis);
127 127 addAxisX(axis,i.key());
128 128 }
129 129 emit axisAdded(axis,i.value());
130 130
131 131 }
132 132
133 133 if(typeY.testFlag(QAbstractAxis::AxisTypeValues) && typeY.testFlag(QAbstractAxis::AxisTypeCategories))
134 134 {
135 135 i.toFront();
136 136 while (i.hasNext()) {
137 137 i.next();
138 138 QAbstractAxis* axis = createAxis(i.key()->d_ptr->defaultAxisYType());
139 139 i.key()->d_ptr->initializeAxisY(axis);
140 140 addAxisY(axis,i.key());
141 141 emit axisAdded(axis,i.value());
142 142 }
143 143
144 144 }else if(!typeY.testFlag(QAbstractAxis::AxisTypeNoAxis)){
145 145 QAbstractAxis* axis = createAxis(QAbstractAxis::AxisType(int(typeY)));
146 146 i.toFront();
147 147 while (i.hasNext()) {
148 148 i.next();
149 149 i.key()->d_ptr->initializeAxisY(axis);
150 150 addAxisY(axis,i.key());
151 151 }
152 152 emit axisAdded(axis,i.value());
153 153
154 154 }
155 155 }
156 156
157 157
158 158 QAbstractAxis* ChartDataSet::createAxis(QAbstractAxis::AxisType type)
159 159 {
160 160 QAbstractAxis* axis =0;
161 161
162 162 switch(type) {
163 163 case QAbstractAxis::AxisTypeValues:
164 164 axis = new QValuesAxis(this);
165 165 break;
166 166 case QAbstractAxis::AxisTypeCategories:
167 167 axis = new QBarCategoriesAxis(this);
168 168 break;
169 169 default:
170 170 axis = 0;
171 171 break;
172 172 }
173 173
174 174 return axis;
175 175 }
176 176
177 177 void ChartDataSet::addAxisX(QAbstractAxis* axis,QAbstractSeries* series) {
178 178 Domain* domain = m_seriesDomainMap.value(series);
179 179 axis->d_ptr->m_orientation=Qt::Horizontal;
180 axis->d_ptr->initialize(domain);
180 //TODO:axis->d_ptr->initialize(domain);
181 181 QObject::connect(axis->d_ptr.data(),SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisXChanged(qreal,qreal,int,bool)));
182 182 QObject::connect(domain,SIGNAL(rangeXChanged(qreal,qreal,int)),axis->d_ptr.data(),SLOT(handleAxisRangeChanged(qreal,qreal,int)));
183 183 m_seriesAxisXMap.insert(series,axis);
184 184 }
185 185
186 186 void ChartDataSet::addAxisY(QAbstractAxis* axis,QAbstractSeries* series) {
187 187 Domain* domain = m_seriesDomainMap.value(series);
188 188 axis->d_ptr->m_orientation=Qt::Vertical;
189 axis->d_ptr->initialize(domain);
189 //TODO:axis->d_ptr->initialize(domain);
190 190 QObject::connect(axis->d_ptr.data(),SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisYChanged(qreal,qreal,int,bool)));
191 191 QObject::connect(domain,SIGNAL(rangeYChanged(qreal,qreal,int)),axis->d_ptr.data(),SLOT(handleAxisRangeChanged(qreal,qreal,int)));
192 192 m_seriesAxisYMap.insert(series,axis);
193 193 }
194 194
195 195 void ChartDataSet::removeSeries(QAbstractSeries* series)
196 196 {
197 197 Domain* domain = m_seriesDomainMap.take(series);
198 198
199 199 if(!domain) {
200 200 qWarning()<<"Can not remove series. Series not found on the chart.";
201 201 }
202 202
203 203 emit seriesRemoved(series);
204 204
205 205 delete domain;
206 206 domain = 0;
207 207
208 208 int key = seriesIndex(series);
209 209 Q_ASSERT(key!=-1);
210 210
211 211 m_indexSeriesMap.remove(key);
212 212
213 213 series->setParent(0);
214 214 series->d_ptr->m_chart = 0;
215 215 series->d_ptr->m_dataset = 0;
216 216
217 217 removeAxes(series);
218 218 }
219 219
220 220 void ChartDataSet::removeAxes(QAbstractSeries* series)
221 221 {
222 222 QAbstractAxis* axisX = m_seriesAxisXMap.take(series);
223 223
224 224 if(axisX) {
225 225 QList<QAbstractAxis*> axesX = m_seriesAxisXMap.values();
226 226 int x = axesX.indexOf(axisX);
227 227
228 228 if(x==-1) {
229 229 emit axisRemoved(axisX);
230 230 axisX->deleteLater();
231 231 }
232 232 }
233 233
234 234 QAbstractAxis* axisY = m_seriesAxisYMap.take(series);
235 235
236 236 if(axisY) {
237 237 QList<QAbstractAxis*> axesY = m_seriesAxisYMap.values();
238 238
239 239 int y = axesY.indexOf(axisY);
240 240
241 241 if(y==-1) {
242 242 emit axisRemoved(axisY);
243 243 axisY->deleteLater();
244 244 }
245 245 }
246 246 }
247 247
248 248 void ChartDataSet::removeAllSeries()
249 249 {
250 250 QList<QAbstractSeries*> series = m_seriesDomainMap.keys();
251 251 foreach(QAbstractSeries *s , series) {
252 252 removeSeries(s);
253 253 }
254 254
255 255 Q_ASSERT(m_seriesAxisXMap.count()==0);
256 256 Q_ASSERT(m_seriesAxisXMap.count()==0);
257 257 Q_ASSERT(m_seriesDomainMap.count()==0);
258 258
259 259 qDeleteAll(series);
260 260 }
261 261
262 262 void ChartDataSet::zoomInDomain(const QRectF& rect, const QSizeF& size)
263 263 {
264 264 //for performance reasons block, signals and scale "full" domain one by one. Gives twice less screen updates
265 265
266 266
267 267 blockAxisSignals(true);
268 268
269 269 QMapIterator<QAbstractSeries*, Domain*> i(m_seriesDomainMap);
270 270
271 271 while (i.hasNext()) {
272 272 i.next();
273 273 i.value()->zoomIn(rect,size);
274 274 }
275 275
276 276 blockAxisSignals(false);
277 277
278 278 }
279 279
280 280 void ChartDataSet::zoomOutDomain(const QRectF& rect, const QSizeF& size)
281 281 {
282 282 //for performance reasons block, signals and scale "full" domain one by one. Gives twice less screen updates
283 283
284 284 blockAxisSignals(true);
285 285
286 286 QMapIterator<QAbstractSeries*, Domain*> i(m_seriesDomainMap);
287 287
288 288 while (i.hasNext()) {
289 289 i.next();
290 290 i.value()->zoomOut(rect,size);
291 291 }
292 292
293 293 blockAxisSignals(false);
294 294 }
295 295
296 296 void ChartDataSet::blockAxisSignals(bool enabled)
297 297 {
298 298 QMapIterator<QAbstractSeries*, Domain*> i(m_seriesDomainMap);
299 299 Q_UNUSED(enabled);
300 300 while (i.hasNext()) {
301 301 i.next();
302 302 QAbstractAxis* axisX = m_seriesAxisXMap.value(i.key());
303 303 QAbstractAxis* axisY = m_seriesAxisYMap.value(i.key());
304 304 if(axisX) axisX->d_ptr->blockSignals(true);
305 305 if(axisY) axisY->d_ptr->blockSignals(true);
306 306 }
307 307 }
308 308
309 309 int ChartDataSet::seriesCount(QAbstractSeries::SeriesType type)
310 310 {
311 311 int count=0;
312 312 QMapIterator<QAbstractSeries*, Domain*> i(m_seriesDomainMap);
313 313 while (i.hasNext()) {
314 314 i.next();
315 315 if(i.key()->type()==type) count++;
316 316 }
317 317 return count;
318 318 }
319 319
320 320 int ChartDataSet::seriesIndex(QAbstractSeries *series)
321 321 {
322 322 QMapIterator<int, QAbstractSeries*> i(m_indexSeriesMap);
323 323 while (i.hasNext()) {
324 324 i.next();
325 325 if (i.value() == series)
326 326 return i.key();
327 327 }
328 328 return -1;
329 329 }
330 330
331 331 QAbstractAxis* ChartDataSet::axisX(QAbstractSeries *series) const
332 332 {
333 333 if(series == 0) {
334 334
335 335 QMapIterator<QAbstractSeries*, QAbstractAxis *> i(m_seriesAxisXMap);
336 336
337 337 while (i.hasNext()) {
338 338 i.next();
339 339 if(i.value()->isVisible()) return i.value();
340 340 }
341 341 return 0;
342 342 }
343 343 return m_seriesAxisXMap.value(series);
344 344 }
345 345
346 346 QAbstractAxis* ChartDataSet::axisY(QAbstractSeries *series) const
347 347 {
348 348 if(series == 0) {
349 349 QMapIterator<QAbstractSeries*, QAbstractAxis *> i(m_seriesAxisYMap);
350 350
351 351 while (i.hasNext()) {
352 352 i.next();
353 353 if(i.value()->isVisible()) return i.value();
354 354 }
355 355 return 0;
356 356 }
357 357 return m_seriesAxisYMap.value(series);
358 358 }
359 359
360 360 void ChartDataSet::setAxisX(QAbstractSeries *series, QAbstractAxis *axis)
361 361 {
362 362 Q_ASSERT(axis);
363 363 Domain* domain = m_seriesDomainMap.value(series);
364 364
365 365 if(!domain) {
366 366 qWarning() << "Series not found on the chart.";
367 367 return;
368 368 }
369 369
370 370 if(axis->d_ptr->m_orientation==Qt::Vertical) {
371 371 qWarning()<<"Axis already defined as axis Y";
372 372 return;
373 373 }
374 374
375 375 QAbstractAxis *oldAxis = m_seriesAxisXMap.take(series);
376 376 QList<QAbstractAxis*> axesX = m_seriesAxisXMap.values();
377 377
378 378 if(oldAxis) {
379 379
380 380 int x = axesX.indexOf(oldAxis);
381 381 if(x==-1) {
382 382 emit axisRemoved(oldAxis);
383 383 oldAxis->deleteLater();
384 384 }
385 385 }
386 386
387 387 QObject::connect(axis->d_ptr.data(),SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisXChanged(qreal,qreal,int,bool)));
388 388 QObject::connect(domain,SIGNAL(rangeXChanged(qreal,qreal,int)),axis->d_ptr.data(),SLOT(handleAxisRangeChanged(qreal,qreal,int)));
389 389
390 390 int x = axesX.indexOf(axis);
391 391 if(x==-1) {
392 392 axis->d_ptr->m_orientation=Qt::Horizontal;
393 393 emit axisAdded(axis,domain);
394 394 }
395 395
396 396 m_seriesAxisXMap.insert(series,axis);
397 397 axis->d_ptr->emitRange();
398 398 }
399 399
400 400 void ChartDataSet::setAxisY(QAbstractSeries *series, QAbstractAxis *axis)
401 401 {
402 402 Q_ASSERT(axis);
403 403 Domain* domain = m_seriesDomainMap.value(series);
404 404
405 405 if(!domain) {
406 406 qWarning() << "Series not found on the chart.";
407 407 return;
408 408 }
409 409
410 410 if(axis->d_ptr->m_orientation==Qt::Horizontal) {
411 411 qWarning()<<"Axis already defined as axis X";
412 412 return;
413 413 }
414 414
415 415 QAbstractAxis *oldAxis = m_seriesAxisYMap.take(series);
416 416 QList<QAbstractAxis*> axesY = m_seriesAxisYMap.values();
417 417
418 418 if(oldAxis) {
419 419 int y = axesY.indexOf(oldAxis);
420 420 if(y==-1) {
421 421 emit axisRemoved(oldAxis);
422 422 oldAxis->deleteLater();
423 423 }
424 424 }
425 425
426 426 QObject::connect(axis->d_ptr.data(),SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisYChanged(qreal,qreal,int,bool)));
427 427 QObject::connect(domain,SIGNAL(rangeYChanged(qreal,qreal,int)),axis->d_ptr.data(),SLOT(handleAxisRangeChanged(qreal,qreal,int)));
428 428
429 429 int y = axesY.indexOf(axis);
430 430 if(y==-1) {
431 431 axis->d_ptr->m_orientation=Qt::Vertical;
432 432 emit axisAdded(axis,domain);
433 433 }
434 434
435 435 m_seriesAxisYMap.insert(series,axis);
436 436 axis->d_ptr->emitRange();
437 437 }
438 438
439 439 Domain* ChartDataSet::domain(QAbstractSeries *series) const
440 440 {
441 441 return m_seriesDomainMap.value(series);
442 442 }
443 443
444 444 void ChartDataSet::scrollDomain(qreal dx,qreal dy,const QSizeF& size)
445 445 {
446 446 blockAxisSignals(true);
447 447 QMapIterator<QAbstractSeries*, Domain*> i(m_seriesDomainMap);
448 448 while (i.hasNext()) {
449 449 i.next();
450 450 i.value()->move(dx,dy,size);
451 451 }
452 452 blockAxisSignals(false);
453 453 }
454 454
455 455 QList<QAbstractSeries*> ChartDataSet::series() const
456 456 {
457 457 return m_seriesDomainMap.keys();
458 458 }
459 459
460 460 void ChartDataSet::updateSeries(QAbstractSeries *series)
461 461 {
462 462 emit seriesUpdated(series);
463 463 }
464 464
465 465 #include "moc_chartdataset_p.cpp"
466 466
467 467 QTCOMMERCIALCHART_END_NAMESPACE
General Comments 0
You need to be logged in to leave comments. Login now