##// END OF EJS Templates
Refactor domain model...
Michal Klocek -
r439:86afa1b4ff5f
parent child
Show More
@@ -0,0 +1,4
1 !include( ../test.pri ) {
2 error( "Couldn't find the test.pri file!" )
3 }
4 SOURCES += tst_domain.cpp
This diff has been collapsed as it changes many lines, (578 lines changed) Show them Hide them
@@ -0,0 +1,578
1 #include <QtTest/QtTest>
2 #include <private/domain_p.h>
3
4 QTCOMMERCIALCHART_USE_NAMESPACE
5
6 Q_DECLARE_METATYPE(Domain*)
7 Q_DECLARE_METATYPE(QSizeF)
8
9 class tst_Domain : public QObject
10 {
11 Q_OBJECT
12
13 public slots:
14 void initTestCase();
15 void cleanupTestCase();
16 void init();
17 void cleanup();
18
19 private slots:
20 void domain();
21 void handleAxisRangeXChanged_data();
22 void handleAxisRangeXChanged();
23 void handleAxisRangeYChanged_data();
24 void handleAxisRangeYChanged();
25 void isEmpty_data();
26 void isEmpty();
27 void maxX_data();
28 void maxX();
29 void maxY_data();
30 void maxY();
31 void minX_data();
32 void minX();
33 void minY_data();
34 void minY();
35 void operatorEquals_data();
36 void operatorEquals();
37 void setRange_data();
38 void setRange();
39 void setRangeX_data();
40 void setRangeX();
41 void setRangeY_data();
42 void setRangeY();
43 void spanX_data();
44 void spanX();
45 void spanY_data();
46 void spanY();
47 void zoom_data();
48 void zoom();
49 };
50
51 void tst_Domain::initTestCase()
52 {
53 }
54
55 void tst_Domain::cleanupTestCase()
56 {
57 }
58
59 void tst_Domain::init()
60 {
61 }
62
63 void tst_Domain::cleanup()
64 {
65 }
66
67 void tst_Domain::domain()
68 {
69 Domain domain;
70
71 QCOMPARE(domain.isEmpty(), true);
72 QCOMPARE(domain.maxX(), 0.0);
73 QCOMPARE(domain.maxY(), 0.0);
74 QCOMPARE(domain.minX(), 0.0);
75 QCOMPARE(domain.minY(), 0.0);
76 }
77
78 void tst_Domain::handleAxisRangeXChanged_data()
79 {
80 QTest::addColumn<qreal>("min");
81 QTest::addColumn<qreal>("max");
82 QTest::newRow("-1 1") << -1.0 << 1.0;
83 QTest::newRow("0 1") << 0.0 << 1.0;
84 QTest::newRow("-1 0") << -1.0 << 0.0;
85 }
86
87 void tst_Domain::handleAxisRangeXChanged()
88 {
89 QFETCH(qreal, min);
90 QFETCH(qreal, max);
91
92 Domain domain;
93
94 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
95 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
96 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
97
98 domain.handleAxisRangeXChanged(min, max);
99
100 QList<QVariant> arg0 = spy0.first();
101 QVERIFY(arg0.at(0).toReal() == min);
102 QVERIFY(arg0.at(1).toReal() == max);
103
104 QList<QVariant> arg1 = spy1.first();
105 QVERIFY(arg1.at(0).toReal() == min);
106 QVERIFY(arg1.at(1).toReal() == max);
107
108 QCOMPARE(spy0.count(), 1);
109 QCOMPARE(spy1.count(), 1);
110 QCOMPARE(spy2.count(), 0);
111
112 }
113
114 void tst_Domain::handleAxisRangeYChanged_data()
115 {
116 QTest::addColumn<qreal>("min");
117 QTest::addColumn<qreal>("max");
118 QTest::newRow("-1 1") << -1.0 << 1.0;
119 QTest::newRow("0 1") << 0.0 << 1.0;
120 QTest::newRow("-1 0") << -1.0 << 0.0;
121 }
122
123
124 void tst_Domain::handleAxisRangeYChanged()
125 {
126 QFETCH(qreal, min);
127 QFETCH(qreal, max);
128
129 Domain domain;
130
131 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
132 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
133 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
134
135 domain.handleAxisRangeYChanged(min, max);
136
137 QList<QVariant> arg0 = spy0.first();
138 QVERIFY(arg0.at(2).toReal() == min);
139 QVERIFY(arg0.at(3).toReal() == max);
140
141 QList<QVariant> arg1 = spy2.first();
142 QVERIFY(arg1.at(0).toReal() == min);
143 QVERIFY(arg1.at(1).toReal() == max);
144
145 QCOMPARE(spy0.count(), 1);
146 QCOMPARE(spy1.count(), 0);
147 QCOMPARE(spy2.count(), 1);
148 }
149
150 void tst_Domain::isEmpty_data()
151 {
152 QTest::addColumn<qreal>("minX");
153 QTest::addColumn<qreal>("maxX");
154 QTest::addColumn<qreal>("minY");
155 QTest::addColumn<qreal>("maxY");
156 QTest::addColumn<bool>("isEmpty");
157 QTest::newRow("0 0 0 0") << 0.0 << 0.0 << 0.0 << 0.0 << true;
158 QTest::newRow("0 1 0 0") << 0.0 << 1.0 << 0.0 << 0.0 << true;
159 QTest::newRow("0 0 0 1") << 0.0 << 1.0 << 0.0 << 0.0 << true;
160 QTest::newRow("0 1 0 1") << 0.0 << 1.0 << 0.0 << 1.0 << false;
161 }
162
163 void tst_Domain::isEmpty()
164 {
165 QFETCH(qreal, minX);
166 QFETCH(qreal, maxX);
167 QFETCH(qreal, minY);
168 QFETCH(qreal, maxY);
169 QFETCH(bool, isEmpty);
170
171 Domain domain;
172 domain.setRange(minX,maxX,minY,maxY);
173 QCOMPARE(domain.isEmpty(), isEmpty);
174 }
175
176 void tst_Domain::maxX_data()
177 {
178 QTest::addColumn<qreal>("maxX1");
179 QTest::addColumn<qreal>("maxX2");
180 QTest::addColumn<int>("count");
181 QTest::newRow("1") << 0.0 << 1.0 << 1;
182 QTest::newRow("1.0") << 1.0 << 1.0 << 1;
183 QTest::newRow("2.0") << 1.0 << 0.0 << 2;
184 }
185
186 void tst_Domain::maxX()
187 {
188 QFETCH(qreal, maxX1);
189 QFETCH(qreal, maxX2);
190 QFETCH(int, count);
191
192 Domain domain;
193
194 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
195 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
196 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
197
198 domain.setMaxX(maxX1);
199 QCOMPARE(domain.maxX(), maxX1);
200 domain.setMaxX(maxX2);
201 QCOMPARE(domain.maxX(), maxX2);
202
203
204 QCOMPARE(spy0.count(), count);
205 QCOMPARE(spy1.count(), count);
206 QCOMPARE(spy2.count(), 0);
207
208 }
209
210 void tst_Domain::maxY_data()
211 {
212 QTest::addColumn<qreal>("maxY1");
213 QTest::addColumn<qreal>("maxY2");
214 QTest::addColumn<int>("count");
215 QTest::newRow("1") << 0.0 << 1.0 << 1;
216 QTest::newRow("1.0") << 1.0 << 1.0 << 1;
217 QTest::newRow("2.0") << 1.0 << 0.0 << 2;
218 }
219
220
221 void tst_Domain::maxY()
222 {
223 QFETCH(qreal, maxY1);
224 QFETCH(qreal, maxY2);
225 QFETCH(int, count);
226
227 Domain domain;
228
229 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
230 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
231 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
232
233 domain.setMaxY(maxY1);
234 QCOMPARE(domain.maxY(), maxY1);
235 domain.setMaxY(maxY2);
236 QCOMPARE(domain.maxY(), maxY2);
237
238 QCOMPARE(spy0.count(), count);
239 QCOMPARE(spy1.count(), 0);
240 QCOMPARE(spy2.count(), count);
241 }
242
243 void tst_Domain::minX_data()
244 {
245 QTest::addColumn<qreal>("minX1");
246 QTest::addColumn<qreal>("minX2");
247 QTest::addColumn<int>("count");
248 QTest::newRow("1") << 0.0 << 1.0 << 1;
249 QTest::newRow("1.0") << 1.0 << 1.0 << 1;
250 QTest::newRow("2.0") << 1.0 << 0.0 << 2;
251 }
252
253
254 void tst_Domain::minX()
255 {
256 QFETCH(qreal, minX1);
257 QFETCH(qreal, minX2);
258 QFETCH(int, count);
259
260 Domain domain;
261
262 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
263 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
264 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
265
266 domain.setMinX(minX1);
267 QCOMPARE(domain.minX(), minX1);
268 domain.setMinX(minX2);
269 QCOMPARE(domain.minX(), minX2);
270
271 QCOMPARE(spy0.count(), count);
272 QCOMPARE(spy1.count(), count);
273 QCOMPARE(spy2.count(), 0);
274 }
275
276 void tst_Domain::minY_data()
277 {
278 QTest::addColumn<qreal>("minY1");
279 QTest::addColumn<qreal>("minY2");
280 QTest::addColumn<int>("count");
281 QTest::newRow("1") << 0.0 << 1.0 << 1;
282 QTest::newRow("1.0") << 1.0 << 1.0 << 1;
283 QTest::newRow("2.0") << 1.0 << 0.0 << 2;
284 }
285
286 void tst_Domain::minY()
287 {
288 QFETCH(qreal, minY1);
289 QFETCH(qreal, minY2);
290 QFETCH(int, count);
291
292 Domain domain;
293
294 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
295 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
296 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
297
298 domain.setMinY(minY1);
299 QCOMPARE(domain.minY(), minY1);
300 domain.setMinY(minY2);
301 QCOMPARE(domain.minY(), minY2);
302
303 QCOMPARE(spy0.count(), count);
304 QCOMPARE(spy1.count(), 0);
305 QCOMPARE(spy2.count(), count);
306 }
307
308 void tst_Domain::operatorEquals_data()
309 {
310
311 QTest::addColumn<Domain*>("domain1");
312 QTest::addColumn<Domain*>("domain2");
313 QTest::addColumn<bool>("equals");
314 QTest::addColumn<bool>("notEquals");
315 Domain* a;
316 Domain* b;
317 a = new Domain();
318 a->setRange(0,100,0,100);
319 b = new Domain();
320 b->setRange(0,100,0,100);
321 QTest::newRow("equals") << a << b << true <<false;
322 a = new Domain();
323 a->setRange(0,100,0,100);
324 b = new Domain();
325 b->setRange(0,100,0,1);
326 QTest::newRow("equals") << a << b << false << true;
327 a = new Domain();
328 a->setRange(0,100,0,100);
329 b = new Domain();
330 b->setRange(0,1,0,100);
331 QTest::newRow("equals") << a << b << false << true;
332
333 }
334
335 void tst_Domain::operatorEquals()
336 {
337 QFETCH(Domain*, domain1);
338 QFETCH(Domain*, domain2);
339 QFETCH(bool, equals);
340 QFETCH(bool, notEquals);
341
342 Domain domain;
343
344 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
345 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
346 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
347
348 QCOMPARE(*domain1==*domain2, equals);
349 QCOMPARE(*domain1!=*domain2, notEquals);
350
351 QCOMPARE(spy0.count(), 0);
352 QCOMPARE(spy1.count(), 0);
353 QCOMPARE(spy2.count(), 0);
354 }
355
356 void tst_Domain::setRange_data()
357 {
358 QTest::addColumn<qreal>("minX");
359 QTest::addColumn<qreal>("maxX");
360 QTest::addColumn<qreal>("minY");
361 QTest::addColumn<qreal>("maxY");
362 QTest::newRow("1,2,1,2") << 1.0 << 2.0 << 1.0 << 2.0;
363 QTest::newRow("1,3,1,3") << 1.0 << 3.0 << 1.0 << 3.0;
364 QTest::newRow("-1,5,-2,-1") << -1.0 << 5.0 << -2.0 << -1.0;
365 }
366
367 void tst_Domain::setRange()
368 {
369 QFETCH(qreal, minX);
370 QFETCH(qreal, maxX);
371 QFETCH(qreal, minY);
372 QFETCH(qreal, maxY);
373
374 Domain domain;
375
376 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
377 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
378 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
379
380 domain.setRange(minX, maxX, minY, maxY);
381
382 QCOMPARE(domain.minX(), minX);
383 QCOMPARE(domain.maxX(), maxX);
384 QCOMPARE(domain.minY(), minY);
385 QCOMPARE(domain.maxY(), maxY);
386
387 QCOMPARE(spy0.count(), 1);
388 QCOMPARE(spy1.count(), 1);
389 QCOMPARE(spy2.count(), 1);
390
391
392 }
393
394 void tst_Domain::setRangeX_data()
395 {
396 QTest::addColumn<qreal>("min");
397 QTest::addColumn<qreal>("max");
398 QTest::newRow("-1 1") << -1.0 << 1.0;
399 QTest::newRow("0 1") << 0.0 << 1.0;
400 QTest::newRow("-1 0") << -1.0 << 0.0;
401 }
402
403 void tst_Domain::setRangeX()
404 {
405 QFETCH(qreal, min);
406 QFETCH(qreal, max);
407
408 Domain domain;
409
410 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
411 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
412 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
413
414 domain.setRangeX(min, max);
415
416 QList<QVariant> arg0 = spy0.first();
417 QVERIFY(arg0.at(0).toReal() == min);
418 QVERIFY(arg0.at(1).toReal() == max);
419
420 QList<QVariant> arg1 = spy1.first();
421 QVERIFY(arg1.at(0).toReal() == min);
422 QVERIFY(arg1.at(1).toReal() == max);
423
424 QCOMPARE(spy0.count(), 1);
425 QCOMPARE(spy1.count(), 1);
426 QCOMPARE(spy2.count(), 0);
427 }
428
429 void tst_Domain::setRangeY_data()
430 {
431 QTest::addColumn<qreal>("min");
432 QTest::addColumn<qreal>("max");
433 QTest::newRow("-1 1") << -1.0 << 1.0;
434 QTest::newRow("0 1") << 0.0 << 1.0;
435 QTest::newRow("-1 0") << -1.0 << 0.0;
436 }
437
438 void tst_Domain::setRangeY()
439 {
440 QFETCH(qreal, min);
441 QFETCH(qreal, max);
442
443 Domain domain;
444
445 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
446 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
447 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
448
449 domain.setRangeY(min, max);
450
451 QList<QVariant> arg0 = spy0.first();
452 QVERIFY(arg0.at(2).toReal() == min);
453 QVERIFY(arg0.at(3).toReal() == max);
454
455 QList<QVariant> arg1 = spy2.first();
456 QVERIFY(arg1.at(0).toReal() == min);
457 QVERIFY(arg1.at(1).toReal() == max);
458
459 QCOMPARE(spy0.count(), 1);
460 QCOMPARE(spy1.count(), 0);
461 QCOMPARE(spy2.count(), 1);
462 }
463
464 void tst_Domain::spanX_data()
465 {
466 QTest::addColumn<qreal>("minX");
467 QTest::addColumn<qreal>("maxX");
468 QTest::addColumn<qreal>("spanX");
469 QTest::newRow("1 2 1") << 1.0 << 2.0 << 1.0;
470 QTest::newRow("0 2 2") << 1.0 << 2.0 << 1.0;
471 }
472
473 void tst_Domain::spanX()
474 {
475 QFETCH(qreal, minX);
476 QFETCH(qreal, maxX);
477 QFETCH(qreal, spanX);
478
479 Domain domain;
480
481 domain.setRangeX(minX,maxX);
482
483 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
484 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
485 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
486
487 QCOMPARE(domain.spanX(), spanX);
488
489 QCOMPARE(spy0.count(), 0);
490 QCOMPARE(spy1.count(), 0);
491 QCOMPARE(spy2.count(), 0);
492 }
493
494 void tst_Domain::spanY_data()
495 {
496 QTest::addColumn<qreal>("minY");
497 QTest::addColumn<qreal>("maxY");
498 QTest::addColumn<qreal>("spanY");
499 QTest::newRow("1 2 1") << 1.0 << 2.0 << 1.0;
500 QTest::newRow("0 2 2") << 1.0 << 2.0 << 1.0;
501 }
502
503 void tst_Domain::spanY()
504 {
505 QFETCH(qreal, minY);
506 QFETCH(qreal, maxY);
507 QFETCH(qreal, spanY);
508
509 Domain domain;
510
511 domain.setRangeY(minY,maxY);
512
513 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
514 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
515 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
516
517 QCOMPARE(domain.spanY(), spanY);
518
519 QCOMPARE(spy0.count(), 0);
520 QCOMPARE(spy1.count(), 0);
521 QCOMPARE(spy2.count(), 0);
522 }
523
524
525 void tst_Domain::zoom_data()
526 {
527 QTest::addColumn<QRectF>("rect0");
528 QTest::addColumn<QSizeF>("size0");
529 QTest::addColumn<QRectF>("rect1");
530 QTest::addColumn<QSizeF>("size1");
531 QTest::addColumn<QRectF>("rect2");
532 QTest::addColumn<QSizeF>("size2");
533 QTest::newRow("first") << QRectF(10,10,100,100) << QSizeF(1000,1000) << QRectF(20,20,100,100) << QSizeF(1000,1000) << QRectF(50,50,100,100) << QSizeF(1000,1000);
534 QTest::newRow("scound") << QRectF(10,10,50,50) << QSizeF(1000,1000) << QRectF(20,20,100,100) << QSizeF(1000,1000) << QRectF(50,50,100,100) << QSizeF(1000,1000);
535 QTest::newRow("third") << QRectF(10,10,10,10) << QSizeF(100,100) << QRectF(20,20,20,20) << QSizeF(100,100) << QRectF(50,50,50,50) << QSizeF(100,100);
536 }
537
538 void tst_Domain::zoom()
539 {
540 QFETCH(QRectF, rect0);
541 QFETCH(QSizeF, size0);
542 QFETCH(QRectF, rect1);
543 QFETCH(QSizeF, size1);
544 QFETCH(QRectF, rect2);
545 QFETCH(QSizeF, size2);
546
547 Domain domain;
548
549 domain.setRange(0,1000,0,1000);
550
551 QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal)));
552 QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal)));
553 QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal)));
554
555 Domain domain0;
556 domain0.setRange(domain.minX(),domain.maxX(),domain.minY(),domain.maxY());
557 domain.zoomIn(rect0, size0);
558 Domain domain1;
559 domain1.setRange(domain.minX(),domain.maxX(),domain.minY(),domain.maxY());
560 domain.zoomIn(rect1, size1);
561 Domain domain2;
562 domain2.setRange(domain.minX(),domain.maxX(),domain.minY(),domain.maxY());
563 domain.zoomIn(rect2, size2);
564 domain.zoomOut(rect2, size2);
565 QCOMPARE(domain == domain2,true);
566 domain.zoomOut(rect1, size1);
567 QCOMPARE(domain == domain1,true);
568 domain.zoomOut(rect0, size0);
569 QCOMPARE(domain == domain0,true);
570 QCOMPARE(spy0.count(), 6);
571 QCOMPARE(spy1.count(), 6);
572 QCOMPARE(spy2.count(), 6);
573
574 }
575
576 QTEST_MAIN(tst_Domain)
577 #include "tst_domain.moc"
578
@@ -1,116 +1,112
1 #include "areachartitem_p.h"
1 #include "areachartitem_p.h"
2 #include "qareaseries.h"
2 #include "qareaseries.h"
3 #include "qlineseries.h"
3 #include "qlineseries.h"
4 #include "chartpresenter_p.h"
5 #include <QPainter>
4 #include <QPainter>
6
5
7
6
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
8
10 //TODO: optimize : remove points which are not visible
9 //TODO: optimize : remove points which are not visible
11
10
12 AreaChartItem::AreaChartItem(ChartPresenter* presenter, QAreaSeries* areaSeries,QGraphicsItem *parent):ChartItem(parent),
11 AreaChartItem::AreaChartItem(QAreaSeries* areaSeries,QGraphicsItem *parent):ChartItem(parent),
13 m_presenter(presenter),
14 m_series(areaSeries),
12 m_series(areaSeries),
15 m_upper(0),
13 m_upper(0),
16 m_lower(0)
14 m_lower(0)
17 {
15 {
18 //m_items.setZValue(ChartPresenter::LineChartZValue);
16 //m_items.setZValue(ChartPresenter::LineChartZValue);
19 m_upper = new AreaBoundItem(this,presenter,m_series->upperSeries());
17 m_upper = new AreaBoundItem(this,m_series->upperSeries());
20 if(m_series->lowerSeries()){
18 if(m_series->lowerSeries()){
21 m_lower = new AreaBoundItem(this,presenter,m_series->lowerSeries());
19 m_lower = new AreaBoundItem(this,m_series->lowerSeries());
22 }
20 }
23 setZValue(ChartPresenter::LineChartZValue);
24
21
25 QObject::connect(presenter,SIGNAL(geometryChanged(const QRectF&)),this,SLOT(handleGeometryChanged(const QRectF&)));
26 QObject::connect(areaSeries,SIGNAL(updated()),this,SLOT(handleUpdated()));
22 QObject::connect(areaSeries,SIGNAL(updated()),this,SLOT(handleUpdated()));
27
23
28 handleUpdated();
24 handleUpdated();
29 }
25 }
30
26
31 AreaChartItem::~AreaChartItem()
27 AreaChartItem::~AreaChartItem()
32 {
28 {
33 delete m_upper;
29 delete m_upper;
34 delete m_lower;
30 delete m_lower;
35 };
31 };
36
32
37 QRectF AreaChartItem::boundingRect() const
33 QRectF AreaChartItem::boundingRect() const
38 {
34 {
39 return m_rect;
35 return m_rect;
40 }
36 }
41
37
42 QPainterPath AreaChartItem::shape() const
38 QPainterPath AreaChartItem::shape() const
43 {
39 {
44 return m_path;
40 return m_path;
45 }
41 }
46
42
47 void AreaChartItem::setPen(const QPen& pen)
43 void AreaChartItem::setPen(const QPen& pen)
48 {
44 {
49 m_pen = pen;
45 m_pen = pen;
50 }
46 }
51
47
52 void AreaChartItem::setBrush(const QBrush& brush)
48 void AreaChartItem::setBrush(const QBrush& brush)
53 {
49 {
54 m_brush = brush;
50 m_brush = brush;
55 }
51 }
56
52
57 void AreaChartItem::updatePath()
53 void AreaChartItem::updatePath()
58 {
54 {
59 QPainterPath path;
55 QPainterPath path;
60
56
61 path.connectPath(m_upper->shape());
57 path.connectPath(m_upper->shape());
62 if(m_lower){
58 if(m_lower){
63 path.connectPath(m_lower->shape().toReversed());
59 path.connectPath(m_lower->shape().toReversed());
64 }
60 }
65 else{
61 else{
66 QPointF first = path.pointAtPercent(0);
62 QPointF first = path.pointAtPercent(0);
67 QPointF last = path.pointAtPercent(1);
63 QPointF last = path.pointAtPercent(1);
68 path.lineTo(last.x(),m_clipRect.bottom());
64 path.lineTo(last.x(),m_clipRect.bottom());
69 path.lineTo(first.x(),m_clipRect.bottom());
65 path.lineTo(first.x(),m_clipRect.bottom());
70 }
66 }
71 path.closeSubpath();
67 path.closeSubpath();
72 prepareGeometryChange();
68 prepareGeometryChange();
73 m_path=path;
69 m_path=path;
74 m_rect=path.boundingRect();
70 m_rect=path.boundingRect();
75 update();
71 update();
76 }
72 }
77
73
78 void AreaChartItem::handleUpdated()
74 void AreaChartItem::handleUpdated()
79 {
75 {
80 setPen(m_series->pen());
76 setPen(m_series->pen());
81 setBrush(m_series->brush());
77 setBrush(m_series->brush());
82 update();
78 update();
83 }
79 }
84
80
85 void AreaChartItem::handleDomainChanged(const Domain& domain)
81 void AreaChartItem::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY)
86 {
82 {
87 m_upper->handleDomainChanged(domain);
83 m_upper->handleDomainChanged(minX,maxX,minY,maxY);
88 if(m_lower)
84 if(m_lower)
89 m_lower->handleDomainChanged(domain);
85 m_lower->handleDomainChanged(minX,maxX,minY,maxY);
90 }
86 }
91
87
92 void AreaChartItem::handleGeometryChanged(const QRectF& rect)
88 void AreaChartItem::handleGeometryChanged(const QRectF& rect)
93 {
89 {
94 m_clipRect=rect.translated(-rect.topLeft());
90 m_clipRect=rect.translated(-rect.topLeft());
95 setPos(rect.topLeft());
91 setPos(rect.topLeft());
96 m_upper->handleGeometryChanged(rect);
92 m_upper->handleGeometryChanged(rect);
97 if(m_lower)
93 if(m_lower)
98 m_lower->handleGeometryChanged(rect);
94 m_lower->handleGeometryChanged(rect);
99 }
95 }
100 //painter
96 //painter
101
97
102 void AreaChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
98 void AreaChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
103 {
99 {
104 Q_UNUSED(widget);
100 Q_UNUSED(widget);
105 Q_UNUSED(option);
101 Q_UNUSED(option);
106 painter->save();
102 painter->save();
107 painter->setPen(m_pen);
103 painter->setPen(m_pen);
108 painter->setBrush(m_brush);
104 painter->setBrush(m_brush);
109 painter->setClipRect(m_clipRect);
105 painter->setClipRect(m_clipRect);
110 painter->drawPath(m_path);
106 painter->drawPath(m_path);
111 painter->restore();
107 painter->restore();
112 }
108 }
113
109
114 #include "moc_areachartitem_p.cpp"
110 #include "moc_areachartitem_p.cpp"
115
111
116 QTCOMMERCIALCHART_END_NAMESPACE
112 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,67 +1,66
1 #ifndef AREACHARTITEM_H
1 #ifndef AREACHARTITEM_H
2 #define AREACHARTITEM_H
2 #define AREACHARTITEM_H
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "linechartitem_p.h"
5 #include "linechartitem_p.h"
6 #include <QPen>
6 #include <QPen>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 class ChartPresenter;
10 class ChartPresenter;
11 class QAreaSeries;
11 class QAreaSeries;
12 class AreaChartItem;
12 class AreaChartItem;
13
13
14 class AreaChartItem : public QObject ,public ChartItem
14 class AreaChartItem : public QObject ,public ChartItem
15 {
15 {
16 Q_OBJECT
16 Q_OBJECT
17 public:
17 public:
18 AreaChartItem(ChartPresenter* presenter, QAreaSeries* areaSeries, QGraphicsItem *parent = 0);
18 AreaChartItem(QAreaSeries* areaSeries, QGraphicsItem *parent = 0);
19 ~ AreaChartItem();
19 ~ AreaChartItem();
20
20
21 //from QGraphicsItem
21 //from QGraphicsItem
22 QRectF boundingRect() const;
22 QRectF boundingRect() const;
23 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
23 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
24 QPainterPath shape() const;
24 QPainterPath shape() const;
25
25
26 void setPen(const QPen& pen);
26 void setPen(const QPen& pen);
27 void setBrush(const QBrush& brush);
27 void setBrush(const QBrush& brush);
28 void setPointsVisible(bool visible);
28 void setPointsVisible(bool visible);
29 void updatePath();
29 void updatePath();
30 public slots:
30 public slots:
31 void handleUpdated();
31 void handleUpdated();
32 void handleDomainChanged(const Domain& domain);
32 void handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY);
33 void handleGeometryChanged(const QRectF& size);
33 void handleGeometryChanged(const QRectF& size);
34
34
35 private:
35 private:
36 ChartPresenter* m_presenter;
37 QPainterPath m_path;
38 QAreaSeries* m_series;
36 QAreaSeries* m_series;
39 LineChartItem* m_upper;
37 LineChartItem* m_upper;
40 LineChartItem* m_lower;
38 LineChartItem* m_lower;
39 QPainterPath m_path;
41 QRectF m_rect;
40 QRectF m_rect;
42 QRectF m_clipRect;
41 QRectF m_clipRect;
43 QPen m_pen;
42 QPen m_pen;
44 QBrush m_brush;
43 QBrush m_brush;
45 };
44 };
46
45
47 class AreaBoundItem : public LineChartItem
46 class AreaBoundItem : public LineChartItem
48 {
47 {
49 public:
48 public:
50 AreaBoundItem(AreaChartItem* item,ChartPresenter* presenter, QLineSeries* lineSeries):LineChartItem(presenter,lineSeries),
49 AreaBoundItem(AreaChartItem* item,QLineSeries* lineSeries):LineChartItem(lineSeries),
51 m_item(item){};
50 m_item(item){};
52
51
53 ~AreaBoundItem(){};
52 ~AreaBoundItem(){};
54
53
55 void applyGeometry(QVector<QPointF>& points){
54 void applyGeometry(QVector<QPointF>& points){
56 LineChartItem::applyGeometry(points);
55 LineChartItem::applyGeometry(points);
57 m_item->updatePath();
56 m_item->updatePath();
58 }
57 }
59
58
60 private:
59 private:
61 AreaChartItem* m_item;
60 AreaChartItem* m_item;
62
61
63 };
62 };
64
63
65 QTCOMMERCIALCHART_END_NAMESPACE
64 QTCOMMERCIALCHART_END_NAMESPACE
66
65
67 #endif
66 #endif
@@ -1,74 +1,74
1 #include "axisanimationitem_p.h"
1 #include "axisanimationitem_p.h"
2 #include <QTimer>
2 #include <QTimer>
3
3
4 Q_DECLARE_METATYPE(QVector<qreal>)
4 Q_DECLARE_METATYPE(QVector<qreal>)
5
5
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7
7
8 const static int duration = 500;
8 const static int duration = 500;
9
9
10 AxisAnimationItem::AxisAnimationItem(AxisType type,QGraphicsItem* parent) :
10 AxisAnimationItem::AxisAnimationItem(QChartAxis* axis,AxisType type,QGraphicsItem* parent) :
11 AxisItem(type,parent),
11 AxisItem(axis,type,parent),
12 m_animation(new AxisAnimator(this,this))
12 m_animation(new AxisAnimator(this,this))
13 {
13 {
14 }
14 }
15
15
16 AxisAnimationItem::~AxisAnimationItem()
16 AxisAnimationItem::~AxisAnimationItem()
17 {
17 {
18 }
18 }
19
19
20 void AxisAnimationItem::updateItems(QVector<qreal>& oldLayout,QVector<qreal>& newLayout)
20 void AxisAnimationItem::updateItems(QVector<qreal>& oldLayout,QVector<qreal>& newLayout)
21 {
21 {
22 if(newLayout.count()==0) return;
22 if(newLayout.count()==0) return;
23 oldLayout.resize(newLayout.size());
23 oldLayout.resize(newLayout.size());
24
24
25 if(m_animation->state()!=QAbstractAnimation::Stopped){
25 if(m_animation->state()!=QAbstractAnimation::Stopped){
26 m_animation->stop();
26 m_animation->stop();
27 }
27 }
28
28
29 m_animation->setDuration(duration);
29 m_animation->setDuration(duration);
30 m_animation->setEasingCurve(QEasingCurve::InOutBack);
30 m_animation->setEasingCurve(QEasingCurve::InOutBack);
31 m_animation->setKeyValueAt(0.0, qVariantFromValue(oldLayout));
31 m_animation->setKeyValueAt(0.0, qVariantFromValue(oldLayout));
32 m_animation->setKeyValueAt(1.0, qVariantFromValue(newLayout));
32 m_animation->setKeyValueAt(1.0, qVariantFromValue(newLayout));
33 QTimer::singleShot(0,m_animation,SLOT(start()));
33 QTimer::singleShot(0,m_animation,SLOT(start()));
34 oldLayout = newLayout;
34 oldLayout = newLayout;
35 }
35 }
36
36
37 void AxisAnimationItem::setLabelsAngle(int angle)
37 void AxisAnimationItem::setLabelsAngle(int angle)
38 {
38 {
39 AxisItem::setLabelsAngle(angle);
39 AxisItem::setLabelsAngle(angle);
40 }
40 }
41
41
42 AxisAnimator::AxisAnimator(AxisItem *axis,QObject *parent): QVariantAnimation(parent),
42 AxisAnimator::AxisAnimator(AxisItem *axis,QObject *parent): QVariantAnimation(parent),
43 m_axis(axis)
43 m_axis(axis)
44 {
44 {
45 }
45 }
46
46
47 AxisAnimator::~AxisAnimator()
47 AxisAnimator::~AxisAnimator()
48 {
48 {
49 }
49 }
50
50
51 QVariant AxisAnimator::interpolated(const QVariant &start, const QVariant & end, qreal progress ) const
51 QVariant AxisAnimator::interpolated(const QVariant &start, const QVariant & end, qreal progress ) const
52 {
52 {
53 QVector<qreal> startVector = qVariantValue<QVector<qreal> >(start);
53 QVector<qreal> startVector = qVariantValue<QVector<qreal> >(start);
54 QVector<qreal> endVecotr = qVariantValue<QVector<qreal> >(end);
54 QVector<qreal> endVecotr = qVariantValue<QVector<qreal> >(end);
55 QVector<qreal> result;
55 QVector<qreal> result;
56 Q_ASSERT(startVector.count() == endVecotr.count());
56 Q_ASSERT(startVector.count() == endVecotr.count());
57
57
58 for(int i =0 ;i< startVector.count();i++){
58 for(int i =0 ;i< startVector.count();i++){
59 qreal value = startVector[i] + ((endVecotr[i]- startVector[i]) * progress);//qBound(0.0, progress, 1.0));
59 qreal value = startVector[i] + ((endVecotr[i]- startVector[i]) * progress);//qBound(0.0, progress, 1.0));
60 result << value;
60 result << value;
61 }
61 }
62 return qVariantFromValue(result);
62 return qVariantFromValue(result);
63 }
63 }
64
64
65
65
66 void AxisAnimator::updateCurrentValue (const QVariant & value )
66 void AxisAnimator::updateCurrentValue (const QVariant & value )
67 {
67 {
68 QVector<qreal> vector = qVariantValue<QVector<qreal> >(value);
68 QVector<qreal> vector = qVariantValue<QVector<qreal> >(value);
69 m_axis->applyLayout(vector);
69 m_axis->applyLayout(vector);
70 }
70 }
71
71
72 #include "moc_axisanimationitem_p.cpp"
72 #include "moc_axisanimationitem_p.cpp"
73
73
74 QTCOMMERCIALCHART_END_NAMESPACE
74 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,45 +1,45
1 #ifndef AXISANIMATIONITEM_H_
1 #ifndef AXISANIMATIONITEM_H_
2 #define AXISANIMATIONITEM_H_
2 #define AXISANIMATIONITEM_H_
3
3
4 #include "domain_p.h"
4 #include "domain_p.h"
5 #include "axisitem_p.h"
5 #include "axisitem_p.h"
6 #include <QGraphicsItem>
6 #include <QGraphicsItem>
7 #include <QVariantAnimation>
7 #include <QVariantAnimation>
8
8
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10
10
11 class AxisAnimator;
11 class AxisAnimator;
12
12
13 class AxisAnimationItem : public AxisItem
13 class AxisAnimationItem : public AxisItem
14 {
14 {
15 Q_OBJECT
15 Q_OBJECT
16
16
17 public:
17 public:
18 AxisAnimationItem(AxisType type = X_AXIS,QGraphicsItem* parent = 0);
18 AxisAnimationItem(QChartAxis* axis,AxisType type = X_AXIS,QGraphicsItem* parent = 0);
19 ~AxisAnimationItem();
19 ~AxisAnimationItem();
20
20
21 void setLabelsAngle(int angle);
21 void setLabelsAngle(int angle);
22
22
23 protected:
23 protected:
24 virtual void updateItems(QVector<qreal>& oldLayout,QVector<qreal>& newLayout);
24 virtual void updateItems(QVector<qreal>& oldLayout,QVector<qreal>& newLayout);
25 private:
25 private:
26 AxisAnimator *m_animation;
26 AxisAnimator *m_animation;
27 };
27 };
28
28
29 class AxisAnimator: public QVariantAnimation
29 class AxisAnimator: public QVariantAnimation
30 {
30 {
31 public:
31 public:
32 AxisAnimator(AxisItem *axis,QObject *parent = 0);
32 AxisAnimator(AxisItem *axis,QObject *parent = 0);
33 ~AxisAnimator();
33 ~AxisAnimator();
34 protected:
34 protected:
35 virtual QVariant interpolated (const QVariant & from, const QVariant & to, qreal progress ) const;
35 virtual QVariant interpolated (const QVariant & from, const QVariant & to, qreal progress ) const;
36 virtual void updateCurrentValue (const QVariant & value );
36 virtual void updateCurrentValue (const QVariant & value );
37 private:
37 private:
38 AxisItem* m_axis;
38 AxisItem* m_axis;
39 };
39 };
40
40
41 QTCOMMERCIALCHART_END_NAMESPACE
41 QTCOMMERCIALCHART_END_NAMESPACE
42
42
43
43
44
44
45 #endif /* AXISITEM_H_ */
45 #endif /* AXISITEM_H_ */
@@ -1,340 +1,377
1 #include "axisitem_p.h"
1 #include "axisitem_p.h"
2 #include "qchartaxis.h"
2 #include "qchartaxis.h"
3 #include "chartpresenter_p.h"
3 #include "chartpresenter_p.h"
4 #include <QPainter>
4 #include <QPainter>
5 #include <QDebug>
5 #include <QDebug>
6
6
7 static int label_padding = 5;
7 static int label_padding = 5;
8
8
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10
10
11 AxisItem::AxisItem(AxisType type,QGraphicsItem* parent) :
11 AxisItem::AxisItem(QChartAxis* axis,AxisType type,QGraphicsItem* parent) :
12 ChartItem(parent),
12 ChartItem(parent),
13 m_chartAxis(axis),
13 m_type(type),
14 m_type(type),
14 m_labelsAngle(0),
15 m_labelsAngle(0),
15 m_grid(parent),
16 m_grid(parent),
16 m_shades(parent),
17 m_shades(parent),
17 m_labels(parent),
18 m_labels(parent),
18 m_axis(parent)
19 m_axis(parent)
19 {
20 {
20 //initial initialization
21 //initial initialization
21 m_axis.setZValue(ChartPresenter::AxisZValue);
22 m_axis.setZValue(ChartPresenter::AxisZValue);
22 m_shades.setZValue(ChartPresenter::ShadesZValue);
23 m_shades.setZValue(ChartPresenter::ShadesZValue);
23 m_grid.setZValue(ChartPresenter::GridZValue);
24 m_grid.setZValue(ChartPresenter::GridZValue);
24 setFlags(QGraphicsItem::ItemHasNoContents);
25 setFlags(QGraphicsItem::ItemHasNoContents);
26
27 QObject::connect(m_chartAxis,SIGNAL(updated()),this,SLOT(handleAxisUpdated()));
25 }
28 }
26
29
27 AxisItem::~AxisItem()
30 AxisItem::~AxisItem()
28 {
31 {
29 }
32 }
30
33
31 QRectF AxisItem::boundingRect() const
34 QRectF AxisItem::boundingRect() const
32 {
35 {
33 return QRectF();
36 return QRectF();
34 }
37 }
35
38
36 void AxisItem::createItems(int count)
39 void AxisItem::createItems(int count)
37 {
40 {
38 if(m_axis.children().size()==0)
41 if(m_axis.children().size()==0)
39 m_axis.addToGroup(new QGraphicsLineItem());
42 m_axis.addToGroup(new QGraphicsLineItem());
40 for (int i = 0; i < count; ++i) {
43 for (int i = 0; i < count; ++i) {
41 m_grid.addToGroup(new QGraphicsLineItem());
44 m_grid.addToGroup(new QGraphicsLineItem());
42 m_labels.addToGroup(new QGraphicsSimpleTextItem());
45 m_labels.addToGroup(new QGraphicsSimpleTextItem());
43 if(m_grid.childItems().size()%2) m_shades.addToGroup(new QGraphicsRectItem());
46 if(m_grid.childItems().size()%2) m_shades.addToGroup(new QGraphicsRectItem());
44 m_axis.addToGroup(new QGraphicsLineItem());
47 m_axis.addToGroup(new QGraphicsLineItem());
45 }
48 }
46 }
49 }
47
50
48 void AxisItem::clear(int count)
51 void AxisItem::clear(int count)
49 {
52 {
50 QList<QGraphicsItem *> lines = m_grid.childItems();
53 QList<QGraphicsItem *> lines = m_grid.childItems();
51 QList<QGraphicsItem *> labels = m_labels.childItems();
54 QList<QGraphicsItem *> labels = m_labels.childItems();
52 QList<QGraphicsItem *> shades = m_shades.childItems();
55 QList<QGraphicsItem *> shades = m_shades.childItems();
53 QList<QGraphicsItem *> axis = m_axis.childItems();
56 QList<QGraphicsItem *> axis = m_axis.childItems();
54
57
55 for (int i = 0; i < count; ++i) {
58 for (int i = 0; i < count; ++i) {
56 delete(lines.takeLast());
59 delete(lines.takeLast());
57 delete(labels.takeLast());
60 delete(labels.takeLast());
58 if(lines.size()%2) delete(shades.takeLast());
61 if(lines.size()%2) delete(shades.takeLast());
59 delete(axis.takeLast());
62 delete(axis.takeLast());
60 }
63 }
61 }
64 }
62
65
63 void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
66 void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
64 {
67 {
65 Q_UNUSED(painter);
68 Q_UNUSED(painter);
66 Q_UNUSED(option);
69 Q_UNUSED(option);
67 Q_UNUSED(widget);
70 Q_UNUSED(widget);
68 }
71 }
69
72
70 void AxisItem::updateItems(QVector<qreal>& oldLayout,QVector<qreal>& newLayout)
73 void AxisItem::updateItems(QVector<qreal>& oldLayout,QVector<qreal>& newLayout)
71 {
74 {
72 if(newLayout.count()==0) return;
75 if(newLayout.count()==0) return;
73 applyLayout(newLayout);
76 applyLayout(newLayout);
74 oldLayout=newLayout;
77 oldLayout=newLayout;
75 }
78 }
76
79
77 void AxisItem::handleAxisUpdate(QChartAxis* axis)
80 QStringList AxisItem::createLabels(int ticks, qreal min, qreal max)
78 {
81 {
79 if(m_layoutVector.count()==0) return;
80
82
81 if(axis->isAxisVisible()) {
82 setAxisOpacity(100);
83 }
84 else {
85 setAxisOpacity(0);
86 }
87
83
88 if(axis->isGridVisible()) {
84 Q_ASSERT(max>=min);
89 setGridOpacity(100);
90 }
91 else {
92 setGridOpacity(0);
93 }
94
85
95 if(axis->labelsVisible())
86 QStringList labels;
96 {
97 setLabelsOpacity(100);
98 }
99 else {
100 setLabelsOpacity(0);
101 }
102
87
103 if(axis->shadesVisible()) {
88 //int ticks = axis->ticksCount()-1;
104 setShadesOpacity(axis->shadesOpacity());
105 }
106 else {
107 setShadesOpacity(0);
108 }
109
110 setLabelsAngle(axis->labelsAngle());
111 setAxisPen(axis->axisPen());
112 setLabelsPen(axis->labelsPen());
113 setLabelsBrush(axis->labelsBrush());
114 setLabelsFont(axis->labelsFont());
115 setGridPen(axis->gridPen());
116 setShadesPen(axis->shadesPen());
117 setShadesBrush(axis->shadesBrush());
118 }
119
120 void AxisItem::handleRangeChanged(QChartAxis* axis,const QStringList& labels)
121 {
122 int diff = m_thicksList.size() - labels.size();
123
89
124 if(diff>0){
90 for(int i=0; i<= ticks; i++) {
125 clear(diff);
91 qreal value = min + (i * (max - min)/ ticks);
126 }else if(diff<0){
92 QString label ;//= axis->axisTickLabel(value);
127 createItems(-diff);
93 if(label.isEmpty()) {
94 labels << QString::number(value);
95 }
96 else {
97 labels << label;
98 }
128 }
99 }
129 m_thicksList=labels;
100 return labels;
130 QVector<qreal> vector = calculateLayout();
131 updateItems(m_layoutVector,vector);
132 if(diff!=0) handleAxisUpdate(axis);
133 }
134
135 void AxisItem::handleGeometryChanged(const QRectF& rect)
136 {
137 m_rect = rect;
138
139 if(m_thicksList.size()==0) return;
140
141 QVector<qreal> vector = calculateLayout();
142 updateItems(m_layoutVector,vector);
143 }
101 }
144
102
145 void AxisItem::setAxisOpacity(qreal opacity)
103 void AxisItem::setAxisOpacity(qreal opacity)
146 {
104 {
147 m_axis.setOpacity(opacity);
105 m_axis.setOpacity(opacity);
148 }
106 }
149
107
150 qreal AxisItem::axisOpacity() const
108 qreal AxisItem::axisOpacity() const
151 {
109 {
152 return m_axis.opacity();
110 return m_axis.opacity();
153 }
111 }
154
112
155 void AxisItem::setGridOpacity(qreal opacity)
113 void AxisItem::setGridOpacity(qreal opacity)
156 {
114 {
157 m_grid.setOpacity(opacity);
115 m_grid.setOpacity(opacity);
158 }
116 }
159
117
160 qreal AxisItem::gridOpacity() const
118 qreal AxisItem::gridOpacity() const
161 {
119 {
162 return m_grid.opacity();
120 return m_grid.opacity();
163 }
121 }
164
122
165 void AxisItem::setLabelsOpacity(qreal opacity)
123 void AxisItem::setLabelsOpacity(qreal opacity)
166 {
124 {
167 m_labels.setOpacity(opacity);
125 m_labels.setOpacity(opacity);
168 }
126 }
169
127
170 qreal AxisItem::labelsOpacity() const
128 qreal AxisItem::labelsOpacity() const
171 {
129 {
172 return m_labels.opacity();
130 return m_labels.opacity();
173 }
131 }
174
132
175 void AxisItem::setShadesOpacity(qreal opacity)
133 void AxisItem::setShadesOpacity(qreal opacity)
176 {
134 {
177 m_shades.setOpacity(opacity);
135 m_shades.setOpacity(opacity);
178 }
136 }
179
137
180 qreal AxisItem::shadesOpacity() const
138 qreal AxisItem::shadesOpacity() const
181 {
139 {
182 return m_shades.opacity();
140 return m_shades.opacity();
183 }
141 }
184
142
185 void AxisItem::setLabelsAngle(int angle)
143 void AxisItem::setLabelsAngle(int angle)
186 {
144 {
187 foreach(QGraphicsItem* item , m_labels.childItems()) {
145 foreach(QGraphicsItem* item , m_labels.childItems()) {
188 QPointF center = item->boundingRect().center();
146 QPointF center = item->boundingRect().center();
189 item->setRotation(angle);
147 item->setRotation(angle);
190 }
148 }
191
149
192 m_labelsAngle=angle;
150 m_labelsAngle=angle;
193 }
151 }
194
152
195 void AxisItem::setLabelsPen(const QPen& pen)
153 void AxisItem::setLabelsPen(const QPen& pen)
196 {
154 {
197 foreach(QGraphicsItem* item , m_labels.childItems()) {
155 foreach(QGraphicsItem* item , m_labels.childItems()) {
198 static_cast<QGraphicsSimpleTextItem*>(item)->setPen(pen);
156 static_cast<QGraphicsSimpleTextItem*>(item)->setPen(pen);
199 }
157 }
200 }
158 }
201
159
202 void AxisItem::setLabelsBrush(const QBrush& brush)
160 void AxisItem::setLabelsBrush(const QBrush& brush)
203 {
161 {
204 foreach(QGraphicsItem* item , m_labels.childItems()) {
162 foreach(QGraphicsItem* item , m_labels.childItems()) {
205 static_cast<QGraphicsSimpleTextItem*>(item)->setBrush(brush);
163 static_cast<QGraphicsSimpleTextItem*>(item)->setBrush(brush);
206 }
164 }
207 }
165 }
208
166
209 void AxisItem::setLabelsFont(const QFont& font)
167 void AxisItem::setLabelsFont(const QFont& font)
210 {
168 {
211 foreach(QGraphicsItem* item , m_labels.childItems()) {
169 foreach(QGraphicsItem* item , m_labels.childItems()) {
212 static_cast<QGraphicsSimpleTextItem*>(item)->setFont(font);
170 static_cast<QGraphicsSimpleTextItem*>(item)->setFont(font);
213 }
171 }
214 }
172 }
215
173
216 void AxisItem::setShadesBrush(const QBrush& brush)
174 void AxisItem::setShadesBrush(const QBrush& brush)
217 {
175 {
218 foreach(QGraphicsItem* item , m_shades.childItems()) {
176 foreach(QGraphicsItem* item , m_shades.childItems()) {
219 static_cast<QGraphicsRectItem*>(item)->setBrush(brush);
177 static_cast<QGraphicsRectItem*>(item)->setBrush(brush);
220 }
178 }
221 }
179 }
222
180
223 void AxisItem::setShadesPen(const QPen& pen)
181 void AxisItem::setShadesPen(const QPen& pen)
224 {
182 {
225 foreach(QGraphicsItem* item , m_shades.childItems()) {
183 foreach(QGraphicsItem* item , m_shades.childItems()) {
226 static_cast<QGraphicsRectItem*>(item)->setPen(pen);
184 static_cast<QGraphicsRectItem*>(item)->setPen(pen);
227 }
185 }
228 }
186 }
229
187
230 void AxisItem::setAxisPen(const QPen& pen)
188 void AxisItem::setAxisPen(const QPen& pen)
231 {
189 {
232 foreach(QGraphicsItem* item , m_axis.childItems()) {
190 foreach(QGraphicsItem* item , m_axis.childItems()) {
233 static_cast<QGraphicsLineItem*>(item)->setPen(pen);
191 static_cast<QGraphicsLineItem*>(item)->setPen(pen);
234 }
192 }
235 }
193 }
236
194
237 void AxisItem::setGridPen(const QPen& pen)
195 void AxisItem::setGridPen(const QPen& pen)
238 {
196 {
239 foreach(QGraphicsItem* item , m_grid.childItems()) {
197 foreach(QGraphicsItem* item , m_grid.childItems()) {
240 static_cast<QGraphicsLineItem*>(item)->setPen(pen);
198 static_cast<QGraphicsLineItem*>(item)->setPen(pen);
241 }
199 }
242 }
200 }
243
201
244 QVector<qreal> AxisItem::calculateLayout() const
202 QVector<qreal> AxisItem::calculateLayout() const
245 {
203 {
246 QVector<qreal> points;
204 QVector<qreal> points;
247 points.resize(m_thicksList.size());
205 points.resize(m_thicksList.size());
248
206
249 switch (m_type)
207 switch (m_type)
250 {
208 {
251 case X_AXIS:
209 case X_AXIS:
252 {
210 {
253 const qreal deltaX = m_rect.width()/(m_thicksList.size()-1);
211 const qreal deltaX = m_rect.width()/(m_thicksList.size()-1);
254 for (int i = 0; i < m_thicksList.size(); ++i) {
212 for (int i = 0; i < m_thicksList.size(); ++i) {
255 int x = i * deltaX + m_rect.left();
213 int x = i * deltaX + m_rect.left();
256 points[i] = x;
214 points[i] = x;
257 }
215 }
258 }
216 }
259 break;
217 break;
260 case Y_AXIS:
218 case Y_AXIS:
261 {
219 {
262 const qreal deltaY = m_rect.height()/(m_thicksList.size()-1);
220 const qreal deltaY = m_rect.height()/(m_thicksList.size()-1);
263 for (int i = 0; i < m_thicksList.size(); ++i) {
221 for (int i = 0; i < m_thicksList.size(); ++i) {
264 int y = i * -deltaY + m_rect.bottom();
222 int y = i * -deltaY + m_rect.bottom();
265 points[i] = y;
223 points[i] = y;
266 }
224 }
267 }
225 }
268 break;
226 break;
269 }
227 }
270 return points;
228 return points;
271 }
229 }
272
230
273 void AxisItem::applyLayout(const QVector<qreal>& points)
231 void AxisItem::applyLayout(const QVector<qreal>& points)
274 {
232 {
275 Q_ASSERT(points.size() == m_thicksList.size());
233 Q_ASSERT(points.size() == m_thicksList.size());
276
234
277 QList<QGraphicsItem *> lines = m_grid.childItems();
235 QList<QGraphicsItem *> lines = m_grid.childItems();
278 QList<QGraphicsItem *> labels = m_labels.childItems();
236 QList<QGraphicsItem *> labels = m_labels.childItems();
279 QList<QGraphicsItem *> shades = m_shades.childItems();
237 QList<QGraphicsItem *> shades = m_shades.childItems();
280 QList<QGraphicsItem *> axis = m_axis.childItems();
238 QList<QGraphicsItem *> axis = m_axis.childItems();
281
239
282 Q_ASSERT(labels.size() == m_thicksList.size());
240 Q_ASSERT(labels.size() == m_thicksList.size());
283
241
284 switch (m_type)
242 switch (m_type)
285 {
243 {
286 case X_AXIS:
244 case X_AXIS:
287 {
245 {
288 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
246 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
289 lineItem->setLine(m_rect.left(), m_rect.bottom(), m_rect.right(), m_rect.bottom());
247 lineItem->setLine(m_rect.left(), m_rect.bottom(), m_rect.right(), m_rect.bottom());
290
248
291 for (int i = 0; i < points.size(); ++i) {
249 for (int i = 0; i < points.size(); ++i) {
292 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
250 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
293 lineItem->setLine(points[i], m_rect.top(), points[i], m_rect.bottom());
251 lineItem->setLine(points[i], m_rect.top(), points[i], m_rect.bottom());
294 QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
252 QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
295 labelItem->setText(m_thicksList.at(i));
253 labelItem->setText(m_thicksList.at(i));
296 QPointF center = labelItem->boundingRect().center();
254 QPointF center = labelItem->boundingRect().center();
297 labelItem->setTransformOriginPoint(center.x(), center.y());
255 labelItem->setTransformOriginPoint(center.x(), center.y());
298 labelItem->setPos(points[i] - center.x(), m_rect.bottom() + label_padding);
256 labelItem->setPos(points[i] - center.x(), m_rect.bottom() + label_padding);
299 if(i%2){
257 if(i%2){
300 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2));
258 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2));
301 rectItem->setRect(points[i],m_rect.top(),points[i+1]-points[i],m_rect.height());
259 rectItem->setRect(points[i],m_rect.top(),points[i+1]-points[i],m_rect.height());
302 }
260 }
303 lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
261 lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
304 lineItem->setLine(points[i],m_rect.bottom(),points[i],m_rect.bottom()+5);
262 lineItem->setLine(points[i],m_rect.bottom(),points[i],m_rect.bottom()+5);
305 }
263 }
306 }
264 }
307 break;
265 break;
308
266
309 case Y_AXIS:
267 case Y_AXIS:
310 {
268 {
311 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
269 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
312 lineItem->setLine(m_rect.left() , m_rect.top(), m_rect.left(), m_rect.bottom());
270 lineItem->setLine(m_rect.left() , m_rect.top(), m_rect.left(), m_rect.bottom());
313
271
314 for (int i = 0; i < points.size(); ++i) {
272 for (int i = 0; i < points.size(); ++i) {
315 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
273 QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
316 lineItem->setLine(m_rect.left() , points[i], m_rect.right(), points[i]);
274 lineItem->setLine(m_rect.left() , points[i], m_rect.right(), points[i]);
317 QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
275 QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
318 labelItem->setText(m_thicksList.at(i));
276 labelItem->setText(m_thicksList.at(i));
319 QPointF center = labelItem->boundingRect().center();
277 QPointF center = labelItem->boundingRect().center();
320 labelItem->setTransformOriginPoint(center.x(), center.y());
278 labelItem->setTransformOriginPoint(center.x(), center.y());
321 labelItem->setPos(m_rect.left() - labelItem->boundingRect().width() - label_padding , points[i]-center.y());
279 labelItem->setPos(m_rect.left() - labelItem->boundingRect().width() - label_padding , points[i]-center.y());
322 if(i%2){
280 if(i%2){
323 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2));
281 QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2));
324 rectItem->setRect(m_rect.left(),points[i],m_rect.width(),points[i]-points[i+1]);
282 rectItem->setRect(m_rect.left(),points[i],m_rect.width(),points[i]-points[i+1]);
325 }
283 }
326 lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
284 lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
327 lineItem->setLine(m_rect.left()-5,points[i],m_rect.left(),points[i]);
285 lineItem->setLine(m_rect.left()-5,points[i],m_rect.left(),points[i]);
328 }
286 }
329 }
287 }
330 break;
288 break;
331 default:
289 default:
332 qDebug()<<"Unknown axis type";
290 qDebug()<<"Unknown axis type";
333 break;
291 break;
334 }
292 }
335 }
293 }
336
294
295 //handlers
296
297 void AxisItem::handleAxisUpdated()
298 {
299 if(m_layoutVector.count()==0) return;
300
301 if(m_chartAxis->isAxisVisible()) {
302 setAxisOpacity(100);
303 }
304 else {
305 setAxisOpacity(0);
306 }
307
308 if(m_chartAxis->isGridVisible()) {
309 setGridOpacity(100);
310 }
311 else {
312 setGridOpacity(0);
313 }
314
315 if(m_chartAxis->labelsVisible())
316 {
317 setLabelsOpacity(100);
318 }
319 else {
320 setLabelsOpacity(0);
321 }
322
323 if(m_chartAxis->shadesVisible()) {
324 setShadesOpacity(m_chartAxis->shadesOpacity());
325 }
326 else {
327 setShadesOpacity(0);
328 }
329
330 setLabelsAngle(m_chartAxis->labelsAngle());
331 setAxisPen(m_chartAxis->axisPen());
332 setLabelsPen(m_chartAxis->labelsPen());
333 setLabelsBrush(m_chartAxis->labelsBrush());
334 setLabelsFont(m_chartAxis->labelsFont());
335 setGridPen(m_chartAxis->gridPen());
336 setShadesPen(m_chartAxis->shadesPen());
337 setShadesBrush(m_chartAxis->shadesBrush());
338 }
339
340 void AxisItem::handleRangeChanged(qreal min, qreal max)
341 {
342 if(min == max) return;
343
344 QStringList labels = createLabels(4,min,max);
345
346 int diff = m_thicksList.size() - labels.size();
347
348 if(diff>0){
349 clear(diff);
350 }else if(diff<0){
351 createItems(-diff);
352 }
353 m_thicksList=labels;
354
355 if(m_rect.isEmpty()) return;
356
357 QVector<qreal> vector = calculateLayout();
358
359 updateItems(m_layoutVector,vector);
360
361 if(diff!=0) handleAxisUpdated();
362 }
363
364 void AxisItem::handleGeometryChanged(const QRectF& rect)
365 {
366 m_rect = rect;
367
368 if(m_thicksList.size()==0) return;
369
370 QVector<qreal> vector = calculateLayout();
371 updateItems(m_layoutVector,vector);
372 }
373
337 //TODO "nice numbers algorithm"
374 //TODO "nice numbers algorithm"
338 #include "moc_axisitem_p.cpp"
375 #include "moc_axisitem_p.cpp"
339
376
340 QTCOMMERCIALCHART_END_NAMESPACE
377 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,79 +1,82
1 #ifndef AXISITEM_H_
1 #ifndef AXISITEM_H_
2 #define AXISITEM_H_
2 #define AXISITEM_H_
3
3
4 #include "domain_p.h"
4 #include "domain_p.h"
5 #include "chartitem_p.h"
5 #include "chartitem_p.h"
6 #include <QGraphicsItem>
6 #include <QGraphicsItem>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 class QChartAxis;
10 class QChartAxis;
11
11
12 class AxisItem : public QObject, public ChartItem
12 class AxisItem : public QObject, public ChartItem
13 {
13 {
14 Q_OBJECT
14 Q_OBJECT
15 public:
15 public:
16 enum AxisType{X_AXIS,Y_AXIS};
16 enum AxisType{X_AXIS,Y_AXIS};
17
17
18 AxisItem(AxisType type = X_AXIS,QGraphicsItem* parent = 0);
18 AxisItem(QChartAxis* axis,AxisType type = X_AXIS,QGraphicsItem* parent = 0);
19 ~AxisItem();
19 ~AxisItem();
20
20
21 //from QGraphicsItem
21 //from QGraphicsItem
22 QRectF boundingRect() const;
22 QRectF boundingRect() const;
23 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
23 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
24
24
25 AxisType axisType() const {return m_type;};
25 AxisType axisType() const {return m_type;};
26
26
27 void setAxisOpacity(qreal opacity);
27 void setAxisOpacity(qreal opacity);
28 qreal axisOpacity() const;
28 qreal axisOpacity() const;
29
29
30 void setGridOpacity(qreal opacity);
30 void setGridOpacity(qreal opacity);
31 qreal gridOpacity() const;
31 qreal gridOpacity() const;
32
32
33 void setLabelsOpacity(qreal opacity);
33 void setLabelsOpacity(qreal opacity);
34 qreal labelsOpacity() const;
34 qreal labelsOpacity() const;
35
35
36 void setShadesOpacity(qreal opacity);
36 void setShadesOpacity(qreal opacity);
37 qreal shadesOpacity() const;
37 qreal shadesOpacity() const;
38
38
39 void setLabelsAngle(int angle);
39 void setLabelsAngle(int angle);
40 int labelsAngle()const { return m_labelsAngle; }
40 int labelsAngle()const { return m_labelsAngle; }
41
41
42 void setShadesBrush(const QBrush& brush);
42 void setShadesBrush(const QBrush& brush);
43 void setShadesPen(const QPen& pen);
43 void setShadesPen(const QPen& pen);
44
44
45 void setAxisPen(const QPen& pen);
45 void setAxisPen(const QPen& pen);
46 void setGridPen(const QPen& pen);
46 void setGridPen(const QPen& pen);
47
47
48 void setLabelsPen(const QPen& pen);
48 void setLabelsPen(const QPen& pen);
49 void setLabelsBrush(const QBrush& brush);
49 void setLabelsBrush(const QBrush& brush);
50 void setLabelsFont(const QFont& font);
50 void setLabelsFont(const QFont& font);
51
51
52 public slots:
52 public slots:
53 void handleAxisUpdate(QChartAxis* axis); //look and feel
53 void handleAxisUpdated();//qchartaxis update calls
54 void handleRangeChanged(QChartAxis* axis,const QStringList& labels); //labels from dataset
54 void handleRangeChanged(qreal min , qreal max); //domain update calls
55 void handleGeometryChanged(const QRectF& size); // geometry from presenter
55 void handleGeometryChanged(const QRectF& size); //geometry update calls
56
56 public:
57 public:
57 virtual void updateItems(QVector<qreal>& oldLayout,QVector<qreal>& newLayout);
58 virtual void updateItems(QVector<qreal>& oldLayout,QVector<qreal>& newLayout);
58 QVector<qreal> calculateLayout() const;
59 QVector<qreal> calculateLayout() const;
59 void applyLayout(const QVector<qreal>& points);
60 void applyLayout(const QVector<qreal>& points);
60
61
61 private:
62 private:
62 void clear(int count);
63 void clear(int count);
63 void createItems(int count);
64 void createItems(int count);
65 QStringList createLabels(int ticks, qreal min, qreal max);
64 private:
66 private:
67 QChartAxis* m_chartAxis;
65 AxisType m_type;
68 AxisType m_type;
66 QRectF m_rect;
69 QRectF m_rect;
67 int m_labelsAngle;
70 int m_labelsAngle;
68 QGraphicsItemGroup m_grid;
71 QGraphicsItemGroup m_grid;
69 QGraphicsItemGroup m_shades;
72 QGraphicsItemGroup m_shades;
70 QGraphicsItemGroup m_labels;
73 QGraphicsItemGroup m_labels;
71 QGraphicsItemGroup m_axis;
74 QGraphicsItemGroup m_axis;
72 QStringList m_thicksList;
75 QStringList m_thicksList;
73 QVector<qreal> m_layoutVector;
76 QVector<qreal> m_layoutVector;
74
77
75 };
78 };
76
79
77 QTCOMMERCIALCHART_END_NAMESPACE
80 QTCOMMERCIALCHART_END_NAMESPACE
78
81
79 #endif /* AXISITEM_H_ */
82 #endif /* AXISITEM_H_ */
This diff has been collapsed as it changes many lines, (532 lines changed) Show them Hide them
@@ -1,448 +1,288
1 #include "chartdataset_p.h"
1 #include "chartdataset_p.h"
2 #include "qchartaxis.h"
2 #include "qchartaxis.h"
3 //series
3 //series
4 #include "qlineseries.h"
4 #include "qlineseries.h"
5 #include "qareaseries.h"
5 #include "qareaseries.h"
6 #include "qbarseries.h"
6 #include "qbarseries.h"
7 #include "qstackedbarseries.h"
7 #include "qstackedbarseries.h"
8 #include "qpercentbarseries.h"
8 #include "qpercentbarseries.h"
9 #include "qpieseries.h"
9 #include "qpieseries.h"
10 #include "qscatterseries.h"
10 #include "qscatterseries.h"
11 #include "qsplineseries.h"
11 #include "qsplineseries.h"
12
12
13 QTCOMMERCIALCHART_BEGIN_NAMESPACE
13 QTCOMMERCIALCHART_BEGIN_NAMESPACE
14
14
15 ChartDataSet::ChartDataSet(QObject *parent):QObject(parent),
15 ChartDataSet::ChartDataSet(QObject *parent):QObject(parent),
16 m_axisX(new QChartAxis(this)),
16 m_axisX(new QChartAxis(this)),
17 m_axisY(new QChartAxis(this)),
17 m_axisY(new QChartAxis(this)),
18 m_domainIndex(0),
18 m_domainIndex(0),
19 m_axisXInitialized(false)
19 m_axisXInitialized(false)
20 {
20 {
21 }
21 }
22
22
23 ChartDataSet::~ChartDataSet()
23 ChartDataSet::~ChartDataSet()
24 {
24 {
25 // TODO Auto-generated destructor stub
26 }
27
28 const Domain ChartDataSet::domain(QChartAxis *axisY) const
29 {
30 int i = m_domainMap.count(axisY);
31 if(i == 0){
32 return Domain();
33 }
34 i = i - m_domainIndex -1;
35 return m_domainMap.values(axisY).at(i);
36 }
25 }
37
26
38 void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY)
27 void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY)
39 {
28 {
40 // TODO: we should check the series not already added
29 if(axisY==0) axisY = m_axisY;
41
30
42 series->setParent(this);// take ownership
31 QChartAxis* axis = m_seriesAxisMap.value(series);
43 clearDomains();
44
32
45 if(axisY==0) axisY = m_axisY;
33 if(axis) {
46 axisY->setParent(this);// take ownership
34 qWarning() << "Can not add series. Series already on the chart";
35 return;
36 }
47
37
48 QList<QSeries*> seriesList = m_seriesMap.values(axisY);
38 if(!series->parent()){
39 series->setParent(this); // take ownership
40 };
49
41
50 QList<Domain> domainList = m_domainMap.values(axisY);
42 if(!axisY->parent()){
43 axisY->setParent(this); // take ownership
44 }
51
45
52 Q_ASSERT(domainList.size()<=1);
46 Domain* domain = m_axisDomainMap.value(axisY);
53
47
54 Domain domain;
48 if(!domain) {
49 domain = new Domain();
55
50
56 if(domainList.size()>0) domain = domainList.at(0);
51 QObject::connect(axisY,SIGNAL(rangeChanged(qreal,qreal)),domain,SLOT(handleAxisRangeXChanged(qreal,qreal)));
52 QObject::connect(axisX(),SIGNAL(rangeChanged(qreal,qreal)),domain,SLOT(handleAxisRangeYChanged(qreal,qreal)));
57
53
58 switch(series->type())
54 m_axisDomainMap.insert(axisY,domain);
59 {
55 emit axisAdded(axisY,domain);
60 case QSeries::SeriesTypeLine: {
61
62 QLineSeries* lineSeries = static_cast<QLineSeries*>(series);
63
64 for (int i = 0; i < lineSeries->count(); i++)
65 {
66 qreal x = lineSeries->x(i);
67 qreal y = lineSeries->y(i);
68 domain.m_minX = qMin(domain.m_minX,x);
69 domain.m_minY = qMin(domain.m_minY,y);
70 domain.m_maxX = qMax(domain.m_maxX,x);
71 domain.m_maxY = qMax(domain.m_maxY,y);
72 }
73 break;
74 }
56 }
75 case QSeries::SeriesTypeArea: {
76
57
77 QAreaSeries* areaSeries = static_cast<QAreaSeries*>(series);
58 if(!m_axisXInitialized){
59 emit axisAdded(axisX(),domain);
60 m_axisXInitialized=true;
61 }
78
62
79 QLineSeries* upperSeries = areaSeries->upperSeries();
63 calculateDomain(series,domain);
80 QLineSeries* lowerSeries = areaSeries->lowerSeries();
81
64
82 for (int i = 0; i < upperSeries->count(); i++)
65 m_seriesAxisMap.insert(series,axisY);
83 {
66 emit seriesAdded(series,domain);
84 qreal x = upperSeries->x(i);
85 qreal y = upperSeries->y(i);
86 domain.m_minX = qMin(domain.m_minX,x);
87 domain.m_minY = qMin(domain.m_minY,y);
88 domain.m_maxX = qMax(domain.m_maxX,x);
89 domain.m_maxY = qMax(domain.m_maxY,y);
90 }
91 if(lowerSeries){
92 for (int i = 0; i < lowerSeries->count(); i++)
93 {
94 qreal x = lowerSeries->x(i);
95 qreal y = lowerSeries->y(i);
96 domain.m_minX = qMin(domain.m_minX,x);
97 domain.m_minY = qMin(domain.m_minY,y);
98 domain.m_maxX = qMax(domain.m_maxX,x);
99 domain.m_maxY = qMax(domain.m_maxY,y);
100 }}
101 break;
102 }
103 case QSeries::SeriesTypeBar: {
104 qDebug() << "QChartSeries::SeriesTypeBar";
105 QBarSeries* barSeries = static_cast<QBarSeries*>(series);
106 qreal x = barSeries->categoryCount();
107 qreal y = barSeries->max();
108 domain.m_minX = qMin(domain.m_minX,x);
109 domain.m_minY = qMin(domain.m_minY,y);
110 domain.m_maxX = qMax(domain.m_maxX,x);
111 domain.m_maxY = qMax(domain.m_maxY,y);
112 break;
113 }
114 case QSeries::SeriesTypeStackedBar: {
115 qDebug() << "QChartSeries::SeriesTypeStackedBar";
116
117 QStackedBarSeries* stackedBarSeries = static_cast<QStackedBarSeries*>(series);
118 qreal x = stackedBarSeries->categoryCount();
119 qreal y = stackedBarSeries->maxCategorySum();
120 domain.m_minX = qMin(domain.m_minX,x);
121 domain.m_minY = qMin(domain.m_minY,y);
122 domain.m_maxX = qMax(domain.m_maxX,x);
123 domain.m_maxY = qMax(domain.m_maxY,y);
124 break;
125 }
126 case QSeries::SeriesTypePercentBar: {
127 qDebug() << "QChartSeries::SeriesTypePercentBar";
128
129 QPercentBarSeries* percentBarSeries = static_cast<QPercentBarSeries*>(series);
130 qreal x = percentBarSeries->categoryCount();
131 domain.m_minX = qMin(domain.m_minX,x);
132 domain.m_minY = 0;
133 domain.m_maxX = qMax(domain.m_maxX,x);
134 domain.m_maxY = 100;
135 break;
136 }
137
67
138 case QSeries::SeriesTypePie: {
68 }
139 QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
140 // TODO: domain stuff
141 break;
142 }
143
69
144 case QSeries::SeriesTypeScatter: {
70 void ChartDataSet::removeSeries(QSeries* series)
145 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
71 {
146 Q_ASSERT(scatterSeries);
147 foreach (QPointF point, scatterSeries->data()) {
148 domain.m_minX = qMin(domain.m_minX, point.x());
149 domain.m_maxX = qMax(domain.m_maxX, point.x());
150 domain.m_minY = qMin(domain.m_minY, point.y());
151 domain.m_maxY = qMax(domain.m_maxY, point.y());
152 }
153 break;
154 }
155
72
156 case QSeries::SeriesTypeSpline: {
73 QChartAxis* axis = m_seriesAxisMap.value(series);
157 QSplineSeries* splineSeries = static_cast<QSplineSeries*>(series);
158
159 for (int i = 0; i < splineSeries->count(); i++)
160 {
161 qreal x = splineSeries->x(i);
162 qreal y = splineSeries->y(i);
163 domain.m_minX = qMin(domain.m_minX,x);
164 domain.m_minY = qMin(domain.m_minY,y);
165 domain.m_maxX = qMax(domain.m_maxX,x);
166 domain.m_maxY = qMax(domain.m_maxY,y);
167 }
168 break;
169 }
170
74
171 default: {
75 if(!axis){
172 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
76 qWarning()<<"Can not remove series. Series not found on the chart.";
173 return;
77 return;
174 break;
175 }
78 }
79 emit seriesRemoved(series);
80 m_seriesAxisMap.remove(series);
176
81
82 if(series->parent()==this){
83 delete series;
84 series=0;
177 }
85 }
178
86
179 if(!m_domainMap.contains(axisY))
87 QList<QChartAxis*> axes = m_seriesAxisMap.values();
180 {
181 emit axisAdded(axisY);
182 QObject::connect(axisY,SIGNAL(rangeChanged(QChartAxis*)),this,SLOT(handleRangeChanged(QChartAxis*)));
183 QObject::connect(axisY,SIGNAL(ticksChanged(QChartAxis*)),this,SLOT(handleTickChanged(QChartAxis*)));
184 }
185
186 if(!m_axisXInitialized)
187 {
188 emit axisAdded(axisX());
189 QObject::connect(axisX(),SIGNAL(rangeChanged(QChartAxis*)),this,SLOT(handleRangeChanged(QChartAxis*)));
190 QObject::connect(axisX(),SIGNAL(ticksChanged(QChartAxis*)),this,SLOT(handleTickChanged(QChartAxis*)));
191 m_axisXInitialized=true;
192 }
193
88
194 m_domainMap.replace(axisY,domain);
89 int i = axes.indexOf(axis);
195 m_seriesMap.insert(axisY,series);
196 emit seriesAdded(series);
197 setDomain(m_domainIndex,axisY);
198
90
199 }
91 if(i==-1){
92 Domain* domain = m_axisDomainMap.take(axis);
93 emit axisRemoved(axis);
94 delete domain;
95 }
200
96
201 void ChartDataSet::removeSeries(QSeries* series)
97 if(m_seriesAxisMap.values().size()==0)
202 {
98 {
203 QList<QChartAxis*> keys = m_seriesMap.uniqueKeys();
99 m_axisXInitialized=false;
204 foreach(QChartAxis* axis , keys) {
100 emit axisRemoved(axisX());
205 if(m_seriesMap.contains(axis,series)) {
206 emit seriesRemoved(series);
207 m_seriesMap.remove(axis,series);
208 //remove axis if no longer there
209 if(!m_seriesMap.contains(axis)) {
210 emit axisRemoved(axis);
211 m_domainMap.remove(axis);
212 if(axis != m_axisY)
213 delete axis;
214 }
215 series->setParent(0);
216 break;
217 }
218 }
101 }
219 }
102 }
220
103
221 void ChartDataSet::removeAllSeries()
104 void ChartDataSet::removeAllSeries()
222 {
105 {
223 QList<QChartAxis*> keys = m_seriesMap.uniqueKeys();
224 foreach(QChartAxis* axis , keys) {
225 QList<QSeries*> seriesList = m_seriesMap.values(axis);
226 for(int i =0; i < seriesList.size();i++ )
227 {
228 emit seriesRemoved(seriesList.at(i));
229 delete(seriesList.at(i));
230 }
231 m_seriesMap.remove(axis);
232 m_domainMap.remove(axis);
233 emit axisRemoved(axis);
234 if(axis != m_axisY) delete axis;
235 }
236 m_domainIndex=0;
237 }
238
106
239 bool ChartDataSet::nextDomain()
107 QList<QSeries*> series = m_seriesAxisMap.keys();
240 {
241 int limit = (m_domainMap.values().size()/m_domainMap.uniqueKeys().size())-1;
242
108
243 if (m_domainIndex < limit) {
109 foreach(QSeries* s , series) {
244 m_domainIndex++;
110 removeSeries(s);
245 setDomain(m_domainIndex);
246 return true;
247 }
248 else {
249 return false;
250 }
111 }
251 }
252
112
253 bool ChartDataSet::previousDomain()
113 Q_ASSERT(m_seriesAxisMap.count()==0);
254 {
114 Q_ASSERT(m_axisDomainMap.count()==0);
255 if (m_domainIndex > 0) {
115
256 m_domainIndex--;
257 setDomain(m_domainIndex);
258 return true;
259 }
260 else {
261 return false;
262 }
263 }
116 }
264
117
265 void ChartDataSet::setDomain(int index)
118 //to be removed with PIMPL
119 void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) const
266 {
120 {
267 QList<QChartAxis*> domainList = m_domainMap.uniqueKeys();
121 switch(series->type())
268
122 {
269 if(domainList.count()==0) return;
123 case QSeries::SeriesTypeLine: {
270
124
271 Domain domain;
125 QLineSeries* lineSeries = static_cast<QLineSeries*>(series);
272
126
273 foreach (QChartAxis* axis , domainList) {
127 for (int i = 0; i < lineSeries->count(); i++)
274 int i = m_domainMap.count(axis) - index -1;
128 {
275 Q_ASSERT(i>=0);
129 qreal x = lineSeries->x(i);
276 domain = m_domainMap.values(axis).at(i);
130 qreal y = lineSeries->y(i);
277 QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY);
131 domain->setMinX(qMin(domain->minX(),x));
278 QList<QSeries*> seriesList = m_seriesMap.values(axis);
132 domain->setMinY(qMin(domain->minY(),y));
279 foreach(QSeries* series, seriesList) {
133 domain->setMaxX(qMax(domain->maxX(),x));
280 emit seriesDomainChanged(series,domain);
134 domain->setMaxY(qMax(domain->maxY(),y));
135 }
136 break;
281 }
137 }
282 axis->updateRange(domain.m_minY,domain.m_maxY);
138 case QSeries::SeriesTypeArea: {
283 emit axisRangeChanged(axis,labels);
284
139
285 }
140 QAreaSeries* areaSeries = static_cast<QAreaSeries*>(series);
286
141
287 QStringList labels = createLabels(axisX(),domain.m_minX,domain.m_maxX);
142 QLineSeries* upperSeries = areaSeries->upperSeries();
288 axisX()->updateRange(domain.m_minX,domain.m_maxY);
143 QLineSeries* lowerSeries = areaSeries->lowerSeries();
289 emit axisRangeChanged(axisX(),labels);
290 }
291
144
292 void ChartDataSet::setDomain(int index,QChartAxis* axis)
145 for (int i = 0; i < upperSeries->count(); i++)
293 {
146 {
294 int i = m_domainMap.count(axis) - index -1;
147 qreal x = upperSeries->x(i);
295 Q_ASSERT(i>=0);
148 qreal y = upperSeries->y(i);
296 Domain domain = m_domainMap.values(axis).at(i);
149 domain->setMinX(qMin(domain->minX(),x));
297 {
150 domain->setMinY(qMin(domain->minY(),y));
298 QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY);
151 domain->setMaxX(qMax(domain->maxX(),x));
299 QList<QSeries*> seriesList = m_seriesMap.values(axis);
152 domain->setMaxY(qMax(domain->maxY(),y));
300 foreach(QSeries* series, seriesList) {
153 }
301 emit seriesDomainChanged(series,domain);
154 if(lowerSeries) {
155 for (int i = 0; i < lowerSeries->count(); i++)
156 {
157 qreal x = lowerSeries->x(i);
158 qreal y = lowerSeries->y(i);
159 domain->setMinX(qMin(domain->minX(),x));
160 domain->setMinY(qMin(domain->minY(),y));
161 domain->setMaxX(qMax(domain->maxX(),x));
162 domain->setMaxY(qMax(domain->maxY(),y));
163 }}
164 break;
165 }
166 case QSeries::SeriesTypeBar: {
167 qDebug() << "QChartSeries::SeriesTypeBar";
168 QBarSeries* barSeries = static_cast<QBarSeries*>(series);
169 qreal x = barSeries->categoryCount();
170 qreal y = barSeries->max();
171 domain->setMinX(qMin(domain->minX(),x));
172 domain->setMinY(qMin(domain->minY(),y));
173 domain->setMaxX(qMax(domain->maxX(),x));
174 domain->setMaxY(qMax(domain->maxY(),y));
175 break;
176 }
177 case QSeries::SeriesTypeStackedBar: {
178 qDebug() << "QChartSeries::SeriesTypeStackedBar";
179
180 QStackedBarSeries* stackedBarSeries = static_cast<QStackedBarSeries*>(series);
181 qreal x = stackedBarSeries->categoryCount();
182 qreal y = stackedBarSeries->maxCategorySum();
183 domain->setMinX(qMin(domain->minX(),x));
184 domain->setMinY(qMin(domain->minY(),y));
185 domain->setMaxX(qMax(domain->maxX(),x));
186 domain->setMaxY(qMax(domain->maxY(),y));
187 break;
188 }
189 case QSeries::SeriesTypePercentBar: {
190 qDebug() << "QChartSeries::SeriesTypePercentBar";
191
192 QPercentBarSeries* percentBarSeries = static_cast<QPercentBarSeries*>(series);
193 qreal x = percentBarSeries->categoryCount();
194 domain->setMinX(qMin(domain->minX(),x));
195 domain->setMinY(0);
196 domain->setMaxX(qMax(domain->maxX(),x));
197 domain->setMaxY(100);
198 break;
302 }
199 }
303 axis->updateRange(domain.m_minY,domain.m_maxY);
304 emit axisRangeChanged(axis,labels);
305 }
306
200
307 QStringList labels = createLabels(axisX(),domain.m_minX,domain.m_maxX);
201 case QSeries::SeriesTypePie: {
308 axisX()->updateRange(domain.m_minX,domain.m_maxY);
202 QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
309 emit axisRangeChanged(axisX(),labels);
203 // TODO: domain stuff
310 }
204 break;
205 }
311
206
312 void ChartDataSet::clearDomains(int toIndex)
207 case QSeries::SeriesTypeScatter: {
313 {
208 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
314 Q_ASSERT(toIndex>=0);
209 Q_ASSERT(scatterSeries);
210 foreach (QPointF point, scatterSeries->data()) {
211 domain->setMinX(qMin(domain->minX(), point.x()));
212 domain->setMinY(qMax(domain->maxX(), point.x()));
213 domain->setMaxX(qMin(domain->minY(), point.y()));
214 domain->setMaxY(qMax(domain->maxY(), point.y()));
215 }
216 break;
217 }
315
218
316 m_domainIndex = toIndex;
219 case QSeries::SeriesTypeSpline: {
220 QSplineSeries* splineSeries = static_cast<QSplineSeries*>(series);
317
221
318 QList<QChartAxis*> keys = m_domainMap.uniqueKeys();
222 for (int i = 0; i < splineSeries->count(); i++)
223 {
224 qreal x = splineSeries->x(i);
225 qreal y = splineSeries->y(i);
226 domain->setMinX(qMin(domain->minX(),x));
227 domain->setMinY(qMin(domain->minY(),y));
228 domain->setMaxX(qMax(domain->maxX(),x));
229 domain->setMaxY(qMax(domain->maxY(),y));
230 }
231 break;
232 }
319
233
320 foreach (QChartAxis* key , keys)
234 default: {
321 {
235 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
322 QList<Domain> domains = m_domainMap.values(key);
236 return;
323 m_domainMap.remove(key);
237 break;
324 int i = domains.size() - toIndex - 1;
325 while(i--) {
326 domains.removeFirst();
327 }
238 }
328 for(int j=domains.size()-1; j>=0;j--)
239
329 m_domainMap.insert(key,domains.at(j));
330 }
240 }
331 }
241 }
332
242
333 void ChartDataSet::addDomain(const QRectF& rect, const QRectF& viewport)
243 void ChartDataSet::zoomInDomain(const QRectF& rect, const QSizeF& size)
334 {
244 {
335 Q_ASSERT(rect.isValid());
245 QMapIterator<QChartAxis*, Domain*> i( m_axisDomainMap);
336 Q_ASSERT(viewport.isValid());
246 while (i.hasNext()) {
337
247 i.next();
338 clearDomains(m_domainIndex);
248 i.value()->zoomIn(rect,size);
339
340 QList<QChartAxis*> domainList = m_domainMap.uniqueKeys();
341
342 Domain domain;
343
344 foreach (QChartAxis* axis , domainList) {
345 domain = m_domainMap.value(axis).subDomain(rect,viewport.width(),viewport.height());
346 m_domainMap.insert(axis,domain);
347 }
249 }
250 }
348
251
349 setDomain(++m_domainIndex);
252 void ChartDataSet::zoomOutDomain(const QRectF& rect, const QSizeF& size)
253 {
254 QMapIterator<QChartAxis*, Domain*> i( m_axisDomainMap);
255 while (i.hasNext()) {
256 i.next();
257 i.value()->zoomOut(rect,size);
258 }
350 }
259 }
351
260
352 QChartAxis* ChartDataSet::axisY(QSeries* series) const
261 QChartAxis* ChartDataSet::axisY(QSeries* series) const
353 {
262 {
354 if(series == 0) return m_axisY;
263 if(series == 0) return m_axisY;
355
264 return m_seriesAxisMap.value(series);
356 QList<QChartAxis*> keys = m_seriesMap.uniqueKeys();
357
358 foreach(QChartAxis* axis , keys) {
359 if(m_seriesMap.contains(axis,series)) {
360 return axis;
361 }
362 }
363 return 0;
364 }
265 }
365
266
366 QStringList ChartDataSet::createLabels(QChartAxis* axis,qreal min, qreal max)
267 Domain* ChartDataSet::domain(QSeries* series) const
367 {
268 {
368 Q_ASSERT(max>=min);
269 QChartAxis* axis = m_seriesAxisMap.value(series);
369
270 if(axis){
370 QStringList labels;
271 return m_axisDomainMap.value(axis);
371
272 }else
372 int ticks = axis->ticksCount()-1;
273 return 0;
373
374 for(int i=0; i<= ticks; i++) {
375 qreal value = min + (i * (max - min)/ ticks);
376 QString label = axis->axisTickLabel(value);
377 if(label.isEmpty()) {
378 labels << QString::number(value);
379 }
380 else {
381 labels << label;
382 }
383 }
384 return labels;
385 }
274 }
386
275
387 void ChartDataSet::handleRangeChanged(QChartAxis* axis)
276 Domain* ChartDataSet::domain(QChartAxis* axis) const
388 {
277 {
389 qreal min = axis->min();
278 return m_axisDomainMap.value(axis);
390 qreal max = axis->max();
391
392 if(axis==axisX()) {
393
394 m_domainIndex=0;
395
396 clearDomains(m_domainIndex);
397
398 QList<QChartAxis*> domainList = m_domainMap.uniqueKeys();
399
400 foreach (QChartAxis* axis , domainList) {
401
402 Q_ASSERT(m_domainMap.values(axis).size()==1);
403
404 Domain domain = m_domainMap.value(axis);
405 domain.m_minX=min;
406 domain.m_maxX=max;
407 m_domainMap.replace(axis,domain);
408 }
409
410 setDomain(m_domainIndex);
411
412 }
413 else {
414
415 QList<Domain> domains = m_domainMap.values(axis);
416 m_domainMap.remove(axis);
417
418 for(int i=0;i<domains.size();i++)
419 {
420 domains[i].m_minY=min;
421 domains[i].m_maxY=max;
422 }
423
424 for(int j=domains.size()-1; j>=0;j--)
425 m_domainMap.insert(axis,domains.at(j));
426
427 setDomain(m_domainIndex,axis);
428 }
429
430 }
279 }
431
280
432 void ChartDataSet::handleTickChanged(QChartAxis* axis)
281 QChartAxis* ChartDataSet::axis(QSeries* series) const
433 {
282 {
434 if(axis==axisX()) {
283 return m_seriesAxisMap.value(series);
435 Domain domain = m_domainMap.value(axisY());
436 QStringList labels = createLabels(axis,domain.m_minX,domain.m_maxX);
437 emit axisRangeChanged(axis,labels);
438 }
439 else {
440 Domain domain = m_domainMap.value(axis);
441 QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY);
442 emit axisRangeChanged(axis,labels);
443 }
444 }
284 }
445
285
446 #include "moc_chartdataset_p.cpp"
286 #include "moc_chartdataset_p.cpp"
447
287
448 QTCOMMERCIALCHART_END_NAMESPACE
288 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,60 +1,55
1 #ifndef CHARTDATASET_P_H_
1 #ifndef CHARTDATASET_P_H_
2 #define CHARTDATASET_P_H_
2 #define CHARTDATASET_P_H_
3
3
4 #include "qseries.h"
4 #include "qseries.h"
5 #include "domain_p.h"
5 #include "domain_p.h"
6 #include <QVector>
6 #include <QVector>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 class QChartAxis;
10 class QChartAxis;
11
11
12 class ChartDataSet : public QObject
12 class ChartDataSet : public QObject
13 {
13 {
14 Q_OBJECT
14 Q_OBJECT
15 public:
15 public:
16 ChartDataSet(QObject* parent=0);
16 ChartDataSet(QObject* parent=0);
17 virtual ~ChartDataSet();
17 virtual ~ChartDataSet();
18
18
19 void addSeries(QSeries* series,QChartAxis *axisY = 0);
19 void addSeries(QSeries* series,QChartAxis *axisY = 0);
20 void removeSeries(QSeries* series);
20 void removeSeries(QSeries* series);
21 void removeAllSeries();
21 void removeAllSeries();
22 void addDomain(const QRectF& rect, const QRectF& viewport);
22
23 bool nextDomain();
23 void zoomInDomain(const QRectF& rect, const QSizeF& size);
24 bool previousDomain();
24 void zoomOutDomain(const QRectF& rect, const QSizeF& size);
25 void clearDomains(int toIndex =0);
25
26 const Domain domain(QChartAxis *axisY) const;
26 Domain* domain(QSeries* series) const;
27 int domainIndex() const {return m_domainIndex;}
27 Domain* domain(QChartAxis* axis) const;
28 void setDomain(int index);
28 QChartAxis* axis(QSeries* series) const;
29 void setDomain(int index,QChartAxis* axis);
30
29
31 QChartAxis* axisX() const { return m_axisX;};
30 QChartAxis* axisX() const { return m_axisX;};
32 QChartAxis* axisY(QSeries* series = 0) const;
31 QChartAxis* axisY(QSeries* series = 0) const;
33
32
34 signals:
33 signals:
35 void seriesAdded(QSeries* series);
34 void seriesAdded(QSeries* series,Domain* domain);
36 void seriesRemoved(QSeries* series);
35 void seriesRemoved(QSeries* series);
37 void axisAdded(QChartAxis* axis);
36 void axisAdded(QChartAxis* axis,Domain* domain);
38 void axisRemoved(QChartAxis* axis);
37 void axisRemoved(QChartAxis* axis);
39 void axisRangeChanged(QChartAxis* axis, const QStringList& labels);
40 void seriesDomainChanged(QSeries* series,const Domain& domain);
41
42 private slots:
43 void handleRangeChanged(QChartAxis*);
44 void handleTickChanged(QChartAxis*);
45
38
46 private:
39 private:
47 QStringList createLabels(QChartAxis* axis,qreal min, qreal max);
40 QStringList createLabels(QChartAxis* axis,qreal min, qreal max);
41 void calculateDomain(QSeries* series,Domain* domain) const;
48
42
49 private:
43 private:
50 QMultiMap<QChartAxis*, Domain> m_domainMap;
44 QMap<QSeries*, QChartAxis*> m_seriesAxisMap;
51 QMultiMap<QChartAxis*, QSeries*> m_seriesMap;
45 QMap<QChartAxis*, Domain*> m_axisDomainMap;
52 QChartAxis* m_axisX;
46 QChartAxis* m_axisX;
53 QChartAxis* m_axisY;
47 QChartAxis* m_axisY;
48
54 int m_domainIndex;
49 int m_domainIndex;
55 bool m_axisXInitialized;
50 bool m_axisXInitialized;
56 };
51 };
57
52
58 QTCOMMERCIALCHART_END_NAMESPACE
53 QTCOMMERCIALCHART_END_NAMESPACE
59
54
60 #endif /* CHARTENGINE_P_H_ */
55 #endif /* CHARTENGINE_P_H_ */
@@ -1,311 +1,364
1 #include "qchart.h"
1 #include "qchart.h"
2 #include "qchartaxis.h"
2 #include "qchartaxis.h"
3 #include "chartpresenter_p.h"
3 #include "chartpresenter_p.h"
4 #include "chartdataset_p.h"
4 #include "chartdataset_p.h"
5 #include "charttheme_p.h"
5 #include "charttheme_p.h"
6 //series
6 //series
7 #include "qbarseries.h"
7 #include "qbarseries.h"
8 #include "qstackedbarseries.h"
8 #include "qstackedbarseries.h"
9 #include "qpercentbarseries.h"
9 #include "qpercentbarseries.h"
10 #include "qlineseries.h"
10 #include "qlineseries.h"
11 #include "qareaseries.h"
11 #include "qareaseries.h"
12 #include "qpieseries.h"
12 #include "qpieseries.h"
13 #include "qscatterseries.h"
13 #include "qscatterseries.h"
14 #include "qsplineseries.h"
14 #include "qsplineseries.h"
15 //items
15 //items
16 #include "axisitem_p.h"
16 #include "axisitem_p.h"
17 #include "axisanimationitem_p.h"
17 #include "axisanimationitem_p.h"
18 #include "areachartitem_p.h"
18 #include "areachartitem_p.h"
19 #include "barpresenter_p.h"
19 #include "barpresenter_p.h"
20 #include "stackedbarpresenter_p.h"
20 #include "stackedbarpresenter_p.h"
21 #include "percentbarpresenter_p.h"
21 #include "percentbarpresenter_p.h"
22 #include "linechartitem_p.h"
22 #include "linechartitem_p.h"
23 #include "linechartanimationitem_p.h"
23 #include "linechartanimationitem_p.h"
24 #include "piepresenter_p.h"
24 #include "piepresenter_p.h"
25 #include "scatterpresenter_p.h"
25 #include "scatterpresenter_p.h"
26 #include "splinepresenter_p.h"
26 #include "splinepresenter_p.h"
27
27
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29
29
30 ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(chart),
30 ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(chart),
31 m_chart(chart),
31 m_chart(chart),
32 m_dataset(dataset),
32 m_dataset(dataset),
33 m_chartTheme(0),
33 m_chartTheme(0),
34 m_zoomIndex(0),
34 m_marginSize(0),
35 m_marginSize(0),
35 m_rect(QRectF(QPoint(0,0),m_chart->size())),
36 m_rect(QRectF(QPoint(0,0),m_chart->size())),
36 m_options(0)
37 m_options(QChart::NoAnimation)
37 {
38 {
38 createConnections();
39 createConnections();
39 setChartTheme(QChart::ChartThemeDefault);
40 setChartTheme(QChart::ChartThemeDefault);
40
41 }
41 }
42
42
43 ChartPresenter::~ChartPresenter()
43 ChartPresenter::~ChartPresenter()
44 {
44 {
45 }
45 }
46
46
47 void ChartPresenter::createConnections()
47 void ChartPresenter::createConnections()
48 {
48 {
49 QObject::connect(m_chart,SIGNAL(geometryChanged()),this,SLOT(handleGeometryChanged()));
49 QObject::connect(m_chart,SIGNAL(geometryChanged()),this,SLOT(handleGeometryChanged()));
50 QObject::connect(m_dataset,SIGNAL(seriesAdded(QSeries*)),this,SLOT(handleSeriesAdded(QSeries*)));
50 QObject::connect(m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),this,SLOT(handleSeriesAdded(QSeries*,Domain*)));
51 QObject::connect(m_dataset,SIGNAL(seriesRemoved(QSeries*)),this,SLOT(handleSeriesRemoved(QSeries*)));
51 QObject::connect(m_dataset,SIGNAL(seriesRemoved(QSeries*)),this,SLOT(handleSeriesRemoved(QSeries*)));
52 QObject::connect(m_dataset,SIGNAL(axisAdded(QChartAxis*)),this,SLOT(handleAxisAdded(QChartAxis*)));
52 QObject::connect(m_dataset,SIGNAL(axisAdded(QChartAxis*,Domain*)),this,SLOT(handleAxisAdded(QChartAxis*,Domain*)));
53 QObject::connect(m_dataset,SIGNAL(axisRemoved(QChartAxis*)),this,SLOT(handleAxisRemoved(QChartAxis*)));
53 QObject::connect(m_dataset,SIGNAL(axisRemoved(QChartAxis*)),this,SLOT(handleAxisRemoved(QChartAxis*)));
54 QObject::connect(m_dataset,SIGNAL(seriesDomainChanged(QSeries*,const Domain&)),this,SLOT(handleSeriesDomainChanged(QSeries*,const Domain&)));
55 QObject::connect(m_dataset,SIGNAL(axisRangeChanged(QChartAxis*,const QStringList&)),this,SLOT(handleAxisRangeChanged(QChartAxis*,const QStringList&)));
56 }
54 }
57
55
58
56
59 QRectF ChartPresenter::geometry() const
57 QRectF ChartPresenter::geometry() const
60 {
58 {
61 return m_rect;
59 return m_rect;
62 }
60 }
63
61
64 void ChartPresenter::handleGeometryChanged()
62 void ChartPresenter::handleGeometryChanged()
65 {
63 {
66 m_rect = QRectF(QPoint(0,0),m_chart->size());
64 QRectF rect(QPoint(0,0),m_chart->size());
67 m_rect.adjust(m_marginSize,m_marginSize, -m_marginSize, -m_marginSize);
65 rect.adjust(m_marginSize,m_marginSize, -m_marginSize, -m_marginSize);
66
67 //rewrite zoom stack
68 for(int i=0;i<m_zoomStack.count();i++){
69 QRectF r = m_zoomStack[i];
70 qreal w = rect.width()/m_rect.width();
71 qreal h = rect.height()/m_rect.height();
72 QPointF tl = r.topLeft();
73 tl.setX(tl.x()*w);
74 tl.setY(tl.y()*h);
75 QPointF br = r.bottomRight();
76 br.setX(br.x()*w);
77 br.setY(br.y()*h);
78 r.setTopLeft(tl);
79 r.setBottomRight(br);
80 m_zoomStack[i]=r;
81 }
82
83 m_rect = rect;
68 Q_ASSERT(m_rect.isValid());
84 Q_ASSERT(m_rect.isValid());
69 emit geometryChanged(m_rect);
85 emit geometryChanged(m_rect);
70 }
86 }
71
87
72 int ChartPresenter::margin() const
88 int ChartPresenter::margin() const
73 {
89 {
74 return m_marginSize;
90 return m_marginSize;
75 }
91 }
76
92
77 void ChartPresenter::setMargin(int margin)
93 void ChartPresenter::setMargin(int margin)
78 {
94 {
79 m_marginSize = margin;
95 m_marginSize = margin;
80 }
96 }
81
97
82 void ChartPresenter::handleAxisAdded(QChartAxis* axis)
98 void ChartPresenter::handleAxisAdded(QChartAxis* axis,Domain* domain)
83 {
99 {
84
100
85 AxisItem* item ;
101 AxisItem* item ;
86
102
87 if(!m_options.testFlag(QChart::GridAxisAnimations))
103 if(!m_options.testFlag(QChart::GridAxisAnimations))
88 {
104 {
89 item = new AxisItem(axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart);
105 item = new AxisItem(axis,axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart);
90 }else{
106 }else{
91 item = new AxisAnimationItem(axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart);
107 item = new AxisAnimationItem(axis,axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart);
108 }
109 if(axis==m_dataset->axisX()){
110 QObject::connect(domain,SIGNAL(rangeXChanged(qreal,qreal)),item,SLOT(handleRangeChanged(qreal,qreal)));
111 //initialize
112 item->handleRangeChanged(domain->minX(),domain->maxX());
113 }
114 else{
115 QObject::connect(domain,SIGNAL(rangeYChanged(qreal,qreal)),item,SLOT(handleRangeChanged(qreal,qreal)));
116 //initialize
117 item->handleRangeChanged(domain->minY(),domain->maxY());
92 }
118 }
93
119
94 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
120 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
95 QObject::connect(axis,SIGNAL(update(QChartAxis*)),item,SLOT(handleAxisUpdate(QChartAxis*)));
121 //initialize
96
97 item->handleAxisUpdate(axis);
98 item->handleGeometryChanged(m_rect);
122 item->handleGeometryChanged(m_rect);
99 m_chartTheme->decorate(axis,item);
123 m_chartTheme->decorate(axis,item);
100 m_axisItems.insert(axis,item);
124 m_axisItems.insert(axis,item);
101 }
125 }
102
126
103 void ChartPresenter::handleAxisRemoved(QChartAxis* axis)
127 void ChartPresenter::handleAxisRemoved(QChartAxis* axis)
104 {
128 {
105 AxisItem* item = m_axisItems.take(axis);
129 AxisItem* item = m_axisItems.take(axis);
106 Q_ASSERT(item);
130 Q_ASSERT(item);
107 delete item;
131 delete item;
108 }
132 }
109
133
110
134
111 void ChartPresenter::handleSeriesAdded(QSeries* series)
135 void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain)
112 {
136 {
113 switch(series->type())
137 switch(series->type())
114 {
138 {
115 case QSeries::SeriesTypeLine: {
139 case QSeries::SeriesTypeLine: {
116
140
117 QLineSeries* lineSeries = static_cast<QLineSeries*>(series);
141 QLineSeries* lineSeries = static_cast<QLineSeries*>(series);
118 LineChartItem* item;
142 LineChartItem* item;
119 if(m_options.testFlag(QChart::SeriesAnimations)){
143 if(m_options.testFlag(QChart::SeriesAnimations)){
120 item = new LineChartAnimationItem(this,lineSeries,m_chart);
144 item = new LineChartAnimationItem(lineSeries,m_chart);
121 }else{
145 }else{
122 item = new LineChartItem(this,lineSeries,m_chart);
146 item = new LineChartItem(lineSeries,m_chart);
123 }
147 }
148 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
149 QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),item,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal)));
150 //initialize
151 item->handleDomainChanged(domain->minX(),domain->maxX(),domain->minY(),domain->maxY());
152 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
153 //decorate
124 m_chartTheme->decorate(item,lineSeries,m_chartItems.count());
154 m_chartTheme->decorate(item,lineSeries,m_chartItems.count());
125 m_chartItems.insert(series,item);
155 m_chartItems.insert(series,item);
126 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
127 break;
156 break;
128 }
157 }
129
158
130 case QSeries::SeriesTypeArea: {
159 case QSeries::SeriesTypeArea: {
131
160
132 QAreaSeries* areaSeries = static_cast<QAreaSeries*>(series);
161 QAreaSeries* areaSeries = static_cast<QAreaSeries*>(series);
133 AreaChartItem* item;
162 AreaChartItem* item;
134 if(m_options.testFlag(QChart::SeriesAnimations)) {
163 if(m_options.testFlag(QChart::SeriesAnimations)) {
135 item = new AreaChartItem(this,areaSeries,m_chart);
164 item = new AreaChartItem(areaSeries,m_chart);
136 }
165 }
137 else {
166 else {
138 item = new AreaChartItem(this,areaSeries,m_chart);
167 item = new AreaChartItem(areaSeries,m_chart);
139 }
168 }
169 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
170 QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),item,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal)));
171 //initialize
172 item->handleDomainChanged(domain->minX(),domain->maxX(),domain->minY(),domain->maxY());
173 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
174 //decorate
140 m_chartTheme->decorate(item,areaSeries,m_chartItems.count());
175 m_chartTheme->decorate(item,areaSeries,m_chartItems.count());
141 m_chartItems.insert(series,item);
176 m_chartItems.insert(series,item);
142 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
143 break;
177 break;
144 }
178 }
145
179
146 case QSeries::SeriesTypeBar: {
180 case QSeries::SeriesTypeBar: {
147 QBarSeries* barSeries = static_cast<QBarSeries*>(series);
181 QBarSeries* barSeries = static_cast<QBarSeries*>(series);
148 BarPresenter* item = new BarPresenter(barSeries,m_chart);
182 BarPresenter* item = new BarPresenter(barSeries,m_chart);
149 m_chartTheme->decorate(item,barSeries,m_chartItems.count());
183 m_chartTheme->decorate(item,barSeries,m_chartItems.count());
150 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
184 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
151 // QObject::connect(barSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
185 // QObject::connect(barSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
152 m_chartItems.insert(series,item);
186 m_chartItems.insert(series,item);
153 // m_axisXItem->setVisible(false);
187 // m_axisXItem->setVisible(false);
154 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
188 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
155 break;
189 break;
156 }
190 }
157
191
158 case QSeries::SeriesTypeStackedBar: {
192 case QSeries::SeriesTypeStackedBar: {
159
193
160 QStackedBarSeries* stackedBarSeries = static_cast<QStackedBarSeries*>(series);
194 QStackedBarSeries* stackedBarSeries = static_cast<QStackedBarSeries*>(series);
161 StackedBarPresenter* item = new StackedBarPresenter(stackedBarSeries,m_chart);
195 StackedBarPresenter* item = new StackedBarPresenter(stackedBarSeries,m_chart);
162 m_chartTheme->decorate(item,stackedBarSeries,m_chartItems.count());
196 m_chartTheme->decorate(item,stackedBarSeries,m_chartItems.count());
163 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
197 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
164 // QObject::connect(stackedBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
198 // QObject::connect(stackedBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
165 m_chartItems.insert(series,item);
199 m_chartItems.insert(series,item);
166 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
200 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
167 break;
201 break;
168 }
202 }
169
203
170 case QSeries::SeriesTypePercentBar: {
204 case QSeries::SeriesTypePercentBar: {
171
205
172 QPercentBarSeries* percentBarSeries = static_cast<QPercentBarSeries*>(series);
206 QPercentBarSeries* percentBarSeries = static_cast<QPercentBarSeries*>(series);
173 PercentBarPresenter* item = new PercentBarPresenter(percentBarSeries,m_chart);
207 PercentBarPresenter* item = new PercentBarPresenter(percentBarSeries,m_chart);
174 m_chartTheme->decorate(item,percentBarSeries ,m_chartItems.count());
208 m_chartTheme->decorate(item,percentBarSeries ,m_chartItems.count());
175 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
209 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
176 // QObject::connect(percentBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
210 // QObject::connect(percentBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
177 m_chartItems.insert(series,item);
211 m_chartItems.insert(series,item);
178 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
212 if(m_rect.isValid()) item->handleGeometryChanged(m_rect);
179 break;
213 break;
180 }
214 }
181 case QSeries::SeriesTypeScatter: {
215 case QSeries::SeriesTypeScatter: {
182 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
216 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
183 ScatterPresenter *scatterPresenter = new ScatterPresenter(scatterSeries, m_chart);
217 ScatterPresenter *scatterPresenter = new ScatterPresenter(scatterSeries, m_chart);
184 QObject::connect(scatterPresenter, SIGNAL(clicked(QPointF)),
218 QObject::connect(scatterPresenter, SIGNAL(clicked(QPointF)),
185 scatterSeries, SIGNAL(clicked(QPointF)));
219 scatterSeries, SIGNAL(clicked(QPointF)));
186 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)),
220 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)),
187 scatterPresenter, SLOT(handleGeometryChanged(const QRectF&)));
221 scatterPresenter, SLOT(handleGeometryChanged(const QRectF&)));
188 m_chartTheme->decorate(scatterPresenter, scatterSeries, m_chartItems.count());
222 m_chartTheme->decorate(scatterPresenter, scatterSeries, m_chartItems.count());
189 m_chartItems.insert(scatterSeries, scatterPresenter);
223 m_chartItems.insert(scatterSeries, scatterPresenter);
190 if(m_rect.isValid()) scatterPresenter->handleGeometryChanged(m_rect);
224 if(m_rect.isValid()) scatterPresenter->handleGeometryChanged(m_rect);
191 break;
225 break;
192 }
226 }
193 case QSeries::SeriesTypePie: {
227 case QSeries::SeriesTypePie: {
194 QPieSeries *s = qobject_cast<QPieSeries *>(series);
228 QPieSeries *s = qobject_cast<QPieSeries *>(series);
195 PiePresenter* pie = new PiePresenter(m_chart, s);
229 PiePresenter* pie = new PiePresenter(m_chart, s);
196 m_chartTheme->decorate(pie, s, m_chartItems.count());
230 m_chartTheme->decorate(pie, s, m_chartItems.count());
197 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), pie, SLOT(handleGeometryChanged(const QRectF&)));
231 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), pie, SLOT(handleGeometryChanged(const QRectF&)));
198
232
199 // Hide all from background when there is only piechart
233 // Hide all from background when there is only piechart
200 // TODO: refactor this ugly code... should be one setting for this
234 // TODO: refactor this ugly code... should be one setting for this
201 if (m_chartItems.count() == 0) {
235 if (m_chartItems.count() == 0) {
202 m_chart->axisX()->setAxisVisible(false);
236 m_chart->axisX()->setAxisVisible(false);
203 m_chart->axisY()->setAxisVisible(false);
237 m_chart->axisY()->setAxisVisible(false);
204 m_chart->axisX()->setGridVisible(false);
238 m_chart->axisX()->setGridVisible(false);
205 m_chart->axisY()->setGridVisible(false);
239 m_chart->axisY()->setGridVisible(false);
206 m_chart->axisX()->setLabelsVisible(false);
240 m_chart->axisX()->setLabelsVisible(false);
207 m_chart->axisY()->setLabelsVisible(false);
241 m_chart->axisY()->setLabelsVisible(false);
208 m_chart->axisX()->setShadesVisible(false);
242 m_chart->axisX()->setShadesVisible(false);
209 m_chart->axisY()->setShadesVisible(false);
243 m_chart->axisY()->setShadesVisible(false);
210 m_chart->setChartBackgroundBrush(Qt::transparent);
244 m_chart->setChartBackgroundBrush(Qt::transparent);
211 }
245 }
212
246
213 m_chartItems.insert(series, pie);
247 m_chartItems.insert(series, pie);
214 pie->handleGeometryChanged(m_rect);
248 pie->handleGeometryChanged(m_rect);
215 break;
249 break;
216 }
250 }
217
251
218 case QSeries::SeriesTypeSpline: {
252 case QSeries::SeriesTypeSpline: {
219 QSplineSeries* splineSeries = qobject_cast<QSplineSeries*>(series);
253 QSplineSeries* splineSeries = qobject_cast<QSplineSeries*>(series);
220 SplinePresenter* splinePresenter = new SplinePresenter(splineSeries, m_chart);
254 SplinePresenter* splinePresenter = new SplinePresenter(splineSeries, m_chart);
221 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), splinePresenter, SLOT(handleGeometryChanged(const QRectF&)));
255 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), splinePresenter, SLOT(handleGeometryChanged(const QRectF&)));
222 m_chartTheme->decorate(splinePresenter, splineSeries, m_chartItems.count());
256 m_chartTheme->decorate(splinePresenter, splineSeries, m_chartItems.count());
223 m_chartItems.insert(splineSeries, splinePresenter);
257 m_chartItems.insert(splineSeries, splinePresenter);
224 break;
258 break;
225 }
259 }
226 default: {
260 default: {
227 qDebug()<< "Series type" << series->type() << "not implemented.";
261 qDebug()<< "Series type" << series->type() << "not implemented.";
228 break;
262 break;
229 }
263 }
230 }
264 }
265
266 zoomReset();
231 }
267 }
232
268
233 void ChartPresenter::handleSeriesRemoved(QSeries* series)
269 void ChartPresenter::handleSeriesRemoved(QSeries* series)
234 {
270 {
235 ChartItem* item = m_chartItems.take(series);
271 ChartItem* item = m_chartItems.take(series);
236 delete item;
272 delete item;
237 }
273 }
238
274
239 void ChartPresenter::handleSeriesDomainChanged(QSeries* series, const Domain& domain)
240 {
241 m_chartItems.value(series)->handleDomainChanged(domain);
242 }
243
244 void ChartPresenter::handleAxisRangeChanged(QChartAxis* axis,const QStringList& labels)
245 {
246 m_axisItems.value(axis)->handleRangeChanged(axis,labels);
247 }
248
249 void ChartPresenter::setChartTheme(QChart::ChartTheme theme)
275 void ChartPresenter::setChartTheme(QChart::ChartTheme theme)
250 {
276 {
251 delete m_chartTheme;
277 delete m_chartTheme;
252
278
253 m_chartTheme = ChartTheme::createTheme(theme);
279 m_chartTheme = ChartTheme::createTheme(theme);
254
280
255 m_chartTheme->decorate(m_chart);
281 m_chartTheme->decorate(m_chart);
256 QMapIterator<QSeries*,ChartItem*> i(m_chartItems);
282 QMapIterator<QSeries*,ChartItem*> i(m_chartItems);
257
283
258 int index=0;
284 int index=0;
259 while (i.hasNext()) {
285 while (i.hasNext()) {
260 i.next();
286 i.next();
261 m_chartTheme->decorate(i.value(),i.key(),index);
287 m_chartTheme->decorate(i.value(),i.key(),index);
262 index++;
288 index++;
263 }
289 }
264
290
265 QMapIterator<QChartAxis*,AxisItem*> j(m_axisItems);
291 QMapIterator<QChartAxis*,AxisItem*> j(m_axisItems);
266 while (j.hasNext()) {
292 while (j.hasNext()) {
267 j.next();
293 j.next();
268 m_chartTheme->decorate(j.key(),j.value());
294 m_chartTheme->decorate(j.key(),j.value());
269 }
295 }
270 }
296 }
271
297
272 QChart::ChartTheme ChartPresenter::chartTheme()
298 QChart::ChartTheme ChartPresenter::chartTheme()
273 {
299 {
274 return m_chartTheme->id();
300 return m_chartTheme->id();
275 }
301 }
276
302
277 void ChartPresenter::setAnimationOptions(QChart::AnimationOptions options)
303 void ChartPresenter::setAnimationOptions(QChart::AnimationOptions options)
278 {
304 {
279 if(m_options!=options) {
305 if(m_options!=options) {
280
306
281 m_options=options;
307 m_options=options;
282
308
283 //recreate elements
309 //recreate elements
284
285 QList<QChartAxis*> axisList = m_axisItems.uniqueKeys();
310 QList<QChartAxis*> axisList = m_axisItems.uniqueKeys();
286 QList<QSeries*> seriesList = m_chartItems.uniqueKeys();
311 QList<QSeries*> seriesList = m_chartItems.uniqueKeys();
287
312
288 foreach(QChartAxis* axis, axisList) {
313 foreach(QChartAxis* axis, axisList) {
289 handleAxisRemoved(axis);
314 handleAxisRemoved(axis);
290 handleAxisAdded(axis);
315 handleAxisAdded(axis,m_dataset->domain(axis));
291 }
316 }
292 foreach(QSeries* series, seriesList) {
317 foreach(QSeries* series, seriesList) {
293 handleSeriesRemoved(series);
318 handleSeriesRemoved(series);
294 handleSeriesAdded(series);
319 handleSeriesAdded(series,m_dataset->domain(series));
295 }
320 }
296
297 //now reintialize view data
298 //TODO: make it more nice
299 m_dataset->setDomain(m_dataset->domainIndex());
300 }
321 }
301 }
322 }
302
323
324 void ChartPresenter::zoomIn()
325 {
326 QRectF rect = geometry();
327 rect.setWidth(rect.width()/2);
328 rect.setHeight(rect.height()/2);
329 rect.moveCenter(geometry().center());
330 zoomIn(rect);
331 }
332
333 void ChartPresenter::zoomIn(const QRectF& rect)
334 {
335 QRectF r = rect.normalized();
336 r.translate(-m_marginSize, -m_marginSize);
337 m_dataset->zoomInDomain(r,geometry().size());
338 m_zoomStack<<r;
339 m_zoomIndex++;
340 }
341
342 void ChartPresenter::zoomOut()
343 {
344 if(m_zoomIndex==0) return;
345 m_dataset->zoomOutDomain(m_zoomStack[m_zoomIndex-1],geometry().size());
346 m_zoomIndex--;
347 m_zoomStack.resize(m_zoomIndex);
348 }
349
350 void ChartPresenter::zoomReset()
351 {
352 m_zoomIndex=0;
353 m_zoomStack.resize(m_zoomIndex);
354 }
355
303 QChart::AnimationOptions ChartPresenter::animationOptions() const
356 QChart::AnimationOptions ChartPresenter::animationOptions() const
304 {
357 {
305 return m_options;
358 return m_options;
306 }
359 }
307
360
308
361
309 #include "moc_chartpresenter_p.cpp"
362 #include "moc_chartpresenter_p.cpp"
310
363
311 QTCOMMERCIALCHART_END_NAMESPACE
364 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,73 +1,81
1 #ifndef CHARTPRESENTER_H_
1 #ifndef CHARTPRESENTER_H_
2 #define CHARTPRESENTER_H_
2 #define CHARTPRESENTER_H_
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "qchart.h" //becouse of QChart::ChartThemeId //TODO
5 #include "qchart.h" //becouse of QChart::ChartThemeId //TODO
6 #include "qchartaxis.h"
6 #include "qchartaxis.h"
7 #include <QRectF>
7 #include <QRectF>
8
8
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10
10
11 class ChartItem;
11 class ChartItem;
12 class QSeries;
12 class QSeries;
13 class ChartDataSet;
13 class ChartDataSet;
14 //class QChart;
14 //class QChart;
15 class Domain;
15 class Domain;
16 class AxisItem;
16 class AxisItem;
17 class ChartTheme;
17 class ChartTheme;
18
18
19 class ChartPresenter: public QObject
19 class ChartPresenter: public QObject
20 {
20 {
21 Q_OBJECT
21 Q_OBJECT
22 public:
22 public:
23 enum ZValues {
23 enum ZValues {
24 BackgroundZValue = -1,
24 BackgroundZValue = -1,
25 ShadesZValue,
25 ShadesZValue,
26 GridZValue,
26 GridZValue,
27 AxisZValue,
27 AxisZValue,
28 LineChartZValue,
28 LineChartZValue,
29 ScatterSeriesZValue
29 ScatterSeriesZValue
30 };
30 };
31
31
32 ChartPresenter(QChart* chart,ChartDataSet *dataset);
32 ChartPresenter(QChart* chart,ChartDataSet *dataset);
33 virtual ~ChartPresenter();
33 virtual ~ChartPresenter();
34
34
35 void setMargin(int margin);
35 void setMargin(int margin);
36 int margin() const;
36 int margin() const;
37
37
38 QRectF geometry() const;
38 QRectF geometry() const;
39
39
40 void setChartTheme(QChart::ChartTheme theme);
40 void setChartTheme(QChart::ChartTheme theme);
41 QChart::ChartTheme chartTheme();
41 QChart::ChartTheme chartTheme();
42
42
43 void setAnimationOptions(QChart::AnimationOptions options);
43 void setAnimationOptions(QChart::AnimationOptions options);
44 QChart::AnimationOptions animationOptions() const;
44 QChart::AnimationOptions animationOptions() const;
45
45
46 void zoomIn();
47 void zoomIn(const QRectF& rect);
48 void zoomOut();
49 void zoomReset();
50
51
46 private:
52 private:
47 void createConnections();
53 void createConnections();
48
54
49 public slots:
55 public slots:
50 void handleSeriesAdded(QSeries* series);
56 void handleSeriesAdded(QSeries* series,Domain* domain);
51 void handleSeriesRemoved(QSeries* series);
57 void handleSeriesRemoved(QSeries* series);
52 void handleAxisAdded(QChartAxis* axis);
58 void handleAxisAdded(QChartAxis* axis,Domain* domain);
53 void handleAxisRemoved(QChartAxis* axis);
59 void handleAxisRemoved(QChartAxis* axis);
54 void handleSeriesDomainChanged(QSeries* series, const Domain& domain);
55 void handleAxisRangeChanged(QChartAxis* axis, const QStringList& labels);
56 void handleGeometryChanged();
60 void handleGeometryChanged();
61
57 signals:
62 signals:
58 void geometryChanged(const QRectF& rect);
63 void geometryChanged(const QRectF& rect);
64
59 private:
65 private:
60 QMap<QSeries*,ChartItem*> m_chartItems;
61 QMap<QChartAxis*,AxisItem*> m_axisItems;
62 QChart* m_chart;
66 QChart* m_chart;
63 ChartDataSet* m_dataset;
67 ChartDataSet* m_dataset;
64 ChartTheme *m_chartTheme;
68 ChartTheme *m_chartTheme;
69 int m_zoomIndex;
65 int m_marginSize;
70 int m_marginSize;
71 QMap<QSeries*,ChartItem*> m_chartItems;
72 QMap<QChartAxis*,AxisItem*> m_axisItems;
73 QVector<QRectF> m_zoomStack;
66 QRectF m_rect;
74 QRectF m_rect;
67 QChart::AnimationOptions m_options;
75 QChart::AnimationOptions m_options;
68
76
69 };
77 };
70
78
71 QTCOMMERCIALCHART_END_NAMESPACE
79 QTCOMMERCIALCHART_END_NAMESPACE
72
80
73 #endif /* CHARTPRESENTER_H_ */
81 #endif /* CHARTPRESENTER_H_ */
@@ -1,69 +1,148
1 #include "domain_p.h"
1 #include "domain_p.h"
2
2
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
4
4
5 Domain::Domain(qreal minX, qreal maxX, qreal minY, qreal maxY):
5 Domain::Domain(QObject* parent):QObject(parent),
6 m_minX(minX),
6 m_minX(0),
7 m_maxX(maxX),
7 m_maxX(0),
8 m_minY(minY),
8 m_minY(0),
9 m_maxY(maxY)
9 m_maxY(0)
10 {
10 {
11 }
11 }
12
12
13 Domain::~Domain()
13 Domain::~Domain()
14 {
14 {
15 }
15 }
16
16
17 void Domain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
18 {
19 bool changed = false;
20
21 if(m_minX!=minX || m_maxX!=maxX)
22 {
23 m_minX=minX;
24 m_maxX=maxX;
25 changed=true;
26 emit rangeXChanged(minX,maxX);
27 }
28
29 if(m_minY!=minY || m_maxY!=maxY){
30 m_minY=minY;
31 m_maxY=maxY;
32 changed=true;
33 emit rangeYChanged(minY,maxY);
34 }
35
36 if(changed){
37 emit domainChanged(m_minX, m_maxX, m_minY, m_maxY);
38 }
39 }
40 void Domain::setRangeX(qreal min, qreal max)
41 {
42 setRange(min,max,m_minY, m_maxY);
43 }
44 void Domain::setRangeY(qreal min, qreal max)
45 {
46 setRange(m_minX, m_maxX, min, max);
47 }
48
49 void Domain::setMinX(qreal min)
50 {
51 setRange(min, m_maxX, m_minY, m_maxY);
52 }
53
54 void Domain::setMaxX(qreal max)
55 {
56 setRange(m_minX, max, m_minY, m_maxY);
57 }
58
59 void Domain::setMinY(qreal min)
60 {
61 setRange(m_minX, m_maxX, min, m_maxY);
62 }
63
64 void Domain::setMaxY(qreal max)
65 {
66 setRange(m_minX, m_maxX, m_minY, max);
67
68 }
69
17 qreal Domain::spanX() const
70 qreal Domain::spanX() const
18 {
71 {
19 Q_ASSERT(m_maxX >= m_minX);
72 Q_ASSERT(m_maxX >= m_minX);
20 return m_maxX - m_minX;
73 return m_maxX - m_minX;
21 }
74 }
22
75
23 qreal Domain::spanY() const
76 qreal Domain::spanY() const
24 {
77 {
25 Q_ASSERT(m_maxY >= m_minY);
78 Q_ASSERT(m_maxY >= m_minY);
26 return m_maxY - m_minY;
79 return m_maxY - m_minY;
27 }
80 }
28
81
29 bool Domain::isEmpty() const
82 bool Domain::isEmpty() const
30 {
83 {
31 return spanX()==0 || spanY()==0;
84 return spanX()==0 || spanY()==0;
32 }
85 }
33
86
34 Domain Domain::subDomain(const QRectF& rect, qreal maxWidth,qreal maxHeight) const
87 void Domain::zoomIn(const QRectF& rect, const QSizeF& size)
35 {
88 {
36 Domain domain;
89 qreal dx = spanX() / size.width();
90 qreal dy = spanY() / size.height();
37
91
38 qreal dx = spanX() / maxWidth;
92 m_maxX = m_minX + dx * rect.right();
39 qreal dy = spanY() / maxHeight;
93 m_minX = m_minX + dx * rect.left();
94 m_minY = m_maxY - dy * rect.bottom();
95 m_maxY = m_maxY - dy * rect.top();
96
97 emit domainChanged(m_minX, m_maxX, m_minY, m_maxY);
98 emit rangeXChanged(m_minX, m_maxX);
99 emit rangeYChanged(m_minY, m_maxY);
100 }
101
102 void Domain::zoomOut(const QRectF& rect, const QSizeF& size)
103 {
104 qreal dx = spanX() / rect.width();
105 qreal dy = spanY() / rect.height();
40
106
41 domain.m_minX = m_minX + dx * rect.left();
107 m_minX = m_maxX - dx * rect.right();
42 domain.m_maxX = m_minX + dx * rect.right();
108 m_maxX = m_minX + dx * size.width();
43 domain.m_minY = m_maxY - dy * rect.bottom();
109 m_maxY = m_minY + dy * rect.bottom();
44 domain.m_maxY = m_maxY - dy * rect.top();
110 m_minY = m_maxY - dy * size.height();
45
111
46 return domain;
112 emit domainChanged(m_minX, m_maxX, m_minY, m_maxY);
113 emit rangeXChanged(m_minX, m_maxX);
114 emit rangeYChanged(m_minY, m_maxY);
115 }
116
117 void Domain::handleAxisRangeXChanged(qreal min,qreal max)
118 {
119 setRangeX(min,max);
120 }
121
122 void Domain::handleAxisRangeYChanged(qreal min,qreal max)
123 {
124 setRangeY(min,max);
47 }
125 }
48
126
49 bool operator== (const Domain &domain1, const Domain &domain2)
127 bool operator== (const Domain &domain1, const Domain &domain2)
50 {
128 {
51 return (domain1.m_maxX == domain2.m_maxX &&
129 return (domain1.m_maxX == domain2.m_maxX &&
52 domain1.m_maxY == domain2.m_maxY &&
130 domain1.m_maxY == domain2.m_maxY &&
53 domain1.m_minX == domain2.m_minX &&
131 domain1.m_minX == domain2.m_minX &&
54 domain1.m_minY == domain2.m_minY);
132 domain1.m_minY == domain2.m_minY);
55 }
133 }
56
134
57 bool operator!= (const Domain &domain1, const Domain &domain2)
135 bool operator!= (const Domain &domain1, const Domain &domain2)
58 {
136 {
59 return !(domain1 == domain2);
137 return !(domain1 == domain2);
60 }
138 }
61
139
62
63 QDebug operator<<(QDebug dbg, const Domain &domain)
140 QDebug operator<<(QDebug dbg, const Domain &domain)
64 {
141 {
65 dbg.nospace() << "Domain("<<domain.m_minX<<','<<domain.m_maxX<<','<<domain.m_minY<<','<<domain.m_maxY<<')';
142 dbg.nospace() << "Domain("<<domain.m_minX<<','<<domain.m_maxX<<','<<domain.m_minY<<','<<domain.m_maxY<<')';
66 return dbg.maybeSpace();
143 return dbg.maybeSpace();
67 }
144 }
68
145
146 #include "moc_domain_p.cpp"
147
69 QTCOMMERCIALCHART_END_NAMESPACE
148 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,32 +1,57
1 #ifndef DOMAIN_H_
1 #ifndef DOMAIN_H_
2 #define DOMAIN_H_
2 #define DOMAIN_H_
3 #include "qchartglobal.h"
3 #include "qchartglobal.h"
4 #include <QRect>
4 #include <QRectF>
5 #include <QSizeF>
5
6
6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7
8
8 class Domain {
9 class Domain: public QObject {
10 Q_OBJECT
9 public:
11 public:
10 Domain(qreal minX=0, qreal maxX=0, qreal minY=0, qreal maxY=0);
12 explicit Domain(QObject* object=0);
11 virtual ~Domain();
13 virtual ~Domain();
12
14
13 qreal spanX() const;
15 void setRange(qreal minX, qreal maxX, qreal minY, qreal maxY);
14 qreal spanY() const;
16 void setRangeX(qreal min, qreal max);
15 bool isEmpty() const;
17 void setRangeY(qreal min, qreal max);
16
18 void setMinX(qreal min);
17 friend bool operator== (const Domain &domain1, const Domain &domain2);
19 void setMaxX(qreal max);
18 friend bool operator!= (const Domain &domain1, const Domain &domain2);
20 void setMinY(qreal min);
19 friend QDebug operator<<(QDebug dbg, const Domain &domain);
21 void setMaxY(qreal max);
20
22
21 Domain subDomain(const QRectF& rect, qreal maxWidth, qreal maxHeight) const;
23 qreal minX() const {return m_minX;};
22
24 qreal maxX() const {return m_maxX;};
23 public:
25 qreal minY() const {return m_minY;};
24 qreal m_minX;
26 qreal maxY() const {return m_maxY;};
25 qreal m_maxX;
27
26 qreal m_minY;
28 qreal spanX() const;
27 qreal m_maxY;
29 qreal spanY() const;
30 bool isEmpty() const;
31
32 friend bool operator== (const Domain &domain1, const Domain &domain2);
33 friend bool operator!= (const Domain &domain1, const Domain &domain2);
34 friend QDebug operator<<(QDebug dbg, const Domain &domain);
35
36 void zoomIn(const QRectF& rect, const QSizeF& size);
37 void zoomOut(const QRectF& rect, const QSizeF& size);
38
39 signals:
40 void domainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY);
41 void rangeXChanged(qreal min, qreal max);
42 void rangeYChanged(qreal min, qreal max);
43
44 public slots:
45 void handleAxisRangeXChanged(qreal min,qreal max);
46 void handleAxisRangeYChanged(qreal min,qreal max);
47
48 private:
49 qreal m_minX;
50 qreal m_maxX;
51 qreal m_minY;
52 qreal m_maxY;
28 };
53 };
29
54
30 QTCOMMERCIALCHART_END_NAMESPACE
55 QTCOMMERCIALCHART_END_NAMESPACE
31
56
32 #endif
57 #endif
@@ -1,103 +1,103
1 #include "linechartanimationitem_p.h"
1 #include "linechartanimationitem_p.h"
2 #include "linechartitem_p.h"
2 #include "linechartitem_p.h"
3 #include <QPropertyAnimation>
3 #include <QPropertyAnimation>
4 #include <QTimer>
4 #include <QTimer>
5
5
6 Q_DECLARE_METATYPE(QVector<QPointF>)
6 Q_DECLARE_METATYPE(QVector<QPointF>)
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 const static int duration = 500;
10 const static int duration = 500;
11
11
12 LineChartAnimationItem::LineChartAnimationItem(ChartPresenter* presenter, QLineSeries* series,QGraphicsItem *parent):
12 LineChartAnimationItem::LineChartAnimationItem(QLineSeries* series,QGraphicsItem *parent):
13 LineChartItem(presenter,series,parent),
13 LineChartItem(series,parent),
14 m_animation(new LineChartAnimatator(this,this)),
14 m_animation(new LineChartAnimatator(this,this)),
15 m_dirty(false)
15 m_dirty(false)
16 {
16 {
17 }
17 }
18
18
19 LineChartAnimationItem::~LineChartAnimationItem()
19 LineChartAnimationItem::~LineChartAnimationItem()
20 {
20 {
21 }
21 }
22
22
23 void LineChartAnimationItem::updateItem(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints)
23 void LineChartAnimationItem::updateItem(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints)
24 {
24 {
25 if(newPoints.count()==0) return;
25 if(newPoints.count()==0) return;
26 oldPoints.resize(newPoints.size());
26 oldPoints.resize(newPoints.size());
27
27
28 if(m_animation->state()!=QAbstractAnimation::Stopped){
28 if(m_animation->state()!=QAbstractAnimation::Stopped){
29 m_animation->stop();
29 m_animation->stop();
30 }
30 }
31
31
32 m_animation->setDuration(duration);
32 m_animation->setDuration(duration);
33 m_animation->setEasingCurve(QEasingCurve::InOutBack);
33 m_animation->setEasingCurve(QEasingCurve::InOutBack);
34 m_animation->setKeyValueAt(0.0, qVariantFromValue(oldPoints));
34 m_animation->setKeyValueAt(0.0, qVariantFromValue(oldPoints));
35 m_animation->setKeyValueAt(1.0, qVariantFromValue(newPoints));
35 m_animation->setKeyValueAt(1.0, qVariantFromValue(newPoints));
36 QTimer::singleShot(0,m_animation,SLOT(start()));
36 QTimer::singleShot(0,m_animation,SLOT(start()));
37
37
38 oldPoints = newPoints;
38 oldPoints = newPoints;
39 m_points = newPoints;
39 m_points = newPoints;
40 m_dirty=false;
40 m_dirty=false;
41 }
41 }
42
42
43 void LineChartAnimationItem::updateItem(QVector<QPointF>& oldPoints,int index,QPointF& newPoint)
43 void LineChartAnimationItem::updateItem(QVector<QPointF>& oldPoints,int index,QPointF& newPoint)
44 {
44 {
45 if(m_animation->state()!=QAbstractAnimation::Stopped){
45 if(m_animation->state()!=QAbstractAnimation::Stopped){
46 m_animation->stop();
46 m_animation->stop();
47 m_dirty=true;
47 m_dirty=true;
48 }
48 }
49
49
50 if(m_dirty){
50 if(m_dirty){
51 m_points=oldPoints;
51 m_points=oldPoints;
52 m_dirty=false;
52 m_dirty=false;
53 }
53 }
54
54
55 oldPoints.replace(index,newPoint);
55 oldPoints.replace(index,newPoint);
56
56
57 m_animation->setDuration(duration);
57 m_animation->setDuration(duration);
58 m_animation->setEasingCurve(QEasingCurve::InOutBack);
58 m_animation->setEasingCurve(QEasingCurve::InOutBack);
59 m_animation->setKeyValueAt(0.0, qVariantFromValue(m_points));
59 m_animation->setKeyValueAt(0.0, qVariantFromValue(m_points));
60 m_animation->setKeyValueAt(1.0, qVariantFromValue(oldPoints));
60 m_animation->setKeyValueAt(1.0, qVariantFromValue(oldPoints));
61 QTimer::singleShot(0,this,SLOT(startAnimation()));
61 QTimer::singleShot(0,this,SLOT(startAnimation()));
62
62
63 }
63 }
64
64
65 void LineChartAnimationItem::startAnimation()
65 void LineChartAnimationItem::startAnimation()
66 {
66 {
67 m_dirty=true;
67 m_dirty=true;
68 m_animation->start();
68 m_animation->start();
69 }
69 }
70
70
71 LineChartAnimatator::LineChartAnimatator(LineChartAnimationItem *item , QObject *parent):QVariantAnimation(parent),
71 LineChartAnimatator::LineChartAnimatator(LineChartAnimationItem *item , QObject *parent):QVariantAnimation(parent),
72 m_item(item)
72 m_item(item)
73 {
73 {
74 }
74 }
75
75
76 LineChartAnimatator::~LineChartAnimatator()
76 LineChartAnimatator::~LineChartAnimatator()
77 {
77 {
78 }
78 }
79
79
80 QVariant LineChartAnimatator::interpolated(const QVariant &start, const QVariant & end, qreal progress ) const
80 QVariant LineChartAnimatator::interpolated(const QVariant &start, const QVariant & end, qreal progress ) const
81 {
81 {
82 QVector<QPointF> startVector = qVariantValue<QVector<QPointF> >(start);
82 QVector<QPointF> startVector = qVariantValue<QVector<QPointF> >(start);
83 QVector<QPointF> endVecotr = qVariantValue<QVector<QPointF> >(end);
83 QVector<QPointF> endVecotr = qVariantValue<QVector<QPointF> >(end);
84 QVector<QPointF> result;
84 QVector<QPointF> result;
85 Q_ASSERT(startVector.count() == endVecotr.count());
85 Q_ASSERT(startVector.count() == endVecotr.count());
86
86
87 for(int i =0 ;i< startVector.count();i++){
87 for(int i =0 ;i< startVector.count();i++){
88 qreal x = startVector[i].x() + ((endVecotr[i].x()- startVector[i].x()) * progress);//qBound(0.0, progress, 1.0));
88 qreal x = startVector[i].x() + ((endVecotr[i].x()- startVector[i].x()) * progress);//qBound(0.0, progress, 1.0));
89 qreal y = startVector[i].y() + ((endVecotr[i].y()- startVector[i].y()) * progress);//qBound(0.0, progress, 1.0));
89 qreal y = startVector[i].y() + ((endVecotr[i].y()- startVector[i].y()) * progress);//qBound(0.0, progress, 1.0));
90 result << QPointF(x,y);
90 result << QPointF(x,y);
91 }
91 }
92 return qVariantFromValue(result);
92 return qVariantFromValue(result);
93 }
93 }
94
94
95 void LineChartAnimatator::updateCurrentValue (const QVariant & value )
95 void LineChartAnimatator::updateCurrentValue (const QVariant & value )
96 {
96 {
97 QVector<QPointF> vector = qVariantValue<QVector<QPointF> >(value);
97 QVector<QPointF> vector = qVariantValue<QVector<QPointF> >(value);
98 m_item->applyGeometry(vector);
98 m_item->applyGeometry(vector);
99 }
99 }
100
100
101 #include "moc_linechartanimationitem_p.cpp"
101 #include "moc_linechartanimationitem_p.cpp"
102
102
103 QTCOMMERCIALCHART_END_NAMESPACE
103 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,50 +1,50
1 #ifndef LINECHARTANIMATIONITEM_P_H_
1 #ifndef LINECHARTANIMATIONITEM_P_H_
2 #define LINECHARTANIMATIONITEM_P_H_
2 #define LINECHARTANIMATIONITEM_P_H_
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "linechartitem_p.h"
5 #include "linechartitem_p.h"
6 #include "domain_p.h"
6 #include "domain_p.h"
7 #include <QVariantAnimation>
7 #include <QVariantAnimation>
8
8
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10
10
11 class LineChartAnimatator;
11 class LineChartAnimatator;
12
12
13 class LineChartAnimationItem : public LineChartItem {
13 class LineChartAnimationItem : public LineChartItem {
14
14
15 Q_OBJECT
15 Q_OBJECT
16
16
17 public:
17 public:
18 LineChartAnimationItem(ChartPresenter* presenter, QLineSeries *series, QGraphicsItem *parent = 0);
18 LineChartAnimationItem(QLineSeries *series, QGraphicsItem *parent = 0);
19 virtual ~LineChartAnimationItem();
19 virtual ~LineChartAnimationItem();
20
20
21 protected:
21 protected:
22 virtual void updateItem(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints);
22 virtual void updateItem(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints);
23 virtual void updateItem(QVector<QPointF>& oldPoints,int index,QPointF& newPoint);
23 virtual void updateItem(QVector<QPointF>& oldPoints,int index,QPointF& newPoint);
24
24
25 private slots:
25 private slots:
26 void startAnimation();
26 void startAnimation();
27
27
28 private:
28 private:
29 LineChartAnimatator *m_animation;
29 LineChartAnimatator *m_animation;
30 QVector<QPointF> m_points;
30 QVector<QPointF> m_points;
31 bool m_dirty;
31 bool m_dirty;
32 };
32 };
33
33
34 class LineChartAnimatator: public QVariantAnimation
34 class LineChartAnimatator: public QVariantAnimation
35 {
35 {
36 public:
36 public:
37 LineChartAnimatator(LineChartAnimationItem *item, QObject *parent = 0 );
37 LineChartAnimatator(LineChartAnimationItem *item, QObject *parent = 0 );
38 ~LineChartAnimatator();
38 ~LineChartAnimatator();
39
39
40 protected:
40 protected:
41 QVariant interpolated(const QVariant &start, const QVariant & end, qreal progress ) const;
41 QVariant interpolated(const QVariant &start, const QVariant & end, qreal progress ) const;
42 void updateCurrentValue (const QVariant & value );
42 void updateCurrentValue (const QVariant & value );
43
43
44 private:
44 private:
45 LineChartAnimationItem* m_item;
45 LineChartAnimationItem* m_item;
46 };
46 };
47
47
48 QTCOMMERCIALCHART_END_NAMESPACE
48 QTCOMMERCIALCHART_END_NAMESPACE
49
49
50 #endif
50 #endif
@@ -1,225 +1,239
1 #include "linechartitem_p.h"
1 #include "linechartitem_p.h"
2 #include "qlineseries.h"
2 #include "qlineseries.h"
3 #include "chartpresenter_p.h"
3 #include "chartpresenter_p.h"
4 #include <QPainter>
4 #include <QPainter>
5
5
6
6
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8
8
9 //TODO: optimize : remove points which are not visible
9 //TODO: optimize : remove points which are not visible
10
10
11 LineChartItem::LineChartItem(ChartPresenter* presenter, QLineSeries* series,QGraphicsItem *parent):ChartItem(parent),
11 LineChartItem::LineChartItem(QLineSeries* series,QGraphicsItem *parent):ChartItem(parent),
12 m_presenter(presenter),
12 m_minX(0),
13 m_maxX(0),
14 m_minY(0),
15 m_maxY(0),
13 m_series(series),
16 m_series(series),
14 m_items(this)
17 m_items(this)
15 {
18 {
16 //m_items.setZValue(ChartPresenter::LineChartZValue);
19 //m_items.setZValue(ChartPresenter::LineChartZValue);
17 setZValue(ChartPresenter::LineChartZValue);
20 setZValue(ChartPresenter::LineChartZValue);
18
21
19 QObject::connect(presenter,SIGNAL(geometryChanged(const QRectF&)),this,SLOT(handleGeometryChanged(const QRectF&)));
20 QObject::connect(series,SIGNAL(pointReplaced(int)),this,SLOT(handlePointReplaced(int)));
22 QObject::connect(series,SIGNAL(pointReplaced(int)),this,SLOT(handlePointReplaced(int)));
21 QObject::connect(series,SIGNAL(pointAdded(int)),this,SLOT(handlePointAdded(int)));
23 QObject::connect(series,SIGNAL(pointAdded(int)),this,SLOT(handlePointAdded(int)));
22 QObject::connect(series,SIGNAL(pointRemoved(int)),this,SLOT(handlePointRemoved(int)));
24 QObject::connect(series,SIGNAL(pointRemoved(int)),this,SLOT(handlePointRemoved(int)));
23 QObject::connect(series,SIGNAL(updated()),this,SLOT(handleUpdated()));
25 QObject::connect(series,SIGNAL(updated()),this,SLOT(handleUpdated()));
26
27 handleUpdated();
24 }
28 }
25
29
26 QRectF LineChartItem::boundingRect() const
30 QRectF LineChartItem::boundingRect() const
27 {
31 {
28 return m_rect;
32 return m_rect;
29 }
33 }
30
34
31 QPainterPath LineChartItem::shape() const
35 QPainterPath LineChartItem::shape() const
32 {
36 {
33 return m_path;
37 return m_path;
34 }
38 }
35
39
36 void LineChartItem::createPoints(int count)
40 void LineChartItem::createPoints(int count)
37 {
41 {
38 for (int i = 0; i < count; ++i) {
42 for (int i = 0; i < count; ++i) {
39 QGraphicsRectItem* item = new QGraphicsRectItem(0,0,3,3);
43 QGraphicsRectItem* item = new QGraphicsRectItem(0,0,3,3);
40 m_items.addToGroup(item);
44 m_items.addToGroup(item);
41 }
45 }
42 }
46 }
43
47
44 void LineChartItem::clearPoints(int count)
48 void LineChartItem::clearPoints(int count)
45 {
49 {
46 QList<QGraphicsItem *> items = m_items.childItems();
50 QList<QGraphicsItem *> items = m_items.childItems();
47
51
48 for (int i = 0; i < count; ++i) {
52 for (int i = 0; i < count; ++i) {
49 delete(items.takeLast());
53 delete(items.takeLast());
50 }
54 }
51 }
55 }
52
56
53 QPointF LineChartItem::calculateGeometryPoint(int index) const
57 QPointF LineChartItem::calculateGeometryPoint(int index) const
54 {
58 {
55 const qreal deltaX = m_size.width()/m_domain.spanX();
59 const qreal deltaX = m_size.width()/(m_maxX-m_minX);
56 const qreal deltaY = m_size.height()/m_domain.spanY();
60 const qreal deltaY = m_size.height()/(m_maxY-m_minY);
57 qreal x = (m_series->x(index) - m_domain.m_minX)* deltaX;
61 qreal x = (m_series->x(index) - m_minX)* deltaX;
58 qreal y = (m_series->y(index) - m_domain.m_minY)*-deltaY + m_size.height();
62 qreal y = (m_series->y(index) - m_minY)*-deltaY + m_size.height();
59 return QPointF(x,y);
63 return QPointF(x,y);
60 }
64 }
61
65
62 QVector<QPointF> LineChartItem::calculateGeometryPoints() const
66 QVector<QPointF> LineChartItem::calculateGeometryPoints() const
63 {
67 {
64 const qreal deltaX = m_size.width()/m_domain.spanX();
68 const qreal deltaX = m_size.width()/(m_maxX-m_minX);
65 const qreal deltaY = m_size.height()/m_domain.spanY();
69 const qreal deltaY = m_size.height()/(m_maxY-m_minY);
66
70
67 QVector<QPointF> points;
71 QVector<QPointF> points;
68 points.reserve(m_series->count());
72 points.reserve(m_series->count());
69 for (int i = 0; i < m_series->count(); ++i) {
73 for (int i = 0; i < m_series->count(); ++i) {
70 qreal x = (m_series->x(i) - m_domain.m_minX)* deltaX;
74 qreal x = (m_series->x(i) - m_minX)* deltaX;
71 qreal y = (m_series->y(i) - m_domain.m_minY)*-deltaY + m_size.height();
75 qreal y = (m_series->y(i) - m_minY)*-deltaY + m_size.height();
72 points << QPointF(x,y);
76 points << QPointF(x,y);
73 }
77 }
74 return points;
78 return points;
75 }
79 }
76
80
77 void LineChartItem::updateItem(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints)
81 void LineChartItem::updateItem(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints)
78 {
82 {
79 applyGeometry(newPoints);
83 applyGeometry(newPoints);
80 oldPoints = newPoints;
84 oldPoints = newPoints;
81 }
85 }
82
86
83 void LineChartItem::updateItem(QVector<QPointF>& oldPoints,int index,QPointF& newPoint)
87 void LineChartItem::updateItem(QVector<QPointF>& oldPoints,int index,QPointF& newPoint)
84 {
88 {
85 oldPoints.replace(index,newPoint);
89 oldPoints.replace(index,newPoint);
86 applyGeometry(oldPoints);
90 applyGeometry(oldPoints);
87 }
91 }
88
92
89 void LineChartItem::applyGeometry(QVector<QPointF>& points)
93 void LineChartItem::applyGeometry(QVector<QPointF>& points)
90 {
94 {
91 if(points.size()==0) return;
95 if(points.size()==0) return;
92
96
93 QList<QGraphicsItem*> items = m_items.childItems();
97 QList<QGraphicsItem*> items = m_items.childItems();
94
98
95 QPainterPath path;
99 QPainterPath path;
96 const QPointF& point = points.at(0);
100 const QPointF& point = points.at(0);
97 path.moveTo(point);
101 path.moveTo(point);
98 QGraphicsItem* item = items.at(0);
102 QGraphicsItem* item = items.at(0);
99 item->setPos(point.x()-1,point.y()-1);
103 item->setPos(point.x()-1,point.y()-1);
100 if(!m_clipRect.contains(point)) item->setVisible(false);
104 if(!m_clipRect.contains(point)) {
105 item->setVisible(false);
106 }else{
107 item->setVisible(true);
108 }
101
109
102 for(int i=1 ; i< points.size();i++) {
110 for(int i=1 ; i< points.size();i++) {
103 QGraphicsItem* item = items.at(i);
111 QGraphicsItem* item = items.at(i);
104 const QPointF& point = points.at(i);
112 const QPointF& point = points.at(i);
105 item->setPos(point.x()-1,point.y()-1);
113 item->setPos(point.x()-1,point.y()-1);
106 if(!m_clipRect.contains(point)) item->setVisible(false);
114 if(!m_clipRect.contains(point)) {
115 item->setVisible(false);
116 }else{
117 item->setVisible(true);
118 }
107 path.lineTo(point);
119 path.lineTo(point);
108 }
120 }
109
121
110 prepareGeometryChange();
122 prepareGeometryChange();
111 m_path = path;
123 m_path = path;
112 m_rect = path.boundingRect();
124 m_rect = path.boundingRect();
113 }
125 }
114
126
115 void LineChartItem::setPen(const QPen& pen)
127 void LineChartItem::setPen(const QPen& pen)
116 {
128 {
117 m_pen = pen;
129 m_pen = pen;
118 }
130 }
119
131
120 //handlers
132 //handlers
121
133
122 void LineChartItem::handlePointAdded(int index)
134 void LineChartItem::handlePointAdded(int index)
123 {
135 {
124 Q_ASSERT(index<m_series->count());
136 Q_ASSERT(index<m_series->count());
125 Q_ASSERT(index>=0);
137 Q_ASSERT(index>=0);
126
138
127 QPointF point = calculateGeometryPoint(index);
139 QPointF point = calculateGeometryPoint(index);
128 createPoints(1);
140 createPoints(1);
129 QVector<QPointF> points = m_points;
141 QVector<QPointF> points = m_points;
130 points.insert(index,point);
142 points.insert(index,point);
131 updateItem(m_points,points);
143 updateItem(m_points,points);
132 update();
144 update();
133 }
145 }
134 void LineChartItem::handlePointRemoved(int index)
146 void LineChartItem::handlePointRemoved(int index)
135 {
147 {
136 Q_ASSERT(index<m_series->count());
148 Q_ASSERT(index<m_series->count());
137 Q_ASSERT(index>=0);
149 Q_ASSERT(index>=0);
138 QPointF point = calculateGeometryPoint(index);
150 QPointF point = calculateGeometryPoint(index);
139 clearPoints(1);
151 clearPoints(1);
140 QVector<QPointF> points = m_points;
152 QVector<QPointF> points = m_points;
141 points.remove(index);
153 points.remove(index);
142 updateItem(m_points,points);
154 updateItem(m_points,points);
143 update();
155 update();
144 }
156 }
145
157
146 void LineChartItem::handlePointReplaced(int index)
158 void LineChartItem::handlePointReplaced(int index)
147 {
159 {
148 Q_ASSERT(index<m_series->count());
160 Q_ASSERT(index<m_series->count());
149 Q_ASSERT(index>=0);
161 Q_ASSERT(index>=0);
150 QPointF point = calculateGeometryPoint(index);
162 QPointF point = calculateGeometryPoint(index);
151 updateItem(m_points,index,point);
163 updateItem(m_points,index,point);
152 update();
164 update();
153 }
165 }
154
166
155 void LineChartItem::handleDomainChanged(const Domain& domain)
167 void LineChartItem::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY)
156 {
168 {
169 m_minX=minX;
170 m_maxX=maxX;
171 m_minY=minY;
172 m_maxY=maxY;
157
173
158 m_domain = domain;
174 if( (m_maxX - m_minX) == 0|| (m_maxY - m_minY) == 0) return;
159
160 if(m_domain.isEmpty()) return;
161 if(!m_clipRect.isValid()) return;
175 if(!m_clipRect.isValid()) return;
162
176
163 QVector<QPointF> points = calculateGeometryPoints();
177 QVector<QPointF> points = calculateGeometryPoints();
164
178
165 int diff = m_points.size() - points.size();
179 int diff = m_points.size() - points.size();
166
180
167 if(diff>0) {
181 if(diff>0) {
168 clearPoints(diff);
182 clearPoints(diff);
169 }
183 }
170 else if(diff<0) {
184 else if(diff<0) {
171 createPoints(-diff);
185 createPoints(-diff);
172 }
186 }
173
187
174 updateItem(m_points,points);
188 updateItem(m_points,points);
175 update();
189 update();
176 }
190 }
177
191
178 void LineChartItem::handleGeometryChanged(const QRectF& rect)
192 void LineChartItem::handleGeometryChanged(const QRectF& rect)
179 {
193 {
180 Q_ASSERT(rect.isValid());
194 Q_ASSERT(rect.isValid());
181 m_size=rect.size();
195 m_size=rect.size();
182 m_clipRect=rect.translated(-rect.topLeft());
196 m_clipRect=rect.translated(-rect.topLeft());
183 setPos(rect.topLeft());
197 setPos(rect.topLeft());
184
198
185 if(m_domain.isEmpty()) return;
199 if( (m_maxX - m_minX) == 0|| (m_maxY - m_minY) == 0) return;
186
200
187 QVector<QPointF> points = calculateGeometryPoints();
201 QVector<QPointF> points = calculateGeometryPoints();
188
202
189 int diff = m_points.size() - points.size();
203 int diff = m_points.size() - points.size();
190
204
191 if(diff>0) {
205 if(diff>0) {
192 clearPoints(diff);
206 clearPoints(diff);
193 }
207 }
194 else if(diff<0) {
208 else if(diff<0) {
195 createPoints(-diff);
209 createPoints(-diff);
196 }
210 }
197
211
198 updateItem(m_points,points);
212 updateItem(m_points,points);
199 update();
213 update();
200 }
214 }
201
215
202 void LineChartItem::handleUpdated()
216 void LineChartItem::handleUpdated()
203 {
217 {
204 m_items.setVisible(m_series->pointsVisible());
218 m_items.setVisible(m_series->pointsVisible());
205 setPen(m_series->pen());
219 setPen(m_series->pen());
206 update();
220 update();
207 }
221 }
208
222
209 //painter
223 //painter
210
224
211 void LineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
225 void LineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
212 {
226 {
213 Q_UNUSED(widget);
227 Q_UNUSED(widget);
214 Q_UNUSED(option);
228 Q_UNUSED(option);
215 painter->save();
229 painter->save();
216 painter->setPen(m_pen);
230 painter->setPen(m_pen);
217 painter->setClipRect(m_clipRect);
231 painter->setClipRect(m_clipRect);
218 painter->drawPath(m_path);
232 painter->drawPath(m_path);
219 painter->restore();
233 painter->restore();
220 }
234 }
221
235
222
236
223 #include "moc_linechartitem_p.cpp"
237 #include "moc_linechartitem_p.cpp"
224
238
225 QTCOMMERCIALCHART_END_NAMESPACE
239 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,61 +1,63
1 #ifndef LINECHARTITEM_H
1 #ifndef LINECHARTITEM_H
2 #define LINECHARTITEM_H
2 #define LINECHARTITEM_H
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "chartitem_p.h"
5 #include "chartitem_p.h"
6 #include <QPen>
6 #include <QPen>
7
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
9
10 class ChartPresenter;
10 class ChartPresenter;
11 class QLineSeries;
11 class QLineSeries;
12
12
13 class LineChartItem : public QObject , public ChartItem
13 class LineChartItem : public QObject , public ChartItem
14 {
14 {
15 Q_OBJECT
15 Q_OBJECT
16 public:
16 public:
17 LineChartItem(ChartPresenter* presenter, QLineSeries* series,QGraphicsItem *parent = 0);
17 LineChartItem(QLineSeries* series,QGraphicsItem *parent = 0);
18 ~ LineChartItem(){};
18 ~ LineChartItem(){};
19
19
20 //from QGraphicsItem
20 //from QGraphicsItem
21 QRectF boundingRect() const;
21 QRectF boundingRect() const;
22 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
22 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
23 QPainterPath shape() const;
23 QPainterPath shape() const;
24
24
25 void setPen(const QPen& pen);
25 void setPen(const QPen& pen);
26 void setPointsVisible(bool visible);
26 void setPointsVisible(bool visible);
27
27
28 public slots:
28 public slots:
29 void handlePointAdded(int index);
29 void handlePointAdded(int index);
30 void handlePointRemoved(int index);
30 void handlePointRemoved(int index);
31 void handlePointReplaced(int index);
31 void handlePointReplaced(int index);
32 void handleUpdated();
32 void handleUpdated();
33 void handleDomainChanged(const Domain& domain);
33 void handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY);
34 void handleGeometryChanged(const QRectF& size);
34 void handleGeometryChanged(const QRectF& size);
35
35
36 public:
36 public:
37 virtual void updateItem(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints);
37 virtual void updateItem(QVector<QPointF>& oldPoints,QVector<QPointF>& newPoints);
38 virtual void updateItem(QVector<QPointF>& oldPoints,int index,QPointF& newPoint);
38 virtual void updateItem(QVector<QPointF>& oldPoints,int index,QPointF& newPoint);
39 virtual void applyGeometry(QVector<QPointF>& points);
39 virtual void applyGeometry(QVector<QPointF>& points);
40 void createPoints(int count);
40 void createPoints(int count);
41 void clearPoints(int count);
41 void clearPoints(int count);
42 QPointF calculateGeometryPoint(int index) const;
42 QPointF calculateGeometryPoint(int index) const;
43 QVector<QPointF> calculateGeometryPoints() const;
43 QVector<QPointF> calculateGeometryPoints() const;
44
44
45 protected:
45 protected:
46 qreal m_minX;
47 qreal m_maxX;
48 qreal m_minY;
49 qreal m_maxY;
46 QPainterPath m_path;
50 QPainterPath m_path;
47 QRectF m_rect;
51 QRectF m_rect;
48 QLineSeries* m_series;
52 QLineSeries* m_series;
49 ChartPresenter* m_presenter;
53 QSizeF m_size;
50 QSizeF m_size;
51 QRectF m_clipRect;
54 QRectF m_clipRect;
52 Domain m_domain;
53 QGraphicsItemGroup m_items;
55 QGraphicsItemGroup m_items;
54 QVector<QPointF> m_points;
56 QVector<QPointF> m_points;
55 QPen m_pen;
57 QPen m_pen;
56
58
57 };
59 };
58
60
59 QTCOMMERCIALCHART_END_NAMESPACE
61 QTCOMMERCIALCHART_END_NAMESPACE
60
62
61 #endif
63 #endif
@@ -1,59 +1,60
1 #ifndef QLINESERIES_H_
1 #ifndef QLINESERIES_H_
2 #define QLINESERIES_H_
2 #define QLINESERIES_H_
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "qseries.h"
5 #include "qseries.h"
6 #include <QDebug>
6 #include <QDebug>
7 #include <QPen>
7 #include <QPen>
8 #include <QBrush>
8 #include <QBrush>
9
9
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11
11
12 class QTCOMMERCIALCHART_EXPORT QLineSeries : public QSeries
12 class QTCOMMERCIALCHART_EXPORT QLineSeries : public QSeries
13 {
13 {
14 Q_OBJECT
14 Q_OBJECT
15 public:
15 public:
16 QLineSeries(QObject* parent=0);
16 QLineSeries(QObject* parent=0);
17 virtual ~QLineSeries();
17 virtual ~QLineSeries();
18
18
19 public: // from QChartSeries
19 public: // from QChartSeries
20 virtual QSeriesType type() const { return QSeries::SeriesTypeLine;}
20 virtual QSeriesType type() const {return QSeries::SeriesTypeLine;}
21 void add(qreal x, qreal y);
21 void add(qreal x, qreal y);
22 void add(const QPointF& point);
22 void add(const QPointF& point);
23 void replace(qreal x,qreal y);
23 void replace(qreal x,qreal y);
24 void replace(const QPointF& point);
24 void replace(const QPointF& point);
25 void remove(qreal x);
25 void remove(qreal x);
26 void remove(const QPointF& point);
26 void remove(const QPointF& point);
27 void clear();
27 void clear();
28
28
29 void setPen(const QPen& pen);
29 void setPen(const QPen& pen);
30 QPen pen() const { return m_pen;}
30 QPen pen() const {return m_pen;}
31
31
32 void setPointsVisible(bool visible);
32 void setPointsVisible(bool visible);
33 bool pointsVisible() const {return m_pointsVisible;}
33 bool pointsVisible() const {return m_pointsVisible;}
34
34
35 int count() const;
35 int count() const;
36 qreal x(int pos) const;
36 qreal x(int pos) const;
37 qreal y(int pos) const;
37 qreal y(int pos) const;
38
38
39 QLineSeries& operator << (const QPointF &point);
39 QLineSeries& operator << (const QPointF &point);
40 friend QDebug operator<< (QDebug d, const QLineSeries series);
40 friend QDebug operator<< (QDebug d, const QLineSeries series);
41
41
42 signals:
42 signals:
43 void pointReplaced(int index);
43 void updated();
44 void pointRemoved(int index);
44 void pointReplaced(int index);
45 void pointAdded(int index);
45 void pointRemoved(int index);
46 void updated();
46 void pointAdded(int index);
47
47
48 protected:
48
49 QVector<qreal> m_x;
49 protected:
50 QVector<qreal> m_y;
50 QVector<qreal> m_x;
51
51 QVector<qreal> m_y;
52 private:
52
53 QPen m_pen;
53 private:
54 bool m_pointsVisible;
54 QPen m_pen;
55 bool m_pointsVisible;
55 };
56 };
56
57
57 QTCOMMERCIALCHART_END_NAMESPACE
58 QTCOMMERCIALCHART_END_NAMESPACE
58
59
59 #endif
60 #endif
@@ -1,285 +1,277
1 #include "qchart.h"
1 #include "qchart.h"
2 #include "qchartaxis.h"
2 #include "qchartaxis.h"
3 #include "chartpresenter_p.h"
3 #include "chartpresenter_p.h"
4 #include "chartdataset_p.h"
4 #include "chartdataset_p.h"
5 #include <QGraphicsScene>
5 #include <QGraphicsScene>
6 #include <QGraphicsSceneResizeEvent>
6 #include <QGraphicsSceneResizeEvent>
7 #include <QDebug>
7 #include <QDebug>
8
8
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10
10
11 /*!
11 /*!
12 \enum QChart::ChartTheme
12 \enum QChart::ChartTheme
13
13
14 This enum describes the theme used by the chart.
14 This enum describes the theme used by the chart.
15
15
16 \value ChartThemeDefault
16 \value ChartThemeDefault
17 \value ChartThemeVanilla
17 \value ChartThemeVanilla
18 \value ChartThemeIcy
18 \value ChartThemeIcy
19 \value ChartThemeGrayscale
19 \value ChartThemeGrayscale
20 \value ChartThemeScientific
20 \value ChartThemeScientific
21 */
21 */
22
22
23 /*!
23 /*!
24 \enum QChart::AnimationOption
24 \enum QChart::AnimationOption
25
25
26 For enabling/disabling animations. Defaults to NoAnimation.
26 For enabling/disabling animations. Defaults to NoAnimation.
27
27
28 \value NoAnimation
28 \value NoAnimation
29 \value GridAxisAnimations
29 \value GridAxisAnimations
30 \value SeriesAnimations
30 \value SeriesAnimations
31 \value AllAnimations
31 \value AllAnimations
32 */
32 */
33
33
34 /*!
34 /*!
35 \class QChart
35 \class QChart
36 \brief QtCommercial chart API.
36 \brief QtCommercial chart API.
37
37
38 QChart is a QGraphicsWidget that you can show in a QGraphicsScene. It manages the graphical
38 QChart is a QGraphicsWidget that you can show in a QGraphicsScene. It manages the graphical
39 representation of different types of QChartSeries and other chart related objects like
39 representation of different types of QChartSeries and other chart related objects like
40 QChartAxis and QChartLegend. If you simply want to show a chart in a layout, you can use the
40 QChartAxis and QChartLegend. If you simply want to show a chart in a layout, you can use the
41 convenience class QChartView instead of QChart.
41 convenience class QChartView instead of QChart.
42 \sa QChartView
42 \sa QChartView
43 */
43 */
44
44
45 /*!
45 /*!
46 Constructs a chart object which is a child of a\a parent. Parameter \a wFlags is passed to the QGraphicsWidget constructor.
46 Constructs a chart object which is a child of a\a parent. Parameter \a wFlags is passed to the QGraphicsWidget constructor.
47 */
47 */
48 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
48 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
49 m_backgroundItem(0),
49 m_backgroundItem(0),
50 m_titleItem(0),
50 m_titleItem(0),
51 m_dataset(new ChartDataSet(this)),
51 m_dataset(new ChartDataSet(this)),
52 m_presenter(new ChartPresenter(this,m_dataset))
52 m_presenter(new ChartPresenter(this,m_dataset))
53 {
53 {
54 }
54 }
55
55
56 /*!
56 /*!
57 Destroys the object and it's children, like QChartSeries and QChartAxis object added to it.
57 Destroys the object and it's children, like QChartSeries and QChartAxis object added to it.
58 */
58 */
59 QChart::~QChart()
59 QChart::~QChart()
60 {
60 {
61 }
61 }
62
62
63 /*!
63 /*!
64 Adds the \a series and optional \a axisY onto the chart and takes the ownership of the objects.
64 Adds the \a series and optional \a axisY onto the chart and takes the ownership of the objects.
65 If auto scaling is enabled, re-scales the axes the series is bound to (both the x axis and
65 If auto scaling is enabled, re-scales the axes the series is bound to (both the x axis and
66 the y axis).
66 the y axis).
67 */
67 */
68 void QChart::addSeries(QSeries* series, QChartAxis* axisY)
68 void QChart::addSeries(QSeries* series, QChartAxis* axisY)
69 {
69 {
70 m_dataset->addSeries(series, axisY);
70 m_dataset->addSeries(series, axisY);
71 }
71 }
72
72
73 /*!
73 /*!
74 Removes the \a series specified in a perameter from the QChartView.
74 Removes the \a series specified in a perameter from the QChartView.
75 It releses its ownership of the specified QChartSeries object.
75 It releses its ownership of the specified QChartSeries object.
76 It does not delete the pointed QChartSeries data object
76 It does not delete the pointed QChartSeries data object
77 \sa addSeries(), removeAllSeries()
77 \sa addSeries(), removeAllSeries()
78 */
78 */
79 void QChart::removeSeries(QSeries* series)
79 void QChart::removeSeries(QSeries* series)
80 {
80 {
81 m_dataset->removeSeries(series);
81 m_dataset->removeSeries(series);
82 }
82 }
83
83
84 /*!
84 /*!
85 Removes all the QChartSeries that have been added to the QChartView
85 Removes all the QChartSeries that have been added to the QChartView
86 It also deletes the pointed QChartSeries data objects
86 It also deletes the pointed QChartSeries data objects
87 \sa addSeries(), removeSeries()
87 \sa addSeries(), removeSeries()
88 */
88 */
89 void QChart::removeAllSeries()
89 void QChart::removeAllSeries()
90 {
90 {
91 m_dataset->removeAllSeries();
91 m_dataset->removeAllSeries();
92 }
92 }
93
93
94 /*!
94 /*!
95 Sets the \a brush that is used for painting the background of the chart area.
95 Sets the \a brush that is used for painting the background of the chart area.
96 */
96 */
97 void QChart::setChartBackgroundBrush(const QBrush& brush)
97 void QChart::setChartBackgroundBrush(const QBrush& brush)
98 {
98 {
99 createChartBackgroundItem();
99 createChartBackgroundItem();
100 m_backgroundItem->setBrush(brush);
100 m_backgroundItem->setBrush(brush);
101 m_backgroundItem->update();
101 m_backgroundItem->update();
102 }
102 }
103
103
104 /*!
104 /*!
105 Sets the \a pen that is used for painting the background of the chart area.
105 Sets the \a pen that is used for painting the background of the chart area.
106 */
106 */
107 void QChart::setChartBackgroundPen(const QPen& pen)
107 void QChart::setChartBackgroundPen(const QPen& pen)
108 {
108 {
109 createChartBackgroundItem();
109 createChartBackgroundItem();
110 m_backgroundItem->setPen(pen);
110 m_backgroundItem->setPen(pen);
111 m_backgroundItem->update();
111 m_backgroundItem->update();
112 }
112 }
113
113
114 /*!
114 /*!
115 Sets the chart \a title. The description text that is rendered above the chart.
115 Sets the chart \a title. The description text that is rendered above the chart.
116 */
116 */
117 void QChart::setChartTitle(const QString& title)
117 void QChart::setChartTitle(const QString& title)
118 {
118 {
119 createChartTitleItem();
119 createChartTitleItem();
120 m_titleItem->setPlainText(title);
120 m_titleItem->setPlainText(title);
121 }
121 }
122
122
123 /*!
123 /*!
124 Sets the \a font that is used for rendering the description text that is rendered above the chart.
124 Sets the \a font that is used for rendering the description text that is rendered above the chart.
125 */
125 */
126 void QChart::setChartTitleFont(const QFont& font)
126 void QChart::setChartTitleFont(const QFont& font)
127 {
127 {
128 createChartTitleItem();
128 createChartTitleItem();
129 m_titleItem->setFont(font);
129 m_titleItem->setFont(font);
130 }
130 }
131
131
132 void QChart::createChartBackgroundItem()
132 void QChart::createChartBackgroundItem()
133 {
133 {
134 if(!m_backgroundItem) {
134 if(!m_backgroundItem) {
135 m_backgroundItem = new QGraphicsRectItem(this);
135 m_backgroundItem = new QGraphicsRectItem(this);
136 m_backgroundItem->setPen(Qt::NoPen);
136 m_backgroundItem->setPen(Qt::NoPen);
137 m_backgroundItem->setZValue(ChartPresenter::BackgroundZValue);
137 m_backgroundItem->setZValue(ChartPresenter::BackgroundZValue);
138 }
138 }
139 }
139 }
140
140
141 void QChart::createChartTitleItem()
141 void QChart::createChartTitleItem()
142 {
142 {
143 if(!m_titleItem) {
143 if(!m_titleItem) {
144 m_titleItem = new QGraphicsTextItem(this);
144 m_titleItem = new QGraphicsTextItem(this);
145 m_titleItem->setZValue(ChartPresenter::BackgroundZValue);
145 m_titleItem->setZValue(ChartPresenter::BackgroundZValue);
146 }
146 }
147 }
147 }
148
148
149 /*!
149 /*!
150 Returns the chart margin, which is the distance between the widget edge and the part of the chart where the actual data can be displayed.
150 Returns the chart margin, which is the distance between the widget edge and the part of the chart where the actual data can be displayed.
151 \sa setMargin()
151 \sa setMargin()
152 */
152 */
153 int QChart::margin() const
153 int QChart::margin() const
154 {
154 {
155 return m_presenter->margin();
155 return m_presenter->margin();
156 }
156 }
157
157
158 /*!
158 /*!
159 Sets the chart \a margin, which is the distance between the widget edge and the part of the chart where the actual data can be displayed.
159 Sets the chart \a margin, which is the distance between the widget edge and the part of the chart where the actual data can be displayed.
160 \sa margin()
160 \sa margin()
161 */
161 */
162 void QChart::setMargin(int margin)
162 void QChart::setMargin(int margin)
163 {
163 {
164 m_presenter->setMargin(margin);
164 m_presenter->setMargin(margin);
165 }
165 }
166
166
167 /*!
167 /*!
168 Sets the \a theme used by the chart for rendering the graphical representation of the data
168 Sets the \a theme used by the chart for rendering the graphical representation of the data
169 \sa ChartTheme, chartTheme()
169 \sa ChartTheme, chartTheme()
170 */
170 */
171 void QChart::setChartTheme(QChart::ChartTheme theme)
171 void QChart::setChartTheme(QChart::ChartTheme theme)
172 {
172 {
173 m_presenter->setChartTheme(theme);
173 m_presenter->setChartTheme(theme);
174 }
174 }
175
175
176 /*!
176 /*!
177 Returns the theme enum used by the chart.
177 Returns the theme enum used by the chart.
178 \sa ChartTheme, setChartTheme()
178 \sa ChartTheme, setChartTheme()
179 */
179 */
180 QChart::ChartTheme QChart::chartTheme() const
180 QChart::ChartTheme QChart::chartTheme() const
181 {
181 {
182 return m_presenter->chartTheme();
182 return m_presenter->chartTheme();
183 }
183 }
184
184
185 /*!
185 /*!
186 Zooms in the view by a factor of 2
186 Zooms in the view by a factor of 2
187 */
187 */
188 void QChart::zoomIn()
188 void QChart::zoomIn()
189 {
189 {
190 if (!m_dataset->nextDomain()) {
190 m_presenter->zoomIn();
191 QRectF rect = m_presenter->geometry();
192 rect.setWidth(rect.width()/2);
193 rect.setHeight(rect.height()/2);
194 rect.moveCenter(m_presenter->geometry().center());
195 zoomIn(rect);
196 }
197 }
191 }
198
192
199 /*!
193 /*!
200 Zooms in the view to a maximum level at which \a rect is still fully visible.
194 Zooms in the view to a maximum level at which \a rect is still fully visible.
201 */
195 */
202 void QChart::zoomIn(const QRectF& rect)
196 void QChart::zoomIn(const QRectF& rect)
203 {
197 {
198
204 if(!rect.isValid()) return;
199 if(!rect.isValid()) return;
205 QRectF r = rect.normalized();
200 m_presenter->zoomIn(rect);
206 int margin = m_presenter->margin();
207 r.translate(-margin, -margin);
208 m_dataset->addDomain(r,m_presenter->geometry());
209 }
201 }
210
202
211 /*!
203 /*!
212 Restores the view zoom level to the previous one.
204 Restores the view zoom level to the previous one.
213 */
205 */
214 void QChart::zoomOut()
206 void QChart::zoomOut()
215 {
207 {
216 m_dataset->previousDomain();
208 m_presenter->zoomOut();
217 }
209 }
218
210
219 /*!
211 /*!
220 Resets to the default view.
212 Resets to the default view.
221 */
213 */
222 void QChart::zoomReset()
214 void QChart::zoomReset()
223 {
215 {
224 m_dataset->clearDomains();
216 m_presenter->zoomReset();
225 }
217 }
226
218
227 /*!
219 /*!
228 Returns the pointer to the x axis object of the chart
220 Returns the pointer to the x axis object of the chart
229 */
221 */
230 QChartAxis* QChart::axisX() const
222 QChartAxis* QChart::axisX() const
231 {
223 {
232 return m_dataset->axisX();
224 return m_dataset->axisX();
233 }
225 }
234
226
235 /*!
227 /*!
236 Returns the pointer to the y axis object of the chart
228 Returns the pointer to the y axis object of the chart
237 */
229 */
238 QChartAxis* QChart::axisY() const
230 QChartAxis* QChart::axisY() const
239 {
231 {
240 return m_dataset->axisY();
232 return m_dataset->axisY();
241 }
233 }
242
234
243 /*!
235 /*!
244 Resizes and updates the chart area using the \a event data
236 Resizes and updates the chart area using the \a event data
245 */
237 */
246 void QChart::resizeEvent(QGraphicsSceneResizeEvent *event)
238 void QChart::resizeEvent(QGraphicsSceneResizeEvent *event)
247 {
239 {
248
240
249 m_rect = QRectF(QPoint(0,0),event->newSize());
241 m_rect = QRectF(QPoint(0,0),event->newSize());
250 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
242 QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
251
243
252 // recalculate title position
244 // recalculate title position
253 if (m_titleItem) {
245 if (m_titleItem) {
254 QPointF center = m_rect.center() -m_titleItem->boundingRect().center();
246 QPointF center = m_rect.center() -m_titleItem->boundingRect().center();
255 m_titleItem->setPos(center.x(),m_rect.top()/2 + margin()/2);
247 m_titleItem->setPos(center.x(),m_rect.top()/2 + margin()/2);
256 }
248 }
257
249
258 //recalculate background gradient
250 //recalculate background gradient
259 if (m_backgroundItem) {
251 if (m_backgroundItem) {
260 m_backgroundItem->setRect(rect);
252 m_backgroundItem->setRect(rect);
261 }
253 }
262
254
263 QGraphicsWidget::resizeEvent(event);
255 QGraphicsWidget::resizeEvent(event);
264 update();
256 update();
265 }
257 }
266
258
267 /*!
259 /*!
268 Sets animation \a options for the chart
260 Sets animation \a options for the chart
269 */
261 */
270 void QChart::setAnimationOptions(AnimationOptions options)
262 void QChart::setAnimationOptions(AnimationOptions options)
271 {
263 {
272 m_presenter->setAnimationOptions(options);
264 m_presenter->setAnimationOptions(options);
273 }
265 }
274
266
275 /*!
267 /*!
276 Returns animation options for the chart
268 Returns animation options for the chart
277 */
269 */
278 QChart::AnimationOptions QChart::animationOptions() const
270 QChart::AnimationOptions QChart::animationOptions() const
279 {
271 {
280 return m_presenter->animationOptions();
272 return m_presenter->animationOptions();
281 }
273 }
282
274
283 #include "moc_qchart.cpp"
275 #include "moc_qchart.cpp"
284
276
285 QTCOMMERCIALCHART_END_NAMESPACE
277 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,377 +1,396
1 #include "qchartaxis.h"
1 #include "qchartaxis.h"
2
2
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
4
4
5 /*!
5 /*!
6 \class QChartAxis
6 \class QChartAxis
7 \brief The QChartAxis class is used for manipulating chart's axis
7 \brief The QChartAxis class is used for manipulating chart's axis
8 and for adding optional axes to the chart.
8 and for adding optional axes to the chart.
9 \mainclass
9 \mainclass
10
10
11 There is only one x Axis, however there can be multiple y axes.
11 There is only one x Axis, however there can be multiple y axes.
12 Each chart series can be bound to exactly one Y axis and the share common X axis.
12 Each chart series can be bound to exactly one Y axis and the share common X axis.
13 Axis can be setup to show axis line with ticks, gird lines and shades.
13 Axis can be setup to show axis line with ticks, gird lines and shades.
14
14
15 */
15 */
16
16
17 /*!
17 /*!
18 \fn bool QChartAxis::isAxisVisible() const
18 \fn bool QChartAxis::isAxisVisible() const
19 \brief Returns if axis is visible
19 \brief Returns if axis is visible
20 \sa setAxisVisible()
20 \sa setAxisVisible()
21 */
21 */
22
22
23 /*!
23 /*!
24 \fn QPen QChartAxis::axisPen() const
24 \fn QPen QChartAxis::axisPen() const
25 \brief Returns pen used to draw axis and ticks.
25 \brief Returns pen used to draw axis and ticks.
26 \sa setAxisPen()
26 \sa setAxisPen()
27 */
27 */
28
28
29
29
30 /*!
30 /*!
31 \fn bool QChartAxis::isGridVisible() const
31 \fn bool QChartAxis::isGridVisible() const
32 \brief Returns if grid is visible
32 \brief Returns if grid is visible
33 \sa setGridVisible()
33 \sa setGridVisible()
34 */
34 */
35
35
36 /*!
36 /*!
37 \fn QPen QChartAxis::gridPen() const
37 \fn QPen QChartAxis::gridPen() const
38 \brief Returns pen used to draw grid.
38 \brief Returns pen used to draw grid.
39 \sa setGridPen()
39 \sa setGridPen()
40 */
40 */
41
41
42 /*!
42 /*!
43 \fn bool QChartAxis::labelsVisible() const
43 \fn bool QChartAxis::labelsVisible() const
44 \brief Returns if grid is visible
44 \brief Returns if grid is visible
45 \sa setLabelsVisible()
45 \sa setLabelsVisible()
46 */
46 */
47
47
48 /*!
48 /*!
49 \fn QPen QChartAxis::labelsPen() const
49 \fn QPen QChartAxis::labelsPen() const
50 \brief Returns the pen used to labels.
50 \brief Returns the pen used to labels.
51 \sa setLabelsPen()
51 \sa setLabelsPen()
52 */
52 */
53
53
54 /*!
54 /*!
55 \fn QBrush QChartAxis::labelsBrush() const
55 \fn QBrush QChartAxis::labelsBrush() const
56 \brief Returns brush used to draw labels.
56 \brief Returns brush used to draw labels.
57 \sa setLabelsBrush()
57 \sa setLabelsBrush()
58 */
58 */
59
59
60 /*!
60 /*!
61 \fn QFont QChartAxis::labelsFont() const
61 \fn QFont QChartAxis::labelsFont() const
62 \brief Returns font used to draw labels.
62 \brief Returns font used to draw labels.
63 \sa setLabelsFont()
63 \sa setLabelsFont()
64 */
64 */
65
65
66 /*!
66 /*!
67 \fn QFont QChartAxis::labelsAngle() const
67 \fn QFont QChartAxis::labelsAngle() const
68 \brief Returns angle used to draw labels.
68 \brief Returns angle used to draw labels.
69 \sa setLabelsAngle()
69 \sa setLabelsAngle()
70 */
70 */
71
71
72 /*!
72 /*!
73 \fn bool QChartAxis::shadesVisible() const
73 \fn bool QChartAxis::shadesVisible() const
74 \brief Returns if shades are visible.
74 \brief Returns if shades are visible.
75 \sa setShadesVisible()
75 \sa setShadesVisible()
76 */
76 */
77
77
78 /*!
78 /*!
79 \fn qreal QChartAxis::shadesOpacity() const
79 \fn qreal QChartAxis::shadesOpacity() const
80 \brief Returns opacity of shades.
80 \brief Returns opacity of shades.
81 */
81 */
82
82
83 /*!
83 /*!
84 \fn QPen QChartAxis::shadesPen() const
84 \fn QPen QChartAxis::shadesPen() const
85 \brief Returns pen used to draw shades.
85 \brief Returns pen used to draw shades.
86 \sa setShadesPen()
86 \sa setShadesPen()
87 */
87 */
88
88
89 /*!
89 /*!
90 \fn QBrush QChartAxis::shadesBrush() const
90 \fn QBrush QChartAxis::shadesBrush() const
91 \brief Returns brush used to draw shades.
91 \brief Returns brush used to draw shades.
92 \sa setShadesBrush()
92 \sa setShadesBrush()
93 */
93 */
94
94
95 /*!
95 /*!
96 \fn qreal QChartAxis::min() const
96 \fn qreal QChartAxis::min() const
97 \brief Returns minimum value on the axis.
97 \brief Returns minimum value on the axis.
98 \sa setMin()
98 \sa setMin()
99 */
99 */
100
100
101 /*!
101 /*!
102 \fn qreal QChartAxis::max() const
102 \fn qreal QChartAxis::max() const
103 \brief Returns maximim value on the axis.
103 \brief Returns maximim value on the axis.
104 \sa setMax()
104 \sa setMax()
105 */
105 */
106
106
107 /*!
107 /*!
108 \fn void QChartAxis::minChanged(qreal min)
108 \fn void QChartAxis::minChanged(qreal min)
109 \brief Axis emits signal when \a min of axis has changed.
109 \brief Axis emits signal when \a min of axis has changed.
110 */
110 */
111
111
112 /*!
112 /*!
113 \fn void QChartAxis::maxChanged(qreal max)
113 \fn void QChartAxis::maxChanged(qreal max)
114 \brief Axis emits signal when \a max of axis has changed.
114 \brief Axis emits signal when \a max of axis has changed.
115 */
115 */
116 /*!
117 \fn int QChartAxis::ticksCount() const
118 \brief Return number of ticks on the axis
119 \sa setTicksCount()
120 */
121
116
122 /*!
117 /*!
123 \fn void QChartAxis::update(QChartAxis*)
118 \fn void QChartAxis::rangeChanged(qreal min, qreal max)
124 \brief \internal
119 \brief Axis emits signal when \a min or \a max of axis has changed.
125 */
120 */
126
121
127 /*!
122 /*!
128 \fn void QChartAxis::ticksChanged(QChartAxis*)
123 \fn int QChartAxis::ticksCount() const
129 \brief \internal
124 \brief Return number of ticks on the axis
125 \sa setTicksCount()
130 */
126 */
131
127
132 /*!
128 /*!
133 \fn void QChartAxis::rangeChanged(QChartAxis*)
129 \fn void QChartAxis::update()
134 \brief \internal
130 \brief \internal
135 */
131 */
136
132
137 /*!
133 /*!
138 \fn void QChartAxis::updateRange(qreal min, qreal max)
134 \fn void QChartAxis::handleAxisRangeChanged(qreal min, qreal max)
139 \brief \internal \a min \a max
135 \brief \internal \a min \a max
140 */
136 */
141
137
142 /*!
138 /*!
143 Constructs new axis object which is a child of \a parent. Ownership is taken by
139 Constructs new axis object which is a child of \a parent. Ownership is taken by
144 QChatView or QChart when axis added.
140 QChatView or QChart when axis added.
145 */
141 */
146
142
147 QChartAxis::QChartAxis(QObject* parent):QObject(parent),
143 QChartAxis::QChartAxis(QObject* parent):QObject(parent),
148 m_axisVisible(true),
144 m_axisVisible(true),
149 m_gridVisible(true),
145 m_gridVisible(true),
150 m_labelsVisible(true),
146 m_labelsVisible(true),
151 m_labelsAngle(0),
147 m_labelsAngle(0),
152 m_shadesVisible(true),
148 m_shadesVisible(true),
153 m_shadesOpacity(1.0),
149 m_shadesOpacity(1.0),
154 m_min(0),
150 m_min(0),
155 m_max(0),
151 m_max(0),
156 m_ticksCount(5)
152 m_ticksCount(5)
157 {
153 {
158
154
159 }
155 }
160
156
161 /*!
157 /*!
162 Destructor of the axis object. When axis is added to chart, chart object takes ownership.
158 Destructor of the axis object. When axis is added to chart, chart object takes ownership.
163 */
159 */
164
160
165 QChartAxis::~QChartAxis()
161 QChartAxis::~QChartAxis()
166 {
162 {
167 }
163 }
168
164
169 /*!
165 /*!
170 Sets \a pen used to draw axis line and ticks.
166 Sets \a pen used to draw axis line and ticks.
171 */
167 */
172 void QChartAxis::setAxisPen(const QPen& pen)
168 void QChartAxis::setAxisPen(const QPen& pen)
173 {
169 {
170 if (pen != m_axisPen) {
174 m_axisPen=pen;
171 m_axisPen=pen;
175 emit update(this);
172 emit updated();
173 }
176 }
174 }
177
175
178 /*!
176 /*!
179 Sets if axis and ticks are \a visible.
177 Sets if axis and ticks are \a visible.
180 */
178 */
181 void QChartAxis::setAxisVisible(bool visible)
179 void QChartAxis::setAxisVisible(bool visible)
182 {
180 {
181 if (m_axisVisible!=visible) {
183 m_axisVisible=visible;
182 m_axisVisible=visible;
184 emit update(this);
183 emit updated();
184 }
185 }
185 }
186
186
187 /*!
187 /*!
188 Sets if grid is \a visible.
188 Sets if grid is \a visible.
189 */
189 */
190 void QChartAxis::setGridVisible(bool visible)
190 void QChartAxis::setGridVisible(bool visible)
191 {
191 {
192 if (m_gridVisible!=visible) {
192 m_gridVisible=visible;
193 m_gridVisible=visible;
193 emit update(this);
194 emit updated();
195 }
194 }
196 }
195
197
196 /*!
198 /*!
197 Sets \a pen used to draw grid.
199 Sets \a pen used to draw grid.
198 */
200 */
199 void QChartAxis::setGridPen(const QPen& pen)
201 void QChartAxis::setGridPen(const QPen& pen)
200 {
202 {
203 if (m_gridPen!=pen) {
201 m_gridPen=pen;
204 m_gridPen=pen;
202 emit update(this);
205 emit updated();
206 }
203 }
207 }
204
208
205 /*!
209 /*!
206 Sets if axis' labels are \a visible.
210 Sets if axis' labels are \a visible.
207 */
211 */
208 void QChartAxis::setLabelsVisible(bool visible)
212 void QChartAxis::setLabelsVisible(bool visible)
209 {
213 {
214 if(m_labelsVisible!=visible) {
210 m_labelsVisible=visible;
215 m_labelsVisible=visible;
211 emit update(this);
216 emit updated();
217 }
212 }
218 }
213
219
214 /*!
220 /*!
215 Sets \a pen used to draw labels.
221 Sets \a pen used to draw labels.
216 */
222 */
217 void QChartAxis::setLabelsPen(const QPen& pen)
223 void QChartAxis::setLabelsPen(const QPen& pen)
218 {
224 {
225 if(m_labelsPen!=pen) {
219 m_labelsPen=pen;
226 m_labelsPen=pen;
220 emit update(this);
227 emit updated();
228 }
221 }
229 }
222
230
223 /*!
231 /*!
224 Sets \a brush used to draw labels.
232 Sets \a brush used to draw labels.
225 */
233 */
226 void QChartAxis::setLabelsBrush(const QBrush& brush)
234 void QChartAxis::setLabelsBrush(const QBrush& brush)
227 {
235 {
236 if(m_labelsBrush!=brush) {
228 m_labelsBrush=brush;
237 m_labelsBrush=brush;
229 emit update(this);
238 emit updated();
239 }
230 }
240 }
231
241
232 /*!
242 /*!
233 Sets \a font used to draw labels.
243 Sets \a font used to draw labels.
234 */
244 */
235 void QChartAxis::setLabelsFont(const QFont& font)
245 void QChartAxis::setLabelsFont(const QFont& font)
236 {
246 {
247 if(m_labelsFont!=font) {
237 m_labelsFont=font;
248 m_labelsFont=font;
238 emit update(this);
249 emit updated();
250 }
239 }
251 }
240
252
241 /*!
253 /*!
242 Sets \a angle for all the labels on given axis.
254 Sets \a angle for all the labels on given axis.
243 */
255 */
244 void QChartAxis::setLabelsAngle(int angle)
256 void QChartAxis::setLabelsAngle(int angle)
245 {
257 {
258 if(m_labelsAngle!=angle) {
246 m_labelsAngle=angle;
259 m_labelsAngle=angle;
247 emit update(this);
260 emit updated();
261 }
248 }
262 }
249
263
250 /*!
264 /*!
251 Sets if shades are \a visible.
265 Sets if shades are \a visible.
252 */
266 */
253 void QChartAxis::setShadesVisible(bool visible)
267 void QChartAxis::setShadesVisible(bool visible)
254 {
268 {
269 if(m_shadesVisible!=visible) {
255 m_shadesVisible=visible;
270 m_shadesVisible=visible;
256 emit update(this);
271 emit updated();
272 }
257 }
273 }
258
274
259 /*!
275 /*!
260 Sets \a pen used to draw shades.
276 Sets \a pen used to draw shades.
261 */
277 */
262 void QChartAxis::setShadesPen(const QPen& pen)
278 void QChartAxis::setShadesPen(const QPen& pen)
263 {
279 {
264 m_shadesPen=pen;
280 if(m_shadesPen!=pen) {
265 emit update(this);
281 m_shadesPen=pen;
282 emit updated();
283 }
266 }
284 }
267
285
268 /*!
286 /*!
269 Sets \a brush used to draw shades.
287 Sets \a brush used to draw shades.
270 */
288 */
271 void QChartAxis::setShadesBrush(const QBrush& brush)
289 void QChartAxis::setShadesBrush(const QBrush& brush)
272 {
290 {
291 if(m_shadesBrush!=brush) {
273 m_shadesBrush=brush;
292 m_shadesBrush=brush;
274 emit update(this);
293 emit updated();
294 }
275 }
295 }
276
296
277 /*!
297 /*!
278 Sets \a opacity of the shades.
298 Sets \a opacity of the shades.
279 */
299 */
280 void QChartAxis::setShadesOpacity(qreal opacity)
300 void QChartAxis::setShadesOpacity(qreal opacity)
281 {
301 {
302 if(m_shadesOpacity!=opacity) {
282 m_shadesOpacity=opacity;
303 m_shadesOpacity=opacity;
283 emit update(this);
304 emit updated();
305 }
284 }
306 }
285
307
286 /*!
308 /*!
287 Sets \a min value on the axis.
309 Sets \a min value on the axis.
288 */
310 */
289 void QChartAxis::setMin(qreal min)
311 void QChartAxis::setMin(qreal min)
290 {
312 {
291 if(m_min!=min) {
313 setRange(min,m_max);
292 m_min=min;
293 emit rangeChanged(this);
294 }
295 }
314 }
296
315
297 /*!
316 /*!
298 Sets \a max value on the axis.
317 Sets \a max value on the axis.
299 */
318 */
300 void QChartAxis::setMax(qreal max)
319 void QChartAxis::setMax(qreal max)
301 {
320 {
302 if(m_max!=max) {
321 setRange(m_min,max);
303 m_max=max;
304 emit rangeChanged(this);
305 }
306 }
322 }
307
323
308 /*!
324 /*!
309 Sets range from \a min to \a max on the axis.
325 Sets range from \a min to \a max on the axis.
310 */
326 */
311 void QChartAxis::setRange(qreal min, qreal max)
327 void QChartAxis::setRange(qreal min, qreal max)
312 {
328 {
313 setMin(min);
329 bool changed = false;
314 setMax(max);
330 if(m_min!=min) {
315 }
331 m_min=min;
332 emit minChanged(min);
333 }
316
334
317 void QChartAxis::updateRange(qreal min, qreal max)
335 if(m_max!=max) {
318 {
336 m_max=max;
319 if(m_max!=max){
320 emit maxChanged(max);
337 emit maxChanged(max);
321 }
338 }
322
339
323 if(m_min!=min){
340 if(changed) emit rangeChanged(m_min,m_max);
324 emit minChanged(min);
341 }
325 }
326
342
327 m_max=max;
343 void QChartAxis::handleAxisRangeChanged(qreal min, qreal max)
328 m_min=min;
344 {
345 setRange(min,max);
329 }
346 }
330
347
331 /*!
348 /*!
332 Sets \a count for ticks on the axis.
349 Sets \a count for ticks on the axis.
333 */
350 */
334 void QChartAxis::setTicksCount(int count)
351 void QChartAxis::setTicksCount(int count)
335 {
352 {
353 if(m_ticksCount!=count) {
336 m_ticksCount=count;
354 m_ticksCount=count;
337 emit ticksChanged(this);
355 emit updated();
356 }
338 }
357 }
339
358
340 /*!
359 /*!
341 TODO: refactor me. Sets string \a label for \a value on the axis.
360 TODO: refactor me. Sets string \a label for \a value on the axis.
342 */
361 */
343 void QChartAxis::addAxisTickLabel(qreal value,const QString& label)
362 void QChartAxis::addAxisTickLabel(qreal value,const QString& label)
344 {
363 {
345 m_ticks.insert(value,label);
364 m_ticks.insert(value,label);
346 emit ticksChanged(this);
365 emit updated();
347 }
366 }
348
367
349 /*!
368 /*!
350 TODO: refactor me. Removes label for \a value on the axis.
369 TODO: refactor me. Removes label for \a value on the axis.
351 */
370 */
352 void QChartAxis::removeAxisTickLabel(qreal value)
371 void QChartAxis::removeAxisTickLabel(qreal value)
353 {
372 {
354 m_ticks.remove(value);
373 m_ticks.remove(value);
355 emit ticksChanged(this);
374 emit updated();
356 }
375 }
357
376
358 /*!
377 /*!
359 TODO: refactor me. Returns label for \a value on the axis.
378 TODO: refactor me. Returns label for \a value on the axis.
360 */
379 */
361 QString QChartAxis::axisTickLabel(qreal value) const
380 QString QChartAxis::axisTickLabel(qreal value) const
362 {
381 {
363 return m_ticks.value(value);
382 return m_ticks.value(value);
364 }
383 }
365
384
366 /*!
385 /*!
367 TODO: refactor me. Removes all the string labels for on the axis.
386 TODO: refactor me. Removes all the string labels for on the axis.
368 */
387 */
369 void QChartAxis::clearAxisTickLabels()
388 void QChartAxis::clearAxisTickLabels()
370 {
389 {
371 m_ticks.clear();
390 m_ticks.clear();
372 emit ticksChanged(this);
391 emit updated();
373 }
392 }
374
393
375 #include "moc_qchartaxis.cpp"
394 #include "moc_qchartaxis.cpp"
376
395
377 QTCOMMERCIALCHART_END_NAMESPACE
396 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,105 +1,106
1 #ifndef QCHARTAXIS_H_
1 #ifndef QCHARTAXIS_H_
2 #define QCHARTAXIS_H_
2 #define QCHARTAXIS_H_
3
3
4 #include <qchartglobal.h>
4 #include <qchartglobal.h>
5 #include <QPen>
5 #include <QPen>
6 #include <QFont>
6 #include <QFont>
7
7
8
8
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10
10
11 class QTCOMMERCIALCHART_EXPORT QChartAxis : public QObject
11 class QTCOMMERCIALCHART_EXPORT QChartAxis : public QObject
12 {
12 {
13 Q_OBJECT
13 Q_OBJECT
14 public:
14 public:
15 QChartAxis(QObject* parent =0);
15 QChartAxis(QObject* parent =0);
16 ~QChartAxis();
16 ~QChartAxis();
17
17
18 //axis handling
18 //axis handling
19 bool isAxisVisible() const { return m_axisVisible;};
19 bool isAxisVisible() const { return m_axisVisible;};
20 void setAxisVisible(bool visible);
20 void setAxisVisible(bool visible);
21 void setAxisPen(const QPen& pen);
21 void setAxisPen(const QPen& pen);
22 QPen axisPen() const { return m_axisPen;};
22 QPen axisPen() const { return m_axisPen;};
23
23
24 //grid handling
24 //grid handling
25 bool isGridVisible() const { return m_gridVisible;};
25 bool isGridVisible() const { return m_gridVisible;};
26 void setGridVisible(bool visible);
26 void setGridVisible(bool visible);
27 void setGridPen(const QPen& pen);
27 void setGridPen(const QPen& pen);
28 QPen gridPen() const {return m_gridPen;}
28 QPen gridPen() const {return m_gridPen;}
29
29
30 //labels handling
30 //labels handling
31 bool labelsVisible() const { return m_labelsVisible;};
31 bool labelsVisible() const { return m_labelsVisible;};
32 void setLabelsVisible(bool visible);
32 void setLabelsVisible(bool visible);
33 void setLabelsPen(const QPen& pen);
33 void setLabelsPen(const QPen& pen);
34 QPen labelsPen() const { return m_labelsPen;}
34 QPen labelsPen() const { return m_labelsPen;}
35 void setLabelsBrush(const QBrush& brush);
35 void setLabelsBrush(const QBrush& brush);
36 QBrush labelsBrush() const { return m_labelsBrush;}
36 QBrush labelsBrush() const { return m_labelsBrush;}
37 void setLabelsFont(const QFont& font);
37 void setLabelsFont(const QFont& font);
38 QFont labelsFont() const { return m_labelsFont;}
38 QFont labelsFont() const { return m_labelsFont;}
39 void setLabelsAngle(int angle);
39 void setLabelsAngle(int angle);
40 int labelsAngle() const { return m_labelsAngle;};
40 int labelsAngle() const { return m_labelsAngle;};
41
41
42 //shades handling
42 //shades handling
43 bool shadesVisible() const { return m_shadesVisible;};
43 bool shadesVisible() const { return m_shadesVisible;};
44 void setShadesVisible(bool visible);
44 void setShadesVisible(bool visible);
45 void setShadesPen(const QPen& pen);
45 void setShadesPen(const QPen& pen);
46 QPen shadesPen() const { return m_shadesPen;}
46 QPen shadesPen() const { return m_shadesPen;}
47 void setShadesBrush(const QBrush& brush);
47 void setShadesBrush(const QBrush& brush);
48 QBrush shadesBrush() const { return m_shadesBrush;}
48 QBrush shadesBrush() const { return m_shadesBrush;}
49 void setShadesOpacity(qreal opacity);
49 void setShadesOpacity(qreal opacity);
50 qreal shadesOpacity() const { return m_shadesOpacity;}
50 qreal shadesOpacity() const { return m_shadesOpacity;}
51
51
52 //range handling
52 //range handling
53 void setMin(qreal min);
53 void setMin(qreal min);
54 qreal min() const { return m_min;};
54 qreal min() const { return m_min;};
55 void setMax(qreal max);
55 void setMax(qreal max);
56 qreal max() const { return m_max;};
56 qreal max() const { return m_max;};
57 void setRange(qreal min, qreal max);
57 void setRange(qreal min, qreal max);
58
58
59 //ticks handling
59 //ticks handling
60 void setTicksCount(int count);
60 void setTicksCount(int count);
61 int ticksCount() const { return m_ticksCount;}
61 int ticksCount() const { return m_ticksCount;}
62 void addAxisTickLabel(qreal value,const QString& label);
62 void addAxisTickLabel(qreal value,const QString& label);
63 void removeAxisTickLabel(qreal value);
63 void removeAxisTickLabel(qreal value);
64 QString axisTickLabel(qreal value) const ;
64 QString axisTickLabel(qreal value) const ;
65 void clearAxisTickLabels();
65 void clearAxisTickLabels();
66
66
67 //internal
68 void updateRange(qreal min, qreal max);
69
70 signals:
67 signals:
71 void minChanged(qreal min);
68 void minChanged(qreal min);
72 void maxChanged(qreal max);
69 void maxChanged(qreal max);
73 //private signal
70 void rangeChanged(qreal min, qreal max);
74 void update(QChartAxis*);
71
75 void rangeChanged(QChartAxis*);
72 //intral signal
76 void ticksChanged(QChartAxis*);
73 void updated();
74
75 //internal slot
76 public slots:
77 void handleAxisRangeChanged(qreal min, qreal max);
77
78
78 private:
79 private:
79 bool m_axisVisible;
80 bool m_axisVisible;
80 QPen m_axisPen;
81 QPen m_axisPen;
81 QBrush m_axisBrush;
82 QBrush m_axisBrush;
82
83
83 bool m_gridVisible;
84 bool m_gridVisible;
84 QPen m_gridPen;
85 QPen m_gridPen;
85
86
86 bool m_labelsVisible;
87 bool m_labelsVisible;
87 QPen m_labelsPen;
88 QPen m_labelsPen;
88 QBrush m_labelsBrush;
89 QBrush m_labelsBrush;
89 QFont m_labelsFont;
90 QFont m_labelsFont;
90 int m_labelsAngle;
91 int m_labelsAngle;
91
92
92 bool m_shadesVisible;
93 bool m_shadesVisible;
93 QPen m_shadesPen;
94 QPen m_shadesPen;
94 QBrush m_shadesBrush;
95 QBrush m_shadesBrush;
95 qreal m_shadesOpacity;
96 qreal m_shadesOpacity;
96
97
97 qreal m_min;
98 qreal m_min;
98 qreal m_max;
99 qreal m_max;
99
100
100 int m_ticksCount;
101 int m_ticksCount;
101 QMap<qreal, QString> m_ticks;
102 QMap<qreal, QString> m_ticks;
102 };
103 };
103
104
104 QTCOMMERCIALCHART_END_NAMESPACE
105 QTCOMMERCIALCHART_END_NAMESPACE
105 #endif /* QCHARTAXIS_H_ */
106 #endif /* QCHARTAXIS_H_ */
@@ -1,150 +1,156
1 #include "scatterpresenter_p.h"
1 #include "scatterpresenter_p.h"
2 #include "qscatterseries.h"
2 #include "qscatterseries.h"
3 #include "chartpresenter_p.h"
3 #include "chartpresenter_p.h"
4 #include <QPen>
4 #include <QPen>
5 #include <QPainter>
5 #include <QPainter>
6 #include <QGraphicsScene>
6 #include <QGraphicsScene>
7 #include <QGraphicsSceneMouseEvent>
7 #include <QGraphicsSceneMouseEvent>
8 #include <QGraphicsDropShadowEffect>
8 #include <QGraphicsDropShadowEffect>
9 #include <QDebug>
9 #include <QDebug>
10 #include <QTime>
10 #include <QTime>
11
11
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
12 QTCOMMERCIALCHART_BEGIN_NAMESPACE
13
13
14 ScatterPresenter::ScatterPresenter(QScatterSeries *series, QGraphicsObject *parent) :
14 ScatterPresenter::ScatterPresenter(QScatterSeries *series, QGraphicsObject *parent) :
15 ChartItem(parent),
15 ChartItem(parent),
16 m_minX(0),
17 m_maxX(0),
18 m_minY(0),
19 m_maxY(0),
16 m_series(series),
20 m_series(series),
17 m_boundingRect(),
21 m_boundingRect()
18 m_visibleChartArea()
19 {
22 {
20 if (parent)
23 if (parent)
21 m_boundingRect = parent->boundingRect();
24 m_boundingRect = parent->boundingRect();
22
25
23 if (series) {
26 if (series) {
24 connect(series, SIGNAL(changed()), this, SLOT(handleModelChanged()));
27 connect(series, SIGNAL(changed()), this, SLOT(handleModelChanged()));
25 }
28 }
26
29
27 setZValue(ChartPresenter::ScatterSeriesZValue);
30 setZValue(ChartPresenter::ScatterSeriesZValue);
28
31
29 // TODO: how to draw a drop shadow?
32 // TODO: how to draw a drop shadow?
30 // QGraphicsDropShadowEffect *dropShadow = new QGraphicsDropShadowEffect();
33 // QGraphicsDropShadowEffect *dropShadow = new QGraphicsDropShadowEffect();
31 // dropShadow->setOffset(2.0);
34 // dropShadow->setOffset(2.0);
32 // dropShadow->setBlurRadius(2.0);
35 // dropShadow->setBlurRadius(2.0);
33 // setGraphicsEffect(dropShadow);
36 // setGraphicsEffect(dropShadow);
34 }
37 }
35
38
36 void ScatterPresenter::handleDomainChanged(const Domain& domain)
39 void ScatterPresenter::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY)
37 {
40 {
38 m_visibleChartArea = domain;
41 m_minX=minX;
42 m_maxX=maxX;
43 m_minY=minY;
44 m_maxY=maxY;
39 changeGeometry();
45 changeGeometry();
40 }
46 }
41
47
42 void ScatterPresenter::handleGeometryChanged(const QRectF& rect)
48 void ScatterPresenter::handleGeometryChanged(const QRectF& rect)
43 {
49 {
44 m_boundingRect = rect.translated(-rect.topLeft());
50 m_boundingRect = rect.translated(-rect.topLeft());
45 changeGeometry();
51 changeGeometry();
46 setPos(rect.topLeft());
52 setPos(rect.topLeft());
47 }
53 }
48
54
49 void ScatterPresenter::handleModelChanged()
55 void ScatterPresenter::handleModelChanged()
50 {
56 {
51 // TODO: more fine grained modelChanged signaling
57 // TODO: more fine grained modelChanged signaling
52 changeGeometry();
58 changeGeometry();
53 }
59 }
54
60
55 void ScatterPresenter::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/, QWidget */*widget*/)
61 void ScatterPresenter::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/, QWidget */*widget*/)
56 {
62 {
57 painter->save();
63 painter->save();
58 painter->setClipRect(m_boundingRect);
64 painter->setClipRect(m_boundingRect);
59
65
60 // TODO: how to draw a drop shadow?
66 // TODO: how to draw a drop shadow?
61 // Now using a custom implementation for drop shadow instead of QGraphicsDropShadowEffect.
67 // Now using a custom implementation for drop shadow instead of QGraphicsDropShadowEffect.
62 // It seems QGraphicsDropShadowEffect is quite heavy, at least on windows without open gl.
68 // It seems QGraphicsDropShadowEffect is quite heavy, at least on windows without open gl.
63 QPen dropShadowPen(QColor(0, 0, 0, 70));
69 QPen dropShadowPen(QColor(0, 0, 0, 70));
64 dropShadowPen.setWidth(3);
70 dropShadowPen.setWidth(3);
65 painter->setPen(dropShadowPen);
71 painter->setPen(dropShadowPen);
66 painter->setBrush(dropShadowPen.color());
72 painter->setBrush(dropShadowPen.color());
67 // painter->setRenderHint(QPainter::Antialiasing);
73 // painter->setRenderHint(QPainter::Antialiasing);
68 painter->drawPath(m_path.translated(2, 2));
74 painter->drawPath(m_path.translated(2, 2));
69
75
70 // Paint the shape
76 // Paint the shape
71 // The custom settings in series override those defined by the theme
77 // The custom settings in series override those defined by the theme
72 QPen pen = m_markerPen;
78 QPen pen = m_markerPen;
73 if (m_series->pen().color().isValid())
79 if (m_series->pen().color().isValid())
74 pen = m_series->pen();
80 pen = m_series->pen();
75 painter->setPen(pen);
81 painter->setPen(pen);
76 if (m_series->brush().color().isValid())
82 if (m_series->brush().color().isValid())
77 painter->setBrush(m_series->brush());
83 painter->setBrush(m_series->brush());
78 else
84 else
79 painter->setBrush(m_markerBrush);
85 painter->setBrush(m_markerBrush);
80
86
81 // If either pen or brush is opaque, we need to draw the polygons one-by-one
87 // If either pen or brush is opaque, we need to draw the polygons one-by-one
82 if (painter->pen().color().alpha() < 255 || painter->brush().color().alpha() < 255) {
88 if (painter->pen().color().alpha() < 255 || painter->brush().color().alpha() < 255) {
83 foreach (QPolygonF pol, m_path.toSubpathPolygons())
89 foreach (QPolygonF pol, m_path.toSubpathPolygons())
84 painter->drawPolygon(pol);
90 painter->drawPolygon(pol);
85 } else {
91 } else {
86 painter->drawPath(m_path);
92 painter->drawPath(m_path);
87 }
93 }
88
94
89 painter->restore();
95 painter->restore();
90 }
96 }
91
97
92 void ScatterPresenter::mousePressEvent(QGraphicsSceneMouseEvent *event)
98 void ScatterPresenter::mousePressEvent(QGraphicsSceneMouseEvent *event)
93 {
99 {
94 // Empty implementation to grab mouse release events for this item
100 // Empty implementation to grab mouse release events for this item
95 Q_UNUSED(event)
101 Q_UNUSED(event)
96 }
102 }
97
103
98 void ScatterPresenter::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
104 void ScatterPresenter::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
99 {
105 {
100 QPointF clickedPoint(
106 QPointF clickedPoint(
101 m_visibleChartArea.m_minX + (event->lastPos().x() / m_boundingRect.width()) * m_visibleChartArea.spanX(),
107 m_minX + (event->lastPos().x() / m_boundingRect.width()) * (m_maxX-m_minX),
102 m_visibleChartArea.m_maxY - (event->lastPos().y() / m_boundingRect.height()) * m_visibleChartArea.spanY());
108 m_maxY - (event->lastPos().y() / m_boundingRect.height()) * (m_maxY-m_minY));
103 emit clicked(clickedPoint);
109 emit clicked(clickedPoint);
104 }
110 }
105
111
106 void ScatterPresenter::changeGeometry()
112 void ScatterPresenter::changeGeometry()
107 {
113 {
108 if (m_boundingRect.isValid()) {
114 if (m_boundingRect.isValid()) {
109 prepareGeometryChange();
115 prepareGeometryChange();
110 qreal scalex = m_boundingRect.width() / m_visibleChartArea.spanX();
116 qreal scalex = m_boundingRect.width() / (m_maxX-m_minX);
111 qreal scaley = m_boundingRect.height() / m_visibleChartArea.spanY();
117 qreal scaley = m_boundingRect.height() / (m_maxY-m_minY);
112
118
113 int shape = m_series->shape();
119 int shape = m_series->shape();
114 m_path = QPainterPath();
120 m_path = QPainterPath();
115 m_path.setFillRule(Qt::WindingFill);
121 m_path.setFillRule(Qt::WindingFill);
116 const qreal size = m_series->size();
122 const qreal size = m_series->size();
117
123
118 foreach (QPointF point, m_series->data()) {
124 foreach (QPointF point, m_series->data()) {
119 // Convert relative coordinates to absolute pixel coordinates that can be used for drawing
125 // Convert relative coordinates to absolute pixel coordinates that can be used for drawing
120 qreal x = point.x() * scalex - m_visibleChartArea.m_minX * scalex - size / 2;
126 qreal x = point.x() * scalex - m_minX * scalex - size / 2;
121 qreal y = m_boundingRect.height() - point.y() * scaley + m_visibleChartArea.m_minY * scaley - size / 2;
127 qreal y = m_boundingRect.height() - point.y() * scaley + m_minY * scaley - size / 2;
122
128
123 if (x < scene()->width() && y < scene()->height()) {
129 if (x < scene()->width() && y < scene()->height()) {
124 switch (shape) {
130 switch (shape) {
125 case QScatterSeries::MarkerShapeDefault:
131 case QScatterSeries::MarkerShapeDefault:
126 // Fallthrough, defaults to circle
132 // Fallthrough, defaults to circle
127 case QScatterSeries::MarkerShapeCircle:
133 case QScatterSeries::MarkerShapeCircle:
128 m_path.addEllipse(x, y, size, size);
134 m_path.addEllipse(x, y, size, size);
129 break;
135 break;
130 case QScatterSeries::MarkerShapeRectangle:
136 case QScatterSeries::MarkerShapeRectangle:
131 m_path.addRect(x, y, size, size);
137 m_path.addRect(x, y, size, size);
132 break;
138 break;
133 case QScatterSeries::MarkerShapeTiltedRectangle: {
139 case QScatterSeries::MarkerShapeTiltedRectangle: {
134 // TODO: tilt the rectangle
140 // TODO: tilt the rectangle
135 m_path.addRect(x, y, size, size);
141 m_path.addRect(x, y, size, size);
136 break;
142 break;
137 }
143 }
138 default:
144 default:
139 // TODO: implement the rest of the shapes
145 // TODO: implement the rest of the shapes
140 Q_ASSERT(false);
146 Q_ASSERT(false);
141 break;
147 break;
142 }
148 }
143 }
149 }
144 }
150 }
145 }
151 }
146 }
152 }
147
153
148 #include "moc_scatterpresenter_p.cpp"
154 #include "moc_scatterpresenter_p.cpp"
149
155
150 QTCOMMERCIALCHART_END_NAMESPACE
156 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,47 +1,51
1 #ifndef SCATTERPRESENTER_H
1 #ifndef SCATTERPRESENTER_H
2 #define SCATTERPRESENTER_H
2 #define SCATTERPRESENTER_H
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include "chartitem_p.h"
5 #include "chartitem_p.h"
6 #include <QObject>
6 #include <QObject>
7 #include <QPen>
7 #include <QPen>
8
8
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10
10
11 class QScatterSeries;
11 class QScatterSeries;
12
12
13 class ScatterPresenter : public QObject, public ChartItem
13 class ScatterPresenter : public QObject, public ChartItem
14 {
14 {
15 Q_OBJECT
15 Q_OBJECT
16 public:
16 public:
17 explicit ScatterPresenter(QScatterSeries *series, QGraphicsObject *parent = 0);
17 explicit ScatterPresenter(QScatterSeries *series, QGraphicsObject *parent = 0);
18
18
19 public: // from ChartItem
19 public: // from ChartItem
20 QRectF boundingRect() const { return m_path.controlPointRect(); }
20 QRectF boundingRect() const { return m_path.controlPointRect(); }
21 QPainterPath shape() const { return m_path; }
21 QPainterPath shape() const { return m_path; }
22 void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
22 void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
23 void mousePressEvent (QGraphicsSceneMouseEvent * event);
23 void mousePressEvent (QGraphicsSceneMouseEvent * event);
24 void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
24 void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
25
25
26 Q_SIGNALS:
26 Q_SIGNALS:
27 void clicked(QPointF coordinates);
27 void clicked(QPointF coordinates);
28
28
29 public Q_SLOTS:
29 public Q_SLOTS:
30 void handleDomainChanged(const Domain& domain);
30 void handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY);
31 void handleGeometryChanged(const QRectF& rect);
31 void handleGeometryChanged(const QRectF& rect);
32 void handleModelChanged();
32 void handleModelChanged();
33
33
34 public:
34 public:
35 void changeGeometry();
35 void changeGeometry();
36
36
37 qreal m_minX;
38 qreal m_maxX;
39 qreal m_minY;
40 qreal m_maxY;
37 QScatterSeries *m_series;
41 QScatterSeries *m_series;
38 QRectF m_boundingRect;
42 QRectF m_boundingRect;
39 Domain m_visibleChartArea;
40 QPen m_markerPen;
43 QPen m_markerPen;
41 QBrush m_markerBrush;
44 QBrush m_markerBrush;
42 QPainterPath m_path;
45 QPainterPath m_path;
46
43 };
47 };
44
48
45 QTCOMMERCIALCHART_END_NAMESPACE
49 QTCOMMERCIALCHART_END_NAMESPACE
46
50
47 #endif // SCATTERPRESENTER_H
51 #endif // SCATTERPRESENTER_H
@@ -1,77 +1,77
1 #include "splinepresenter_p.h"
1 #include "splinepresenter_p.h"
2 #include <QPainter>
2 #include <QPainter>
3
3
4 QTCOMMERCIALCHART_BEGIN_NAMESPACE
4 QTCOMMERCIALCHART_BEGIN_NAMESPACE
5
5
6 SplinePresenter::SplinePresenter(QSplineSeries* series, QGraphicsObject *parent) :
6 SplinePresenter::SplinePresenter(QSplineSeries* series, QGraphicsObject *parent) :
7 LineChartItem(0, series, parent)//,m_boundingRect()
7 LineChartItem(series, parent)//,m_boundingRect()
8 {
8 {
9 //
9 //
10 }
10 }
11
11
12
12
13
13
14 QPointF SplinePresenter::calculateGeometryControlPoint(int index) const
14 QPointF SplinePresenter::calculateGeometryControlPoint(int index) const
15 {
15 {
16 QSplineSeries* splineSeries = qobject_cast<QSplineSeries*>(m_series);
16 QSplineSeries* splineSeries = qobject_cast<QSplineSeries*>(m_series);
17 const qreal deltaX = m_size.width()/m_domain.spanX();
17 const qreal deltaX = m_size.width()/(m_maxX-m_minX);
18 const qreal deltaY = m_size.height()/m_domain.spanY();
18 const qreal deltaY = m_size.height()/(m_maxY-m_minY);
19 qreal x = (splineSeries->controlPoint(index).x() - m_domain.m_minX)* deltaX;
19 qreal x = (splineSeries->controlPoint(index).x() - m_minX)* deltaX;
20 qreal y = (splineSeries->controlPoint(index).y() - m_domain.m_minY)*-deltaY + m_size.height();
20 qreal y = (splineSeries->controlPoint(index).y() - m_minY)*-deltaY + m_size.height();
21 return QPointF(x,y);
21 return QPointF(x,y);
22 }
22 }
23
23
24 void SplinePresenter::applyGeometry(QVector<QPointF>& points)
24 void SplinePresenter::applyGeometry(QVector<QPointF>& points)
25 {
25 {
26 if(points.size()==0) return;
26 if(points.size()==0) return;
27
27
28 QPainterPath splinePath;
28 QPainterPath splinePath;
29 const QPointF& point = points.at(0);
29 const QPointF& point = points.at(0);
30 splinePath.moveTo(point);
30 splinePath.moveTo(point);
31
31
32 // QSplineSeries* splineSeries = qobject_cast<QSplineSeries*>(m_series);
32 // QSplineSeries* splineSeries = qobject_cast<QSplineSeries*>(m_series);
33 for (int i = 0; i < points.size() - 1; i++)
33 for (int i = 0; i < points.size() - 1; i++)
34 {
34 {
35 const QPointF& point = points.at(i + 1);
35 const QPointF& point = points.at(i + 1);
36 splinePath.cubicTo(calculateGeometryControlPoint(2 * i), calculateGeometryControlPoint(2 * i + 1), point);
36 splinePath.cubicTo(calculateGeometryControlPoint(2 * i), calculateGeometryControlPoint(2 * i + 1), point);
37 }
37 }
38
38
39
39
40
40
41 prepareGeometryChange();
41 prepareGeometryChange();
42 m_path = splinePath;
42 m_path = splinePath;
43 m_rect = splinePath.boundingRect();
43 m_rect = splinePath.boundingRect();
44 }
44 }
45
45
46 void SplinePresenter::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
46 void SplinePresenter::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
47 {
47 {
48 Q_UNUSED(widget);
48 Q_UNUSED(widget);
49 Q_UNUSED(option);
49 Q_UNUSED(option);
50 painter->save();
50 painter->save();
51 painter->setPen(m_pen);
51 painter->setPen(m_pen);
52 painter->setClipRect(m_clipRect);
52 painter->setClipRect(m_clipRect);
53 painter->drawPath(m_path);
53 painter->drawPath(m_path);
54
54
55 QSplineSeries* splineSeries = qobject_cast<QSplineSeries*>(m_series);
55 QSplineSeries* splineSeries = qobject_cast<QSplineSeries*>(m_series);
56 for (int i = 0; i < splineSeries->count() - 1; i++)
56 for (int i = 0; i < splineSeries->count() - 1; i++)
57 {
57 {
58 painter->setPen(Qt::red);
58 painter->setPen(Qt::red);
59 painter->drawEllipse(m_points[i], 2, 2);
59 painter->drawEllipse(m_points[i], 2, 2);
60
60
61 painter->setPen(Qt::blue);
61 painter->setPen(Qt::blue);
62 // painter->drawLine(m_series->at(i), m_series->controlPoint(2 * i));
62 // painter->drawLine(m_series->at(i), m_series->controlPoint(2 * i));
63 // painter->drawLine(m_series->at(i + 1), m_series->controlPoint(2 * i + 1));
63 // painter->drawLine(m_series->at(i + 1), m_series->controlPoint(2 * i + 1));
64 // painter->drawEllipse(calculateGeometryControlPoint(2 * i), 4, 4);
64 // painter->drawEllipse(calculateGeometryControlPoint(2 * i), 4, 4);
65 // painter->drawEllipse(calculateGeometryControlPoint(2 * i + 1), 4, 4);
65 // painter->drawEllipse(calculateGeometryControlPoint(2 * i + 1), 4, 4);
66 }
66 }
67 if (m_points.count() > 0)
67 if (m_points.count() > 0)
68 {
68 {
69 painter->setPen(Qt::red);
69 painter->setPen(Qt::red);
70 painter->drawEllipse(m_points[m_points.count() - 1], 2, 2);
70 painter->drawEllipse(m_points[m_points.count() - 1], 2, 2);
71 }
71 }
72 painter->restore();
72 painter->restore();
73 }
73 }
74
74
75 #include "moc_splinepresenter_p.cpp"
75 #include "moc_splinepresenter_p.cpp"
76
76
77 QTCOMMERCIALCHART_END_NAMESPACE
77 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,2 +1,2
1 TEMPLATE = subdirs
1 TEMPLATE = subdirs
2 SUBDIRS += chartdataset No newline at end of file
2 SUBDIRS += chartdataset domain No newline at end of file
This diff has been collapsed as it changes many lines, (659 lines changed) Show them Hide them
@@ -1,614 +1,277
1 #include <QtTest/QtTest>
1 #include <QtTest/QtTest>
2 #include <qchartaxis.h>
2 #include <qchartaxis.h>
3 #include <qlineseries.h>
3 #include <qlineseries.h>
4 #include <private/chartdataset_p.h>
4 #include <private/chartdataset_p.h>
5 #include <private/domain_p.h>
5 #include <private/domain_p.h>
6
6
7 QTCOMMERCIALCHART_USE_NAMESPACE
7 QTCOMMERCIALCHART_USE_NAMESPACE
8
8
9 Q_DECLARE_METATYPE(Domain)
9 Q_DECLARE_METATYPE(Domain*)
10 Q_DECLARE_METATYPE(QChartAxis*)
10 Q_DECLARE_METATYPE(QChartAxis*)
11 Q_DECLARE_METATYPE(QSeries*)
11 Q_DECLARE_METATYPE(QSeries*)
12 Q_DECLARE_METATYPE(QLineSeries*)
12 Q_DECLARE_METATYPE(QLineSeries*)
13
13
14 class tst_ChartDataSet: public QObject {
14 class tst_ChartDataSet: public QObject {
15 Q_OBJECT
15 Q_OBJECT
16
16
17 public slots:
17 public slots:
18 void initTestCase();
18 void initTestCase();
19 void cleanupTestCase();
19 void cleanupTestCase();
20 void init();
20 void init();
21 void cleanup();
21 void cleanup();
22
22
23 private slots:
23 private slots:
24 void chartdataset_data();
24 void chartdataset_data();
25 void chartdataset();
25 void chartdataset();
26
26
27 void addDomain_data();
28 void addDomain();
29 void addSeries_data();
27 void addSeries_data();
30 void addSeries();
28 void addSeries();
31 void axisY_data();
32 void axisY();
33 void clearDomains_data();
34 void clearDomains();
35 void domain_data();
36 void domain();
37 void nextpreviousDomain_data();
38 void nextpreviousDomain();
39 void removeSeries_data();
29 void removeSeries_data();
40 void removeSeries();
30 void removeSeries();
41 void removeAllSeries_data();
31 void removeAllSeries_data();
42 void removeAllSeries();
32 void removeAllSeries();
33 void axisY_data();
34 void axisY();
35
43 };
36 };
44
37
45 void tst_ChartDataSet::initTestCase()
38 void tst_ChartDataSet::initTestCase()
46 {
39 {
47 qRegisterMetaType<Domain>("Domain");
40 qRegisterMetaType<Domain*>();
48 qRegisterMetaType<QChartAxis*>();
41 qRegisterMetaType<QChartAxis*>();
49 qRegisterMetaType<QSeries*>();
42 qRegisterMetaType<QSeries*>();
50 }
43 }
51
44
52 void tst_ChartDataSet::cleanupTestCase()
45 void tst_ChartDataSet::cleanupTestCase()
53 {
46 {
54 }
47 }
55
48
56 void tst_ChartDataSet::init()
49 void tst_ChartDataSet::init()
57 {
50 {
58 }
51 }
59
52
60 void tst_ChartDataSet::cleanup()
53 void tst_ChartDataSet::cleanup()
61 {
54 {
62 }
55 }
63
56
64 void tst_ChartDataSet::chartdataset_data()
57 void tst_ChartDataSet::chartdataset_data()
65 {
58 {
66 }
59 }
67
60
68 void tst_ChartDataSet::chartdataset()
61 void tst_ChartDataSet::chartdataset()
69 {
62 {
70 ChartDataSet dataSet;
63 ChartDataSet dataSet;
71 QVERIFY2(dataSet.axisX(), "Missing axisX.");
64 QVERIFY2(dataSet.axisX(), "Missing axisX.");
72 QVERIFY2(dataSet.axisY(), "Missing axisY.");
65 QVERIFY2(dataSet.axisY(), "Missing axisY.");
73 //check if not dangling pointer
66 //check if not dangling pointer
74 dataSet.axisX()->objectName();
67 dataSet.axisX()->objectName();
75 dataSet.axisY()->objectName();
68 dataSet.axisY()->objectName();
76 QVERIFY(dataSet.domain(dataSet.axisX())==Domain());
77 QVERIFY(dataSet.domain(dataSet.axisY())==Domain());
78 QCOMPARE(dataSet.domainIndex(), 0);
79 }
80
81 void tst_ChartDataSet::addDomain_data()
82 {
83 QTest::addColumn<QRectF>("rect");
84 QTest::addColumn<QRectF>("viewport");
85 QTest::newRow("400x400,1000x1000") << QRectF(200, 200, 600, 600)
86 << QRectF(0, 0, 1000, 1000);
87 QTest::newRow("600x600,1000x1000") << QRectF(100, 100, 700, 700)
88 << QRectF(0, 0, 1000, 1000);
89 QTest::newRow("200x200,1000x1000") << QRectF(400, 400, 600, 600)
90 << QRectF(0, 0, 1000, 1000);
91 }
92
93 void tst_ChartDataSet::addDomain()
94 {
95 QFETCH(QRectF, rect);
96 QFETCH(QRectF, viewport);
97
98 ChartDataSet dataSet;
99
100 Domain domain1(0, 1000, 0, 1000);
101 QLineSeries series;
102 series.add(0, 0);
103 series.add(1000, 1000);
104
105 dataSet.addSeries(&series);
106
107 QCOMPARE(dataSet.domainIndex(), 0);
108
109 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*)));
110 QSignalSpy spy1(&dataSet,
111 SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&)));
112 QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
113 QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*)));
114 QSignalSpy spy4(&dataSet,
115 SIGNAL(seriesDomainChanged(QSeries*, Domain const&)));
116 QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
117
118 Domain domain2 = dataSet.domain(dataSet.axisY());
119 QVERIFY(domain1 == domain2);
120
121 dataSet.addDomain(rect, viewport);
122 QCOMPARE(dataSet.domainIndex(), 1);
123 Domain domain3 = dataSet.domain(dataSet.axisY());
124 Domain domain4 = domain1.subDomain(rect, viewport.width(),
125 viewport.height());
126 QVERIFY(domain3 == domain4);
127
128 QCOMPARE(spy0.count(), 0);
129 QCOMPARE(spy1.count(), 2);
130 QCOMPARE(spy2.count(), 0);
131 QCOMPARE(spy3.count(), 0);
132 QCOMPARE(spy4.count(), 1);
133 QCOMPARE(spy5.count(), 0);
134 }
69 }
135
70
136 void tst_ChartDataSet::addSeries_data()
71 void tst_ChartDataSet::addSeries_data()
137 {
72 {
138 QTest::addColumn<int>("defaultAxisCount");
73 QTest::addColumn<QLineSeries*>("series0");
139 QTest::addColumn<int>("firstAxisCount");
74 QTest::addColumn<QChartAxis*>("axis0");
140 QTest::addColumn<int>("secoundAxisCount");
75 QTest::addColumn<QLineSeries*>("series1");
141 QTest::newRow("2 ,1 ,0") << 2 << 1 << 0;
76 QTest::addColumn<QChartAxis*>("axis1");
142 QTest::newRow("2 series, 2 new axis") << 2 << 0 << 2;
77 QTest::addColumn<QLineSeries*>("series2");
143 QTest::newRow("2 series, 1 new axis") << 2 << 0 << 2;
78 QTest::addColumn<QChartAxis*>("axis2");
144 QTest::newRow("3 series, 3 new axis") << 3 << 0 << 3;
79 QTest::addColumn<int>("axisCount");
145 QTest::newRow("3 series, 2 new axis") << 3 << 0 << 2;
80
146 QTest::newRow("3 series, 1 new axis") << 3 << 0 << 1;
81 QLineSeries* series0 = new QLineSeries(this);
147 QTest::newRow("3 series, default + 1 new axis") << 3 << 0 << 1;
82 QLineSeries* series1 = new QLineSeries(this);
83 QLineSeries* series2 = new QLineSeries(this);
84
85 QChartAxis* axis0 = new QChartAxis(this);
86 QChartAxis* axis1 = new QChartAxis(this);
87 QChartAxis* axis2 = new QChartAxis(this);
88
89 QTest::newRow("default axis Y: series0,series1,series2") << series0 << (QChartAxis*)0 << series1 << (QChartAxis*)0 << series2 << (QChartAxis*)0 << 2;
90 QTest::newRow("default axis Y: series0, axis 0: series1,series2") << series0 << (QChartAxis*)0 << series1 << axis0 << series2 << axis0 << 3;
91 QTest::newRow("axis0: series0, axis1: series1, axis2: series2") << series0 << axis0 << series1 << axis1 << series2 << axis2 << 4;
148 }
92 }
149
93
150 void tst_ChartDataSet::addSeries()
94 void tst_ChartDataSet::addSeries()
151 {
95 {
152 QFETCH(int, defaultAxisCount);
96 QFETCH(QLineSeries*, series0);
153 QFETCH(int, firstAxisCount);
97 QFETCH(QChartAxis*, axis0);
154 QFETCH(int, secoundAxisCount);
98 QFETCH(QLineSeries*, series1);
99 QFETCH(QChartAxis*, axis1);
100 QFETCH(QLineSeries*, series2);
101 QFETCH(QChartAxis*, axis2);
102 QFETCH(int, axisCount);
155
103
156 ChartDataSet dataSet;
104 ChartDataSet dataSet;
157
105
158 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*)));
106 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*,Domain*)));
159 QSignalSpy spy1(&dataSet, SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&)));
107 QSignalSpy spy1(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
160 QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
108 QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*)));
161 QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*)));
109 QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
162 QSignalSpy spy4(&dataSet, SIGNAL(seriesDomainChanged(QSeries*, Domain const&)));
163 QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
164
165 for (int i = 0; i < defaultAxisCount; i++) {
166 QLineSeries* series = new QLineSeries();
167 dataSet.addSeries(series);
168 }
169
170 QChartAxis* firstAxis = new QChartAxis();
171
110
172 for (int i = 0; i < firstAxisCount; i++) {
111 dataSet.addSeries(series0,axis0);
173 QLineSeries* series = new QLineSeries();
112 dataSet.addSeries(series1,axis1);
174 dataSet.addSeries(series, firstAxis);
113 dataSet.addSeries(series2,axis2);
175 }
176
177 QChartAxis* secoundAxis = new QChartAxis();
178
179 for (int i = 0; i < secoundAxisCount; i++) {
180 QLineSeries* series = new QLineSeries();
181 dataSet.addSeries(series, secoundAxis);
182 }
183
184 int axisCount = 1;
185
186 if (defaultAxisCount > 0)
187 axisCount++;
188 if (firstAxisCount > 0)
189 axisCount++;
190 if (secoundAxisCount > 0)
191 axisCount++;
192
114
193 QCOMPARE(spy0.count(), axisCount);
115 QCOMPARE(spy0.count(), axisCount);
194 QCOMPARE(spy1.count(), (defaultAxisCount + firstAxisCount + secoundAxisCount)*2);
116 QCOMPARE(spy1.count(), 0);
195 QCOMPARE(spy2.count(), 0);
117 QCOMPARE(spy2.count(), 3);
196 QCOMPARE(spy3.count(), defaultAxisCount + firstAxisCount + secoundAxisCount);
118 QCOMPARE(spy3.count(), 0);
197
198 int i = 0;
199 while (defaultAxisCount) {
200 i+=defaultAxisCount;
201 defaultAxisCount--;
202 }
203 int j = 0;
204 while (firstAxisCount>0) {
205 j += firstAxisCount;
206 firstAxisCount--;
207 }
208 int k = 0;
209 while (secoundAxisCount>0) {
210 k += secoundAxisCount;
211 secoundAxisCount--;
212 }
213 QCOMPARE(spy4.count(),i + j + k);
214 QCOMPARE(spy5.count(), 0);
215
216 QCOMPARE(dataSet.domainIndex(), 0);
217 }
218
219 void tst_ChartDataSet::axisY_data()
220 {
221 QTest::addColumn<QChartAxis*>("axisY");
222 QTest::newRow("axisY1") << new QChartAxis();
223 QTest::newRow("axisY2") << new QChartAxis();
224 }
225
226 void tst_ChartDataSet::axisY()
227 {
228 QFETCH(QChartAxis*, axisY);
229
230 ChartDataSet dataSet;
231
232 QChartAxis* defaultAxisY = dataSet.axisY();
233
234 QVERIFY2(defaultAxisY, "Missing axisY.");
235
236 QLineSeries* series1 = new QLineSeries();
237 dataSet.addSeries(series1);
238
239 QLineSeries* series2 = new QLineSeries();
240 dataSet.addSeries(series2, axisY);
241
242 QVERIFY(dataSet.axisY(series1) == defaultAxisY);
243 QVERIFY(dataSet.axisY(series2) == axisY);
244
245
119
246 }
120 }
247
121
248 void tst_ChartDataSet::clearDomains_data()
122 void tst_ChartDataSet::removeSeries_data()
249 {
123 {
250 QTest::addColumn<int>("indexCount");
124 QTest::addColumn<QLineSeries*>("series0");
251 QTest::newRow("0") << 0;
125 QTest::addColumn<QChartAxis*>("axis0");
252 QTest::newRow("1") << 1;
126 QTest::addColumn<QLineSeries*>("series1");
253 QTest::newRow("5") << 2;
127 QTest::addColumn<QChartAxis*>("axis1");
254 QTest::newRow("8") << 3;
128 QTest::addColumn<QLineSeries*>("series2");
129 QTest::addColumn<QChartAxis*>("axis2");
130 QTest::addColumn<int>("axisCount");
131
132 QLineSeries* series0 = new QLineSeries(this);
133 QLineSeries* series1 = new QLineSeries(this);
134 QLineSeries* series2 = new QLineSeries(this);
135
136 QChartAxis* axis0 = new QChartAxis(this);
137 QChartAxis* axis1 = new QChartAxis(this);
138 QChartAxis* axis2 = new QChartAxis(this);
139
140 QTest::newRow("default axis Y: series0,series1,series2") << series0 << (QChartAxis*) 0
141 << series1 << (QChartAxis*) 0 << series2 << (QChartAxis*) 0 << 2;
142 QTest::newRow("default axis Y: series0, axis 0: series1,series2") << series0 << (QChartAxis*) 0
143 << series1 << axis0 << series2 << axis0 << 3;
144 QTest::newRow("axis0: series0, axis1: series1, axis2: series2") << series0 << axis0 << series1
145 << axis1 << series2 << axis2 << 4;
255 }
146 }
256
147
257 void tst_ChartDataSet::clearDomains()
148 void tst_ChartDataSet::removeSeries()
258 {
149 {
259 QFETCH(int, indexCount);
150 QFETCH(QLineSeries*, series0);
260
151 QFETCH(QChartAxis*, axis0);
261 Domain domain1(0, 100, 0, 100);
152 QFETCH(QLineSeries*, series1);
262 QLineSeries* series = new QLineSeries();
153 QFETCH(QChartAxis*, axis1);
263 series->add(0, 0);
154 QFETCH(QLineSeries*, series2);
264 series->add(100, 100);
155 QFETCH(QChartAxis*, axis2);
156 QFETCH(int, axisCount);
265
157
266 ChartDataSet dataSet;
158 ChartDataSet dataSet;
267
268 QCOMPARE(dataSet.domainIndex(), 0);
269
270 dataSet.addSeries(series);
271
272 Domain domain2 = dataSet.domain(dataSet.axisY());
273
274 QVERIFY(domain2 == domain1);
275
276 QList<Domain> domains;
277
278 domains << domain1;
279
280 for (int i = 0; i < indexCount; i++) {
281 dataSet.addDomain(QRect(0, 0, 10, 10), QRect(0, 0, 100, 100));
282 domains << dataSet.domain(dataSet.axisY());
283 }
284
285 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*)));
286 QSignalSpy spy1(&dataSet,
287 SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&)));
288 QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
289 QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*)));
290 QSignalSpy spy4(&dataSet,
291 SIGNAL(seriesDomainChanged(QSeries*, Domain const&)));
292 QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
293
294 dataSet.clearDomains(indexCount);
295
159
296 QCOMPARE(dataSet.domainIndex(), indexCount);
160 dataSet.addSeries(series0,axis0);
161 dataSet.addSeries(series1,axis1);
162 dataSet.addSeries(series2,axis2);
297
163
298 domain2 = dataSet.domain(dataSet.axisY());
164 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*,Domain*)));
165 QSignalSpy spy1(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
166 QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*)));
167 QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
299
168
300 QVERIFY(domain2 == domains.at(indexCount));
169 dataSet.removeSeries(series0);
170 dataSet.removeSeries(series1);
171 dataSet.removeSeries(series2);
301
172
302 QCOMPARE(spy0.count(), 0);
173 QCOMPARE(spy0.count(), 0);
303 QCOMPARE(spy1.count(), 0);
174 QCOMPARE(spy1.count(), axisCount);
304 QCOMPARE(spy2.count(), 0);
175 QCOMPARE(spy2.count(), 0);
305 QCOMPARE(spy3.count(), 0);
176 QCOMPARE(spy3.count(), 3);
306 QCOMPARE(spy4.count(), 0);
307 QCOMPARE(spy5.count(), 0);
308 }
177 }
309
178
310 void tst_ChartDataSet::domain_data()
179 void tst_ChartDataSet::removeAllSeries_data()
311 {
180 {
312 QTest::addColumn<Domain>("domain1");
181 QTest::addColumn<QLineSeries*>("series0");
313 QTest::addColumn<Domain>("domain2");
182 QTest::addColumn<QChartAxis*>("axis0");
314 QTest::addColumn<Domain>("domain3");
183 QTest::addColumn<QLineSeries*>("series1");
315 QTest::addColumn<Domain>("domain");
184 QTest::addColumn<QChartAxis*>("axis1");
316 QTest::newRow("Domain(0,10,0,10)") << Domain(0, 10, 0, 10)
185 QTest::addColumn<QLineSeries*>("series2");
317 << Domain(0, 5, 0, 5) << Domain(0, 3, 0, 3) << Domain(0, 10, 0, 10);
186 QTest::addColumn<QChartAxis*>("axis2");
318 QTest::newRow("Domain(-1,11,0,11)") << Domain(-1, 10, 0, 10)
187 QTest::addColumn<int>("axisCount");
319 << Domain(0, 11, 0, 11) << Domain(0, 3, 0, 3)
188
320 << Domain(-1, 11, 0, 11);
189 QLineSeries* series0 = new QLineSeries(this);
321 QTest::newRow("Domain(-5,5,1,8)") << Domain(-5, 0, 1, 1)
190 QLineSeries* series1 = new QLineSeries(this);
322 << Domain(0, 5, 0, 8) << Domain(1, 2, 1, 2) << Domain(-5, 5, 0, 8);
191 QLineSeries* series2 = new QLineSeries(this);
192
193 QChartAxis* axis0 = new QChartAxis(this);
194 QChartAxis* axis1 = new QChartAxis(this);
195 QChartAxis* axis2 = new QChartAxis(this);
196
197 QTest::newRow("default axis Y: series0,series1,series2") << series0 << (QChartAxis*) 0
198 << series1 << (QChartAxis*) 0 << series2 << (QChartAxis*) 0 << 2;
199 QTest::newRow("default axis Y: series0, axis 0: series1,series2") << series0 << (QChartAxis*) 0
200 << series1 << axis0 << series2 << axis0 << 3;
201 QTest::newRow("axis0: series0, axis1: series1, axis2: series2") << series0 << axis0 << series1
202 << axis1 << series2 << axis2 << 4;
323 }
203 }
324
204
325 void tst_ChartDataSet::domain()
205 void tst_ChartDataSet::removeAllSeries()
326 {
206 {
327 QFETCH(Domain, domain1);
207 QFETCH(QLineSeries*, series0);
328 QFETCH(Domain, domain2);
208 QFETCH(QChartAxis*, axis0);
329 QFETCH(Domain, domain3);
209 QFETCH(QLineSeries*, series1);
330 QFETCH(Domain, domain);
210 QFETCH(QChartAxis*, axis1);
331
211 QFETCH(QLineSeries*, series2);
332 ChartDataSet dataSet;
212 QFETCH(QChartAxis*, axis2);
333 QLineSeries* series1 = new QLineSeries();
213 QFETCH(int, axisCount);
334 series1->add(domain1.m_minX, domain1.m_minY);
214
335 series1->add(domain1.m_maxX, domain1.m_maxY);
215 ChartDataSet dataSet;
336 QLineSeries* series2 = new QLineSeries();
216
337 series2->add(domain2.m_minX, domain2.m_minY);
217 dataSet.addSeries(series0,axis0);
338 series2->add(domain2.m_maxX, domain2.m_maxY);
218 dataSet.addSeries(series1,axis1);
339 QLineSeries* series3 = new QLineSeries();
219 dataSet.addSeries(series2,axis2);
340 series3->add(domain3.m_minX, domain3.m_minY);
220
341 series3->add(domain3.m_maxX, domain3.m_maxY);
221 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*,Domain*)));
342
222 QSignalSpy spy1(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
343 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*)));
223 QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*)));
344 QSignalSpy spy1(&dataSet,
224 QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
345 SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&)));
225
346 QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
226 dataSet.removeAllSeries();
347 QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*)));
227
348 QSignalSpy spy4(&dataSet,
228 QCOMPARE(spy0.count(), 0);
349 SIGNAL(seriesDomainChanged(QSeries*, Domain const&)));
229 QCOMPARE(spy1.count(), axisCount);
350 QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
230 QCOMPARE(spy2.count(), 0);
351
231 QCOMPARE(spy3.count(), 3);
352 dataSet.addSeries(series1);
353 dataSet.addSeries(series2);
354 dataSet.addSeries(series3);
355
356 QCOMPARE(dataSet.domainIndex(), 0);
357 QVERIFY2(dataSet.domain(dataSet.axisY()) == domain, "Domain not equal");
358
359 QCOMPARE(spy0.count(), 2);
360 QCOMPARE(spy1.count(), 6);
361 QCOMPARE(spy2.count(), 0);
362 QCOMPARE(spy3.count(), 3);
363 QCOMPARE(spy4.count(), 6);
364 QCOMPARE(spy5.count(), 0);
365 }
232 }
366
233
367 void tst_ChartDataSet::nextpreviousDomain_data()
368 {
369 QTest::addColumn<QRectF>("rect");
370 QTest::addColumn<QRectF>("viewport");
371 QTest::newRow("400x400,1000x1000") << QRectF(200, 200, 600, 600)
372 << QRectF(0, 0, 1000, 1000);
373 QTest::newRow("600x600,1000x1000") << QRectF(100, 100, 700, 700)
374 << QRectF(0, 0, 1000, 1000);
375 QTest::newRow("200x200,1000x1000") << QRectF(400, 400, 600, 600)
376 << QRectF(0, 0, 1000, 1000);
377 }
378
234
379 void tst_ChartDataSet::nextpreviousDomain()
235 void tst_ChartDataSet::axisY_data()
380 {
236 {
381
237 QTest::addColumn<QChartAxis*>("axis0");
382 QFETCH(QRectF, rect);
238 QTest::addColumn<QChartAxis*>("axis1");
383 QFETCH(QRectF, viewport);
239 QTest::addColumn<QChartAxis*>("axis2");
384
240 QTest::newRow("1 defualt, 2 optional") << (QChartAxis*)0 << new QChartAxis() << new QChartAxis();
385 ChartDataSet dataSet;
241 QTest::newRow("3 optional") << new QChartAxis() << new QChartAxis() << new QChartAxis();
386
387 Domain domain1(0, 1000, 0, 1000);
388 QLineSeries* series = new QLineSeries();
389 series->add(0, 0);
390 series->add(1000, 1000);
391
392 dataSet.addSeries(series);
393
394 QCOMPARE(dataSet.domainIndex(), 0);
395
396 Domain domain2 = dataSet.domain(dataSet.axisY());
397 QVERIFY(domain1 == domain2);
398
399 dataSet.addDomain(rect, viewport);
400 QCOMPARE(dataSet.domainIndex(), 1);
401 Domain domain3 = dataSet.domain(dataSet.axisY());
402 Domain domain4 = domain1.subDomain(rect, viewport.width(),
403 viewport.height());
404 QVERIFY(domain3 == domain4);
405
406 dataSet.addDomain(rect, viewport);
407 QCOMPARE(dataSet.domainIndex(), 2);
408 Domain domain5 = dataSet.domain(dataSet.axisY());
409 Domain domain6 = domain3.subDomain(rect, viewport.width(),
410 viewport.height());
411 QVERIFY(domain5 == domain6);
412
413 dataSet.addDomain(rect, viewport);
414 QCOMPARE(dataSet.domainIndex(), 3);
415 Domain domain7 = dataSet.domain(dataSet.axisY());
416 Domain domain8 = domain5.subDomain(rect, viewport.width(),
417 viewport.height());
418 QVERIFY(domain7 == domain8);
419
420 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*)));
421 QSignalSpy spy1(&dataSet,
422 SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&)));
423 QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
424 QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*)));
425 QSignalSpy spy4(&dataSet,
426 SIGNAL(seriesDomainChanged(QSeries*, Domain const&)));
427 QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
428
429 Domain domain;
430
431 bool previous = dataSet.previousDomain();
432 QCOMPARE(previous, true);
433 QCOMPARE(dataSet.domainIndex(), 2);
434 domain = dataSet.domain(dataSet.axisY());
435 QVERIFY(domain == domain5);
436 previous = dataSet.previousDomain();
437 QCOMPARE(previous, true);
438 QCOMPARE(dataSet.domainIndex(), 1);
439 domain = dataSet.domain(dataSet.axisY());
440 QVERIFY(domain == domain3);
441 previous = dataSet.previousDomain();
442 QCOMPARE(previous, true);
443 QCOMPARE(dataSet.domainIndex(), 0);
444 domain = dataSet.domain(dataSet.axisY());
445 QVERIFY(domain == domain1);
446 previous = dataSet.previousDomain();
447 QCOMPARE(previous, false);
448 QCOMPARE(dataSet.domainIndex(), 0);
449 domain = dataSet.domain(dataSet.axisY());
450 QVERIFY(domain == domain1);
451
452 bool next = dataSet.nextDomain();
453 QCOMPARE(next, true);
454 QCOMPARE(dataSet.domainIndex(),1);
455 next = dataSet.nextDomain();
456 QCOMPARE(next, true);
457 QCOMPARE(dataSet.domainIndex(),2);
458 next = dataSet.nextDomain();
459 QCOMPARE(next, true);
460 QCOMPARE(dataSet.domainIndex(),3);
461 next = dataSet.nextDomain();
462 QCOMPARE(next, false);
463 QCOMPARE(dataSet.domainIndex(),3);
464
465
466 QCOMPARE(spy0.count(), 0);
467 QCOMPARE(spy1.count(), 12);
468 QCOMPARE(spy2.count(), 0);
469 QCOMPARE(spy3.count(), 0);
470 QCOMPARE(spy4.count(), 6);
471 QCOMPARE(spy5.count(), 0);
472 }
242 }
473
243
474 void tst_ChartDataSet::removeSeries_data()
244 void tst_ChartDataSet::axisY()
475 {
245 {
476 QTest::addColumn<int>("seriesCount");
246 QFETCH(QChartAxis*, axis0);
477 QTest::addColumn<int>("axisYCount");
247 QFETCH(QChartAxis*, axis1);
478 QTest::newRow("2 series, default axis") << 2 << 0;
248 QFETCH(QChartAxis*, axis2);
479 QTest::newRow("2 series, 2 new axis") << 2 << 2;
480 QTest::newRow("2 series, 1 new axis") << 2 << 2;
481 QTest::newRow("3 series, 3 new axis") << 3 << 3;
482 QTest::newRow("3 series, 2 new axis") << 3 << 2;
483 QTest::newRow("3 series, 1 new axis") << 3 << 1;
484 }
485
249
486 void tst_ChartDataSet::removeSeries()
250 ChartDataSet dataSet;
487 {
488 QFETCH(int, seriesCount);
489 QFETCH(int, axisYCount);
490
251
491 ChartDataSet dataSet;
252 QChartAxis* defaultAxisY = dataSet.axisY();
492
253
493 QList<QChartAxis*> axisList;
254 QVERIFY2(defaultAxisY, "Missing axisY.");
494 QList<QSeries*> seriesList;
495
496 for (int i = 0; i < axisYCount; i++) {
497 QChartAxis* axis = new QChartAxis();
498 axisList << axis;
499 }
500
501 QList<QChartAxis*>::iterator iterator = axisList.begin();
502
503 for (int i = 0; i < seriesCount; i++) {
504 QChartAxis* axisY = 0;
505 QLineSeries* series = new QLineSeries();
506 if (iterator != axisList.end()) {
507 axisY = *iterator;
508 iterator++;
509 } else if (axisList.count() > 0) {
510 iterator--;
511 axisY = *iterator;
512 iterator++;
513 }
514 dataSet.addSeries(series, axisY);
515 seriesList << series;
516 }
517
518 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*)));
519 QSignalSpy spy1(&dataSet,
520 SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&)));
521 QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
522 QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*)));
523 QSignalSpy spy4(&dataSet,
524 SIGNAL(seriesDomainChanged(QSeries*, Domain const&)));
525 QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
526
527 for (int i = 0; i < seriesCount; i++) {
528 dataSet.removeSeries(seriesList.at(i));
529 }
530
531 //default axis
532 if (axisYCount == 0)
533 axisYCount++;
534
535 QCOMPARE(spy0.count(), 0);
536 QCOMPARE(spy1.count(), 0);
537 QCOMPARE(spy2.count(), axisYCount);
538 QCOMPARE(spy3.count(), 0);
539 QCOMPARE(spy4.count(), 0);
540 QCOMPARE(spy5.count(), seriesCount);
541
542 QCOMPARE(dataSet.domainIndex(), 0);
543
544 qDeleteAll(seriesList);
545 }
546
255
547 void tst_ChartDataSet::removeAllSeries_data()
256 QLineSeries* series0 = new QLineSeries();
548 {
257 dataSet.addSeries(series0,axis0);
549 QTest::addColumn<int>("seriesCount");
550 QTest::addColumn<int>("axisYCount");
551 QTest::newRow("2 series, default axis") << 2 << 0;
552 QTest::newRow("2 series, 2 new axis") << 2 << 2;
553 QTest::newRow("2 series, 1 new axis") << 2 << 2;
554 QTest::newRow("3 series, 3 new axis") << 3 << 3;
555 QTest::newRow("3 series, 2 new axis") << 3 << 2;
556 QTest::newRow("3 series, 1 new axis") << 3 << 1;
557 }
558
258
559 void tst_ChartDataSet::removeAllSeries()
259 QLineSeries* series1 = new QLineSeries();
560 {
260 dataSet.addSeries(series1,axis1);
561 QFETCH(int, seriesCount);
562 QFETCH(int, axisYCount);
563
261
564 ChartDataSet dataSet;
262 QLineSeries* series2 = new QLineSeries();
263 dataSet.addSeries(series2,axis2);
565
264
566 QList<QChartAxis*> axisList;
265 if(!axis0) axis0=defaultAxisY ;
567
266 if(!axis1) axis1=defaultAxisY ;
568 for (int i = 0; i < axisYCount; i++) {
267 if(!axis2) axis2=defaultAxisY ;
569 QChartAxis* axis = new QChartAxis();
570 axisList << axis;
571 }
572
573 QList<QChartAxis*>::iterator iterator = axisList.begin();
574
575 for (int i = 0; i < seriesCount; i++) {
576 QChartAxis* axisY = 0;
577 QLineSeries* series = new QLineSeries();
578 if (iterator != axisList.end()) {
579 axisY = *iterator;
580 iterator++;
581 } else if (axisList.count() > 0) {
582 iterator--;
583 axisY = *iterator;
584 iterator++;
585 }
586 dataSet.addSeries(series, axisY);
587 }
588
589 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*)));
590 QSignalSpy spy1(&dataSet, SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&)));
591 QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
592 QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*)));
593 QSignalSpy spy4(&dataSet, SIGNAL(seriesDomainChanged(QSeries*, Domain const&)));
594 QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
595
596 dataSet.removeAllSeries();
597 //default axis
598 if (axisYCount == 0)
599 axisYCount++;
600
268
601 QCOMPARE(spy0.count(), 0);
269 QVERIFY(dataSet.axisY(series0) == axis0);
602 QCOMPARE(spy1.count(), 0);
270 QVERIFY(dataSet.axisY(series1) == axis1);
603 QCOMPARE(spy2.count(), axisYCount);
271 QVERIFY(dataSet.axisY(series2) == axis2);
604 QCOMPARE(spy3.count(), 0);
605 QCOMPARE(spy4.count(), 0);
606 QCOMPARE(spy5.count(), seriesCount);
607
272
608 QCOMPARE(dataSet.domainIndex(), 0);
609 }
273 }
610
274
611
612 QTEST_MAIN(tst_ChartDataSet)
275 QTEST_MAIN(tst_ChartDataSet)
613 #include "tst_chartdataset.moc"
276 #include "tst_chartdataset.moc"
614
277
General Comments 0
You need to be logged in to leave comments. Login now