##// END OF EJS Templates
Marek Rosa -
r269:05d1d227ed47 merge
parent child
Show More
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,44
1 #include($QTDIR/compat.qdocconf)
2 #include($QTDIR/qt-html-templates.qdocconf)
3 #include(C:/Qt/QtCommercialSdk/src/qt/480/tools/qdoc3/doc/files/qt.qdocconf)
4
5 project = QtCommercialCharts
6 description = Library for creating charts
7
8 sourcedirs = ../src \
9 ../example
10 headerdirs = ../src \
11 ../example
12 exampledirs = ../src \
13 ../example
14
15 HTML.templatedir = .
16 HTML.stylesheets = style/offline.css
17 HTML.headerstyles = \
18 " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/offline.css\" />\n"
19 sources.fileextensions = *.cpp *.qdoc *.mm *.qml
20 headers.fileextensions = *.h *.ch *.h++ *.hh *.hpp *.hxx
21 examples.fileextensions = *.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml
22 examples.imageextensions = *.png *.jpeg *.jpg *.gif *.mng
23 imagedirs = ./images
24 outputdir = ./html
25
26 Cpp.ignoretokens = QTCOMMERCIALCHART_EXPORT \
27 QTCOMMERCIALCHART_END_NAMESPACE \
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29 Cpp.ignoredirectives = Q_DECLARE_HANDLE \
30 Q_DECLARE_INTERFACE \
31 Q_DECLARE_METATYPE \
32 Q_DECLARE_OPERATORS_FOR_FLAGS \
33 Q_DECLARE_PRIVATE \
34 Q_DECLARE_PUBLIC \
35 Q_DECLARE_SHARED \
36 Q_DECLARE_TR_FUNCTIONS \
37 Q_DECLARE_TYPEINFO \
38 Q_DISABLE_COPY \
39 QT_FORWARD_DECLARE_CLASS \
40 Q_DUMMY_COMPARISON_OPERATOR \
41 Q_ENUMS \
42 Q_FLAGS \
43 Q_INTERFACES \
44 __attribute__ No newline at end of file
This diff has been collapsed as it changes many lines, (673 lines changed) Show them Hide them
@@ -0,0 +1,673
1 @media screen
2 {
3
4 /* basic elements */
5 html
6 {
7 color: #000000;
8 background: #FFFFFF;
9 }
10 table
11 {
12 border-collapse: collapse;
13 border-spacing: 0;
14 }
15 fieldset, img
16 {
17 border: 0;
18 max-width:100%;
19 }
20 address, caption, cite, code, dfn, em, strong, th, var, optgroup
21 {
22 font-style: inherit;
23 font-weight: inherit;
24 }
25 del, ins
26 {
27 text-decoration: none;
28 }
29 li
30 {
31 list-style: none;
32 }
33 ol li
34 {
35 list-style: decimal;
36 }
37 caption, th
38 {
39 text-align: left;
40 }
41 h1, h2, h3, h4, h5, h6
42 {
43 font-size: 100%;
44 }
45 q:before, q:after
46 {
47 content: '';
48 }
49 abbr, acronym
50 {
51 border: 0;
52 font-variant: normal;
53 }
54 sup, sub
55 {
56 vertical-align: baseline;
57 }
58 tt, .qmlreadonly span, .qmldefault span
59 {
60 word-spacing:0.5em;
61 }
62 legend
63 {
64 color: #000000;
65 }
66 strong
67 {
68 font-weight: bold;
69 }
70 em
71 {
72 font-style: italic;
73 }
74
75 body
76 {
77 margin-left: 0.5em;
78 margin-right: 0.5em;
79 }
80 a
81 {
82 color: #00732F;
83 text-decoration: none;
84 }
85 hr
86 {
87 background-color: #E6E6E6;
88 border: 1px solid #E6E6E6;
89 height: 1px;
90 width: 100%;
91 text-align: left;
92 margin: 1.5em 0 1.5em 0;
93 }
94
95 pre
96 {
97 border: 1px solid #DDDDDD;
98 -moz-border-radius: 0.7em 0.7em 0.7em 0.7em;
99 -webkit-border-radius: 0.7em 0.7em 0.7em 0.7em;
100 border-radius: 0.7em 0.7em 0.7em 0.7em;
101 margin: 0 1.5em 1em 1em;
102 padding: 1em 1em 1em 1em;
103 overflow-x: auto;
104 }
105 table, pre
106 {
107 -moz-border-radius: 0.7em 0.7em 0.7em 0.7em;
108 -webkit-border-radius: 0.7em 0.7em 0.7em 0.7em;
109 border-radius: 0.7em 0.7em 0.7em 0.7em;
110 background-color: #F6F6F6;
111 border: 1px solid #E6E6E6;
112 border-collapse: separate;
113 margin-bottom: 2.5em;
114 }
115 pre {
116 font-size: 90%;
117 display: block;
118 overflow:hidden;
119 }
120 thead
121 {
122 margin-top: 0.5em;
123 font-weight: bold
124 }
125 th
126 {
127 padding: 0.5em 1.5em 0.5em 1.5em;
128 background-color: #E1E1E1;
129 border-left: 1px solid #E6E6E6;
130 }
131 td
132 {
133 padding: 0.25em 1.5em 0.25em 2em;
134 }
135
136 td.rightAlign
137 {
138 padding: 0.25em 0.5em 0.25em 1em;
139 }
140 table tr.odd
141 {
142 border-left: 1px solid #E6E6E6;
143 background-color: #F6F6F6;
144 color: #66666E;
145 }
146 table tr.even
147 {
148 border-left: 1px solid #E6E6E6;
149 background-color: #ffffff;
150 color: #66666E;
151 }
152
153 div.float-left
154 {
155 float: left; margin-right: 2em
156 }
157 div.float-right
158 {
159 float: right; margin-left: 2em
160 }
161
162 span.comment
163 {
164 color: #008B00;
165 font-style: italic
166 }
167 span.string, span.char
168 {
169 color: #000084;
170 }
171 span.number
172 {
173 color: #a46200;
174 }
175 span.operator
176 {
177 color: #202020;
178 }
179 span.keyword
180 {
181 color: #840000;
182 }
183 span.name
184 {
185 color: black
186 }
187 span.type
188 {
189 font-weight: bold
190 }
191 span.type a:visited
192 {
193 color: #0F5300;
194 }
195 span.preprocessor
196 {
197 color: #404040
198 }
199 /* end basic elements */
200
201 /* font style elements */
202 .heading
203 {
204 font-weight: bold;
205 font-size: 125%;
206 }
207 .subtitle
208 {
209 font-size: 110%
210 }
211 .small-subtitle
212 {
213 font-size: 100%
214 }
215 .red
216 {
217 color:red;
218 }
219 /* end font style elements */
220
221 /* global settings*/
222 .header, .footer
223 {
224 display: block;
225 clear: both;
226 overflow: hidden;
227 }
228 /* end global settings*/
229
230 /* header elements */
231 .header .qtref
232 {
233 color: #00732F;
234 font-weight: bold;
235 font-size: 130%;
236 }
237
238 .header .content
239 {
240 margin-bottom: 0.5em
241 }
242
243 .naviNextPrevious
244 {
245 display: none
246 }
247 .header .breadcrumb
248 {
249 font-size: 90%;
250 padding: 0.5em 0 0.5em 1em;
251 margin: 0;
252 background-color: #fafafa;
253 height: 1.35em;
254 border-bottom: 1px solid #d1d1d1;
255 }
256
257 .header .breadcrumb ul
258 {
259 margin: 0;
260 padding: 0;
261 }
262
263 .header .content
264 {
265 word-wrap: break-word;
266 }
267
268 .header .breadcrumb ul li
269 {
270 float: left;
271 background: url(../images/breadcrumb.png) no-repeat 0 3px;
272 padding-left: 1.5em;
273 margin-left: 1.5em;
274 }
275
276 .header .breadcrumb ul li.last
277 {
278 font-weight: normal;
279 }
280
281 .header .breadcrumb ul li a
282 {
283 color: #00732F;
284 }
285
286 .header .breadcrumb ul li.first
287 {
288 background-image: none;
289 padding-left: 0;
290 margin-left: 0;
291 }
292
293 .header .content ol li {
294 background: none;
295 margin-bottom: 1.0em;
296 margin-left: 1.2em;
297 padding-left: 0
298 }
299
300 .header .content li
301 {
302 background: url(../images/bullet_sq.png) no-repeat 0 5px;
303 margin-bottom: 1em;
304 padding-left: 1.2em;
305 }
306
307 /* end header elements */
308
309 /* content elements */
310 .content h1
311 {
312 font-weight: bold;
313 font-size: 150%
314 }
315
316 .content h2
317 {
318 font-weight: bold;
319 font-size: 135%;
320 width: 100%;
321 }
322 .content h3
323 {
324 font-weight: bold;
325 font-size: 120%;
326 width: 100%;
327 }
328 .content table p
329 {
330 margin: 0
331 }
332 .content ul
333 {
334 padding-left: 2.5em;
335 }
336 .content li
337 {
338 padding-top: 0.25em;
339 padding-bottom: 0.25em;
340 }
341 .content ul img {
342 vertical-align: middle;
343 }
344
345 .content a:visited
346 {
347 color: #4c0033;
348 text-decoration: none;
349 }
350
351 .content a:visited:hover
352 {
353 color: #4c0033;
354 text-decoration: underline;
355 }
356
357 a:hover
358 {
359 color: #4c0033;
360 text-decoration: underline;
361 }
362 descr p a
363 {
364 text-decoration: underline;
365 }
366
367 .descr p a:visited
368 {
369 text-decoration: underline;
370 }
371
372 .alphaChar{
373 width:95%;
374 background-color:#F6F6F6;
375 border:1px solid #E6E6E6;
376 -moz-border-radius: 7px 7px 7px 7px;
377 border-radius: 7px 7px 7px 7px;
378 -webkit-border-radius: 7px 7px 7px 7px;
379 font-size:12pt;
380 padding-left:10px;
381 margin-top:10px;
382 margin-bottom:10px;
383 }
384 .flowList{
385 /*vertical-align:top;*/
386 /*margin:20px auto;*/
387
388 column-count:3;
389 -webkit-column-count:3;
390 -moz-column-count:3;
391 /*
392 column-width:100%;
393 -webkit-column-width:200px;
394 -col-column-width:200px;
395 */
396 column-gap:41px;
397 -webkit-column-gap:41px;
398 -moz-column-gap:41px;
399
400 column-rule: 1px dashed #ccc;
401 -webkit-column-rule: 1px dashed #ccc;
402 -moz-column-rule: 1px dashed #ccc;
403 }
404
405 .flowList dl{
406 }
407 .flowList dd{
408 /*display:inline-block;*/
409 margin-left:10px;
410 min-width:250px;
411 line-height: 1.5;
412 min-width:100%;
413 min-height:15px;
414 }
415
416 .flowList dd a{
417 }
418
419 .content .flowList p{
420 padding:0px;
421 }
422
423 .content .alignedsummary
424 {
425 margin: 15px;
426 }
427
428
429 .qmltype
430 {
431 text-align: center;
432 font-size: 120%;
433 }
434 .qmlreadonly
435 {
436 padding-left: 5px;
437 float: right;
438 color: #254117;
439 }
440
441 .qmldefault
442 {
443 padding-left: 5px;
444 float: right;
445 color: red;
446 }
447
448 .qmldoc
449 {
450 }
451
452 .generic .alphaChar{
453 margin-top:5px;
454 }
455
456 .generic .odd .alphaChar{
457 background-color: #F6F6F6;
458 }
459
460 .generic .even .alphaChar{
461 background-color: #FFFFFF;
462 }
463
464 .memItemRight{
465 padding: 0.25em 1.5em 0.25em 0;
466 }
467 .highlightedCode
468 {
469 margin: 1.0em;
470 }
471 .annotated td {
472 padding: 0.25em 0.5em 0.25em 0.5em;
473 }
474
475 .header .content .toc ul
476 {
477 padding-left: 0px;
478 }
479
480 .content .toc h3 {
481 border-bottom: 0px;
482 margin-top: 0px;
483 }
484
485 .content .toc h3 a:hover {
486 color: #00732F;
487 text-decoration: none;
488 }
489
490 .content .toc .level2
491 {
492 margin-left: 1.5em;
493 }
494
495 .content .toc .level3
496 {
497 margin-left: 3.0em;
498 }
499
500 .content ul li
501 {
502 background: url(../images/bullet_sq.png) no-repeat 0 0.7em;
503 padding-left: 1em
504 }
505
506 .content .toc li
507 {
508 background: url(../images/bullet_dn.png) no-repeat 0 5px;
509 padding-left: 1em
510 }
511
512 .relpage
513 {
514 -moz-border-radius: 7px 7px 7px 7px;
515 -webkit-border-radius: 7px 7px 7px 7px;
516 border-radius: 7px 7px 7px 7px;
517 border: 1px solid #DDDDDD;
518 padding: 25px 25px;
519 clear: both;
520 }
521 .relpage ul
522 {
523 float: none;
524 padding: 1.5em;
525 }
526
527 h3.fn, span.fn
528 {
529 -moz-border-radius:7px 7px 7px 7px;
530 -webkit-border-radius:7px 7px 7px 7px;
531 border-radius:7px 7px 7px 7px;
532 background-color: #F6F6F6;
533 border-width: 1px;
534 border-style: solid;
535 border-color: #E6E6E6;
536 font-weight: bold;
537 word-spacing:3px;
538 padding:3px 5px;
539 }
540
541 .functionIndex {
542 font-size:12pt;
543 word-spacing:10px;
544 margin-bottom:10px;
545 background-color: #F6F6F6;
546 border-width: 1px;
547 border-style: solid;
548 border-color: #E6E6E6;
549 -moz-border-radius: 7px 7px 7px 7px;
550 -webkit-border-radius: 7px 7px 7px 7px;
551 border-radius: 7px 7px 7px 7px;
552 width:100%;
553 }
554
555 .centerAlign
556 {
557 text-align:center;
558 }
559
560 .rightAlign
561 {
562 text-align:right;
563 }
564
565 .leftAlign
566 {
567 text-align:left;
568 }
569
570 .topAlign{
571 vertical-align:top
572 }
573
574 .functionIndex a{
575 display:inline-block;
576 }
577
578 /* end content elements */
579 /* footer elements */
580
581 .footer
582 {
583 color: #393735;
584 font-size: 0.75em;
585 text-align: center;
586 padding-top: 1.5em;
587 padding-bottom: 1em;
588 background-color: #E6E7E8;
589 margin: 0;
590 }
591 .footer p
592 {
593 margin: 0.25em
594 }
595 .small
596 {
597 font-size: 0.5em;
598 }
599 /* end footer elements */
600
601 .item {
602 float: left;
603 position: relative;
604 width: 100%;
605 overflow: hidden;
606 }
607
608
609 .item .primary {
610 margin-right: 220px;
611 position: relative;
612 }
613
614 .item hr {
615 margin-left: -220px;
616 }
617
618 .item .secondary {
619 float: right;
620 width: 200px;
621 position: relative;
622 }
623
624 .item .cols {
625 clear: both;
626 display: block;
627 }
628
629 .item .cols .col {
630 float: left;
631 margin-left: 1.5%;
632 }
633
634 .item .cols .col.first {
635 margin-left: 0;
636 }
637
638 .item .cols.two .col {
639 width: 45%;
640 }
641
642 .item .box {
643 margin: 0 0 10px 0;
644 }
645
646 .item .box h3 {
647 margin: 0 0 10px 0;
648 }
649
650 .cols.unclear {
651 clear:none;
652 }
653 }
654
655 /* end of screen media */
656
657 /* start of print media */
658
659 @media print
660 {
661 input, textarea, .header, .footer, .toolbar, .feedback, .wrapper .hd, .wrapper .bd .sidebar, .wrapper .ft, #feedbackBox, #blurpage, .toc, .breadcrumb, .toolbar, .floatingResult
662 {
663 display: none;
664 background: none;
665 }
666 .content
667 {
668 background: none;
669 display: block;
670 width: 100%; margin: 0; float: none;
671 }
672 }
673 /* end of print media */
@@ -0,0 +1,64
1 #include "barvalue_p.h"
2 #include <QPainter>
3 #include <QPen>
4
5 QTCOMMERCIALCHART_BEGIN_NAMESPACE
6
7 BarValue::BarValue(QBarSet &set, QGraphicsItem *parent)
8 : QGraphicsItem(parent)
9 ,mBarSet(set)
10 {
11 // setVisible(false);
12 }
13
14 void BarValue::setValueString(QString str)
15 {
16 mValueString = str;
17 }
18
19 QString BarValue::valueString()
20 {
21 return mValueString;
22 }
23
24 void BarValue::setPen(const QPen& pen)
25 {
26 mPen = pen;
27 }
28
29 const QPen& BarValue::pen()
30 {
31 return mPen;
32 }
33
34 void BarValue::resize(qreal w, qreal h)
35 {
36 mWidth = w;
37 mHeight = h;
38 }
39
40 void BarValue::setPos(qreal x, qreal y)
41 {
42 mXpos = x;
43 mYpos = y;
44 }
45
46 bool BarValue::belongsToSet(QBarSet *set)
47 {
48 return (&mBarSet == set);
49 }
50
51 void BarValue::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
52 {
53 painter->setPen(mPen);
54 painter->drawText(boundingRect(),mValueString);
55 }
56
57 QRectF BarValue::boundingRect() const
58 {
59 QRectF r(mXpos, mYpos, mXpos + mWidth, mYpos + mHeight);
60 return r;
61 }
62
63
64 QTCOMMERCIALCHART_END_NAMESPACE
@@ -0,0 +1,49
1 #ifndef BARVALUE_P_H
2 #define BARVALUE_P_H
3
4 #include "qchartglobal.h"
5 #include <QGraphicsItem>
6 #include <QPen>
7
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9
10 class QBarSet;
11
12 // Visual class for floating bar values
13 // TODO: fonts, colors etc.
14 // By default these are not visible.
15 class BarValue : public QGraphicsItem // TODO: public QGraphicsObject for signals?
16 {
17 public:
18 BarValue(QBarSet &set, QGraphicsItem *parent = 0);
19
20 void setValueString(QString str);
21 QString valueString();
22
23 void setPen(const QPen& pen);
24 const QPen& pen();
25
26 void resize(qreal w, qreal h);
27 void setPos(qreal x, qreal y);
28
29 bool belongsToSet(QBarSet *set);
30
31 // From QGraphicsItem
32 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
33 QRectF boundingRect() const;
34
35 private:
36
37 QBarSet& mBarSet;
38 QPen mPen;
39 QString mValueString;
40
41 qreal mXpos;
42 qreal mYpos;
43 qreal mWidth;
44 qreal mHeight;
45 };
46
47 QTCOMMERCIALCHART_END_NAMESPACE
48
49 #endif // BARVALUE_P_H
@@ -0,0 +1,17
1 import QtQuick 1.0
2
3 Item {
4 id: container
5 width: 400
6 height: 500
7 Component.onCompleted: {
8 var co = Qt.createComponent("main.qml")
9 if (co.status == Component.Ready) {
10 var o = co.createObject(container)
11 } else {
12 console.log(co.errorString())
13 console.log("QtCommercial.Chart 1.1 not available")
14 console.log("Please use correct QML_IMPORT_PATH export")
15 }
16 }
17 } No newline at end of file
@@ -0,0 +1,6
1 <RCC>
2 <qresource prefix="/">
3 <file>qml/qmlchart/loader.qml</file>
4 <file>qml/qmlchart/main.qml</file>
5 </qresource>
6 </RCC>
@@ -5,6 +5,7 CHART_BUILD_PRIVATE_HEADER_DIR = $$CHART_BUILD_PUBLIC_HEADER_DIR/private
5 5 CHART_BUILD_LIB_DIR = $$PWD/lib
6 6 CHART_BUILD_DIR = $$PWD/build
7 7 CHART_BUILD_BIN_DIR = $$PWD/bin
8 CHART_BUILD_PLUGIN_DIR = $$CHART_BUILD_LIB_DIR/QtCommercial/Chart
8 9
9 10 # hack to fix windows builds
10 11 win32:{
@@ -13,6 +14,7 win32:{
13 14 CHART_BUILD_LIB_DIR = $$replace(CHART_BUILD_LIB_DIR, "/","\\")
14 15 CHART_BUILD_BUILD_DIR = $$replace(CHART_BUILD_BUILD_DIR, "/","\\")
15 16 CHART_BUILD_BIN_DIR = $$replace(CHART_BUILD_BIN_DIR, "/","\\")
17 CHART_BUILD_PLUGIN_DIR = $$replace(CHART_BUILD_PLUGIN_DIR, "/","\\")
16 18 }
17 19
18 20 mac: {
@@ -1,6 +1,7
1 1 /*!
2 2 \class Widget
3 3 \brief Ui for the application.
4 \internal
4 5 */
5 6
6 7 #include "widget.h"
@@ -43,7 +43,9 m_index(0)
43 43
44 44 ChartView::~ChartView()
45 45 {
46
46 if(m_series.size()==0) return;
47 removeSeries(m_series.at(m_index));
48 qDeleteAll(m_series);
47 49 }
48 50
49 51 void ChartView::handleTimeout()
@@ -1,6 +1,5
1 1 #include <QtGui/QApplication>
2 2 #include <QMainWindow>
3 #include <cmath>
4 3 #include <qchartglobal.h>
5 4 #include <qchartview.h>
6 5 #include <qscatterseries.h>
@@ -12,7 +11,7 int main(int argc, char *argv[])
12 11 QApplication a(argc, argv);
13 12
14 13 // Create chart widget
15 QChartView *chartWidget = new QChartView();
14 QChartView *chartView = new QChartView();
16 15
17 16 // Add scatter series with simple test data
18 17 QScatterSeries *scatter = new QScatterSeries();
@@ -23,34 +22,27 int main(int argc, char *argv[])
23 22 << QPointF(2.0, 4.5)
24 23 << QPointF(2.0, 5.5)
25 24 << QPointF(2.5, 5.0);
26 chartWidget->addSeries(scatter);
25 // Chart takes ownership
26 chartView->addSeries(scatter);
27 27
28 28 // Add another scatter series
29 29 // - more data with random component
30 30 QScatterSeries *scatter2 = new QScatterSeries();
31 for (qreal i(0.0); i < 20; i += 0.05) {
31 for (qreal i(0.0); i < 20; i += 0.15) {
32 32 (*scatter2) << QPointF(i + (qreal)(rand() % 100) / 100.0,
33 33 i + (qreal)(rand() % 100) / 100.0);
34 34 }
35 chartWidget->addSeries(scatter2);
36 // Custom pen and brush (not those defined by the chart theme)
37 // - uses opaque color
38 QColor color("#2685BF");
39 color.setAlpha(80);
40 QBrush brush(Qt::SolidPattern);
41 brush.setColor(color);
35 QBrush brush(QColor(255, 0, 0, 100), Qt::SolidPattern);
42 36 scatter2->setMarkerBrush(brush);
43 QPen pen;
44 pen.setColor(color);
45 pen.setWidth(2);
37 QPen pen(QColor(0, 255, 0, 80), 3);
46 38 scatter2->setMarkerPen(pen);
47 // use a rectangle as the marker shape
48 39 scatter2->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
40 chartView->addSeries(scatter2);
49 41
50 42 // Use the chart widget as the central widget
51 43 QMainWindow w;
52 44 w.resize(640, 480);
53 w.setCentralWidget(chartWidget);
45 w.setCentralWidget(chartView);
54 46 w.show();
55 47
56 48 return a.exec();
@@ -7,7 +7,7
7 7
8 8 TEMPLATE = lib
9 9 TARGET = qtcommercialchartqml
10
10 DESTDIR = $$CHART_BUILD_PLUGIN_DIR
11 11 CONFIG += qt plugin
12 12 QT += declarative
13 13
@@ -16,10 +16,10 contains(QT_MAJOR_VERSION, 5) {
16 16 DEFINES += QTQUICK2
17 17 }
18 18
19 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
20 MOC_DIR = $$CHART_BUILD_DIR/lib
21 UI_DIR = $$CHART_BUILD_DIR/lib
22 RCC_DIR = $$CHART_BUILD_DIR/lib
19 OBJECTS_DIR = $$CHART_BUILD_DIR/plugin
20 MOC_DIR = $$CHART_BUILD_DIR/plugin
21 UI_DIR = $$CHART_BUILD_DIR/plugin
22 RCC_DIR = $$CHART_BUILD_DIR/plugin
23 23
24 24 SOURCES += \
25 25 plugin.cpp \
@@ -37,6 +37,8 HEADERS += \
37 37 declarativepieseries.h \
38 38 declarativelineseries.h
39 39
40 QMAKE_POST_LINK = $$QMAKE_COPY qmldir $$CHART_BUILD_PLUGIN_DIR
41
40 42 TARGETPATH = QtCommercial/Chart
41 43 target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH
42 44 qmldir.files += $$PWD/qmldir
@@ -1,5 +1,6
1 1 #include "axisitem_p.h"
2 2 #include "qchartaxis.h"
3 #include "chartpresenter_p.h"
3 4 #include <QPainter>
4 5 #include <QDebug>
5 6
@@ -14,11 +15,12 m_labelsAngle(0),
14 15 m_shadesEnabled(true),
15 16 m_grid(parent),
16 17 m_shades(parent),
17 m_labels(parent)
18 m_labels(parent),
19 m_origin(0,0)
18 20 {
19 21 //initial initialization
20 m_shades.setZValue(0);
21 m_grid.setZValue(2);
22 m_shades.setZValue(ChartPresenter::ShadesZValue);
23 m_grid.setZValue(ChartPresenter::GridZValue);
22 24 }
23 25
24 26 AxisItem::~AxisItem()
@@ -172,6 +174,7 void AxisItem::handleLabelsChanged(QChartAxis* axis,const QStringList& labels)
172 174 clear();
173 175 m_thicksList=labels;
174 176 createItems(m_thicksList.size());
177 updateItem(m_thicksList.size());
175 178 items = m_labels.childItems();
176 179 handleAxisUpdate(axis);
177 180 }
@@ -208,7 +211,6 void AxisItem::setGridOpacity(qreal opacity)
208 211 m_grid.setOpacity(opacity);
209 212 }
210 213
211
212 214 qreal AxisItem::gridOpacity() const
213 215 {
214 216 return m_grid.opacity();
@@ -50,9 +50,9 public:
50 50 void setLabelsFont(const QFont& font);
51 51
52 52 public slots:
53 void handleAxisUpdate(QChartAxis* axis);
54 void handleLabelsChanged(QChartAxis* axis,const QStringList& labels);
55 void handleGeometryChanged(const QRectF& size);
53 void handleAxisUpdate(QChartAxis* axis); //look and feel
54 void handleLabelsChanged(QChartAxis* axis,const QStringList& labels); //labels from dataset
55 void handleGeometryChanged(const QRectF& size); // geometry from presenter
56 56 protected:
57 57 void updateItem(int count);
58 58 private:
@@ -68,6 +68,7 private:
68 68 QGraphicsItemGroup m_labels;
69 69 QGraphicsLineItem m_axis;
70 70 QStringList m_thicksList;
71 QPointF m_origin;
71 72
72 73 };
73 74
@@ -5,8 +5,9
5 5 QTCOMMERCIALCHART_BEGIN_NAMESPACE
6 6
7 7 Bar::Bar(QGraphicsItem *parent)
8 : ChartItem(parent)
8 : QGraphicsObject(parent)
9 9 {
10 setAcceptedMouseButtons(Qt::LeftButton);
10 11 }
11 12
12 13 void Bar::setSize(const QSizeF& size)
@@ -18,7 +19,6 void Bar::setSize(const QSizeF& size)
18 19
19 20 void Bar::resize( qreal w, qreal h )
20 21 {
21 // qDebug() << "bar::resize" << w << h;
22 22 mWidth = w;
23 23 mHeight = h;
24 24 }
@@ -30,7 +30,6 void Bar::setColor( QColor col )
30 30
31 31 void Bar::setPos(qreal x, qreal y)
32 32 {
33 // qDebug() << "Bar::setpos" << x << y;
34 33 mXpos = x;
35 34 mYpos = y;
36 35 }
@@ -50,10 +49,7 void Bar::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidg
50 49 if (0 == mHeight) {
51 50 return;
52 51 }
53 // TODO: accept brush instead of color
54 52 painter->setBrush(mBrush);
55 // QBrush brush(mColor);
56 // painter->setBrush(brush);
57 53
58 54 // This compensates for rounding errors. drawRect takes ints and cumulative error of pos + size may be over 1.
59 55 int x0 = mXpos;
@@ -71,6 +67,11 QRectF Bar::boundingRect() const
71 67 return r;
72 68 }
73 69
74 //#include "moc_bar_p.cpp"
70 void Bar::mousePressEvent(QGraphicsSceneMouseEvent* /*event*/)
71 {
72 emit clicked();
73 }
74
75 #include "moc_bar_p.cpp"
75 76
76 77 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,17 +1,17
1 1 #ifndef BAR_H
2 2 #define BAR_H
3 3
4 #include "chartitem_p.h"
5 4 #include "qchartglobal.h"
6 #include <QGraphicsItem>
5 #include <QGraphicsObject>
7 6 #include <QPen>
8 7 #include <QBrush>
9 8
10 9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11 10
12 11 // Single bar item of chart
13 class Bar : public ChartItem
12 class Bar : public QGraphicsObject
14 13 {
14 Q_OBJECT
15 15 public:
16 16 Bar(QGraphicsItem *parent=0);
17 17
@@ -30,6 +30,10 public:
30 30
31 31 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
32 32 QRectF boundingRect() const;
33 void mousePressEvent(QGraphicsSceneMouseEvent *event);
34
35 Q_SIGNALS:
36 void clicked();
33 37
34 38 private:
35 39
@@ -14,7 +14,8 SOURCES += \
14 14 $$PWD/qpercentbarchartseries.cpp \
15 15 $$PWD/qstackedbarchartseries.cpp \
16 16 $$PWD/separator.cpp \
17 $$PWD/stackedbarpresenter.cpp
17 $$PWD/stackedbarpresenter.cpp \
18 $$PWD/barvalue.cpp
18 19
19 20 PRIVATE_HEADERS += \
20 21 $$PWD/bar_p.h \
@@ -24,12 +25,14 PRIVATE_HEADERS += \
24 25 $$PWD/barpresenterbase.h \
25 26 $$PWD/percentbarpresenter.h \
26 27 $$PWD/separator_p.h \
27 $$PWD/stackedbarpresenter.h
28
28 $$PWD/stackedbarpresenter.h \
29 $$PWD/barvalue_p.h
30
29 31 PUBLIC_HEADERS += \
30 32 $$PWD/qbarcategory.h \
31 33 $$PWD/qbarchartseries.h \
32 34 $$PWD/qbarset.h \
33 35 $$PWD/qpercentbarchartseries.h \
34 36 $$PWD/qstackedbarchartseries.h
35 No newline at end of file
37
38
@@ -134,14 +134,34 qreal BarChartModel::valueAt(int set, int category)
134 134 return mDataModel.at(set)->valueAt(category);
135 135 }
136 136
137 qreal BarChartModel::categorySum(int column)
137 qreal BarChartModel::percentageAt(int set, int category)
138 {
139 if ((set < 0) || (set >= mDataModel.count())) {
140 // No set, no value.
141 return 0;
142 } else if ((category < 0) || (category >= mDataModel.at(set)->count())) {
143 // No category, no value.
144 return 0;
145 }
146
147 qreal value = mDataModel.at(set)->valueAt(category);
148 qreal total = categorySum(category);
149 if (0 == total) {
150 return 100.0;
151 }
152
153 return value / total;
154 }
155
156
157 qreal BarChartModel::categorySum(int category)
138 158 {
139 159 qreal sum(0);
140 int count = mDataModel.count(); // Count rows
160 int count = mDataModel.count(); // Count sets
141 161
142 for (int row = 0; row < count; row++) {
143 if (column < mDataModel.at(row)->count()) {
144 sum += mDataModel.at(row)->valueAt(column);
162 for (int set = 0; set < count; set++) {
163 if (category < mDataModel.at(set)->count()) {
164 sum += mDataModel.at(set)->valueAt(category);
145 165 }
146 166 }
147 167 return sum;
@@ -33,8 +33,9 public:
33 33 qreal max(); // Maximum value of all sets
34 34 qreal min(); // Minimum value of all sets
35 35 qreal valueAt(int set, int category);
36 qreal percentageAt(int set, int category);
36 37
37 qreal categorySum(int column);
38 qreal categorySum(int category);
38 39 qreal maxCategorySum(); // returns maximum sum of sets in all categories.
39 40
40 41 QString label(int category);
@@ -1,6 +1,7
1 1 #include "barpresenter.h"
2 2 #include "bar_p.h"
3 3 #include "barlabel_p.h"
4 #include "barvalue_p.h"
4 5 #include "qbarset.h"
5 6 #include <QDebug>
6 7
@@ -9,12 +10,11 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 10 BarPresenter::BarPresenter(BarChartModel& model, QGraphicsItem *parent) :
10 11 BarPresenterBase(model,parent)
11 12 {
12 mBarDefaultWidth = 5;
13 mBarDefaultWidth = 15;
13 14 }
14 15
15 16 void BarPresenter::layoutChanged()
16 17 {
17 // qDebug() << "BarGroup::layoutChanged";
18 18 // Scale bars to new layout
19 19 // Layout for bars:
20 20 if (mModel.countSets() <= 0) {
@@ -23,32 +23,32 void BarPresenter::layoutChanged()
23 23 }
24 24
25 25 if (childItems().count() == 0) {
26 qDebug() << "WARNING: BarGroup::layoutChanged called before graphics items are created!";
26 qDebug() << "WARNING: BarPresenter::layoutChanged called before graphics items are created!";
27 27 return;
28 28 }
29 29
30 30 // TODO: better way to auto-layout?
31 31 // Use reals for accurancy (we might get some compiler warnings... :)
32 int itemCount = mModel.countCategories();
32 int categoryCount = mModel.countCategories();
33 33 int setCount = mModel.countSets();
34 34
35 35 qreal tW = mWidth;
36 36 qreal tH = mHeight;
37 37 qreal tM = mModel.max();
38 38 qreal scale = (tH/tM);
39 qreal tC = itemCount+1;
39 qreal tC = categoryCount+1;
40 40 qreal xStepPerSet = (tW/tC);
41 41
42 42 // Scaling.
43 43 int itemIndex(0);
44 int labelIndex = itemCount * setCount;
44 int labelIndex(0);
45 45
46 for (int item=0; item < itemCount; item++) {
47 qreal xPos = xStepPerSet * item + ((tW + mBarDefaultWidth*setCount)/(itemCount*2));
46 for (int category=0; category < categoryCount; category++) {
47 qreal xPos = xStepPerSet * category + ((tW + mBarDefaultWidth*setCount)/(categoryCount*2));
48 48 qreal yPos = mHeight;
49 49 for (int set = 0; set < setCount; set++) {
50 qreal barHeight = mModel.valueAt(set, item) * scale;
51 Bar* bar = reinterpret_cast<Bar*> (childItems().at(itemIndex));
50 qreal barHeight = mModel.valueAt(set, category) * scale;
51 Bar* bar = mBars.at(itemIndex);
52 52
53 53 // TODO: width settable per bar?
54 54 bar->resize(mBarDefaultWidth, barHeight);
@@ -59,12 +59,33 void BarPresenter::layoutChanged()
59 59 }
60 60
61 61 // TODO: Layout for labels, remove magic number
62 xPos = xStepPerSet * item + ((tW + mBarDefaultWidth*setCount)/(itemCount*2));
63 BarLabel* label = reinterpret_cast<BarLabel*> (childItems().at(labelIndex));
62 xPos = xStepPerSet * category + ((tW + mBarDefaultWidth*setCount)/(categoryCount*2));
63 BarLabel* label = mLabels.at(labelIndex);
64 64 label->setPos(xPos, mHeight + 20);
65 65 labelIndex++;
66 66 }
67 67
68 // Position floating values
69 itemIndex = 0;
70 for (int category=0; category < mModel.countCategories(); category++) {
71 qreal xPos = xStepPerSet * category + ((tW + mBarDefaultWidth*setCount)/(categoryCount*2));
72 qreal yPos = mHeight;
73 for (int set=0; set < mModel.countSets(); set++) {
74 qreal barHeight = mModel.valueAt(set,category) * scale;
75 BarValue* value = mFloatingValues.at(itemIndex);
76
77 // TODO: remove hard coding, apply layout
78 value->resize(100,50);
79 value->setPos(xPos + mBarDefaultWidth/2, yPos-barHeight/2);
80 value->setPen(QPen(QColor(255,255,255,255)));
81
82 QString vString(QString::number(mModel.valueAt(set,category)));
83 value->setValueString(vString);
84
85 itemIndex++;
86 xPos += mBarDefaultWidth;
87 }
88 }
68 89 mLayoutDirty = true;
69 90 }
70 91
@@ -7,8 +7,7
7 7
8 8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 9
10 // Base class for bar groups
11
10 // Presenter for parallel bars. Grouping of bars is done on category basis.
12 11 class BarPresenter : public BarPresenterBase
13 12 {
14 13 public:
@@ -1,5 +1,6
1 1 #include "barpresenterbase.h"
2 2 #include "bar_p.h"
3 #include "barvalue_p.h"
3 4 #include "barlabel_p.h"
4 5 #include "separator_p.h"
5 6 #include "qbarset.h"
@@ -12,7 +13,7 BarPresenterBase::BarPresenterBase(BarChartModel& model, QGraphicsItem *parent)
12 13 ,mBarDefaultWidth(20) // TODO: remove hard coding, when we have layout code ready
13 14 ,mLayoutSet(false)
14 15 ,mLayoutDirty(true)
15 ,mSeparatorsVisible(true)
16 ,mSeparatorsVisible(false)
16 17 ,mModel(model)
17 18 {
18 19 dataChanged();
@@ -25,9 +26,8 void BarPresenterBase::setSeparatorsVisible(bool visible)
25 26
26 27 void BarPresenterBase::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
27 28 {
28 // qDebug() << "BarGroupBase::paint" << childItems().count();
29 29 if (!mLayoutSet) {
30 qDebug() << "BarGroupBase::paint called without layout set. Aborting.";
30 qDebug() << "BarPresenterBase::paint called without layout set. Aborting.";
31 31 return;
32 32 }
33 33 // if (mLayoutDirty) {
@@ -51,51 +51,83 void BarPresenterBase::setBarWidth( int w )
51 51 void BarPresenterBase::dataChanged()
52 52 {
53 53 // TODO: performance optimizations. Do we really need to delete and create items every time data is changed or can we reuse them?
54
54 qDebug() << "datachanged";
55 55 // Delete old bars
56 56 foreach (QGraphicsItem* item, childItems()) {
57 57 delete item;
58 58 }
59 59
60 mBars.clear();
61 mLabels.clear();
62 mSeparators.clear();
63 mFloatingValues.clear();
64
60 65 // Create new graphic items for bars
61 66 for (int s=0; s<mModel.countSets(); s++) {
62 67 QBarSet *set = mModel.nextSet(0==s);
63 68 for (int c=0; c<mModel.countCategories(); c++) {
64 69 Bar *bar = new Bar(this);
65 70 childItems().append(bar);
66 //connect(bar,SIGNAL(clicked()),set,SLOT(barClicked()));
71 mBars.append(bar);
72 connect(bar,SIGNAL(clicked()),set,SLOT(toggleFloatingValuesVisible()));
67 73 }
68 74 }
69 75
76 // Create labels
70 77 int count = mModel.countCategories();
71 78 for (int i=0; i<count; i++) {
72 79 BarLabel* label = new BarLabel(this);
73 80 label->set(mModel.label(i));
74 81 childItems().append(label);
82 mLabels.append(label);
75 83 }
76 84
85 // Create separators
77 86 count = mModel.countCategories() - 1; // There is one less separator than columns
78 87 for (int i=0; i<count; i++) {
79 88 Separator* sep = new Separator(this);
80 89 sep->setColor(QColor(255,0,0,255)); // TODO: color for separations from theme
81 90 childItems().append(sep);
91 mSeparators.append(sep);
92 }
93
94 // Create floating values
95 for (int s=0; s<mModel.countSets(); s++) {
96 QBarSet *set = mModel.nextSet(0==s);
97 for (int category=0; category<mModel.countCategories(); category++) {
98 BarValue *value = new BarValue(*set, this);
99 childItems().append(value);
100 mFloatingValues.append(value);
101 }
102 connect(set,SIGNAL(setFloatingValuesVisible(QBarSet*)),this,SLOT(setFloatingValues(QBarSet*)));
82 103 }
83 104
84 105 // TODO: if (autolayout) { layoutChanged() } or something
85 106 mLayoutDirty = true;
86 107 }
87 108
109 void BarPresenterBase::setFloatingValues(QBarSet *set)
110 {
111 qDebug() << "BarPresenterBase::setFloatingValues";
112 // TODO: better way to map set to BarValues?
113 for (int i=0; i<mFloatingValues.count(); i++) {
114 if (mFloatingValues.at(i)->belongsToSet(set)) {
115 mFloatingValues.at(i)->setVisible(set->isFloatingValuesVisible());
116 }
117 }
118 }
119
88 120 //handlers
89 121
90 122 void BarPresenterBase::handleModelChanged(int index)
91 123 {
92 // qDebug() << "BarGroupBase::handleModelChanged" << index;
124 // qDebug() << "BarPresenterBase::handleModelChanged" << index;
93 125 dataChanged();
94 126 }
95 127
96 128 void BarPresenterBase::handleDomainChanged(const Domain& domain)
97 129 {
98 // qDebug() << "BarGroupBase::handleDomainChanged";
130 // qDebug() << "BarPresenterBase::handleDomainChanged";
99 131 // TODO: Figure out the use case for this.
100 132 // Affects the size of visible item, so layout is changed.
101 133 // layoutChanged();
@@ -9,7 +9,12
9 9
10 10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11 11
12 // Base Class for bar groups. Common implemantation of different groups. Not to be instantiated.
12 class Bar;
13 class BarLabel;
14 class Separator;
15 class BarValue;
16
17 // Common implemantation of different presenters. Not to be instantiated.
13 18 class BarPresenterBase : public QObject, public ChartItem
14 19 {
15 20 Q_OBJECT
@@ -36,6 +41,9 public:
36 41 virtual void dataChanged(); // data of series has changed -> need to recalculate bar sizes
37 42 virtual void layoutChanged() = 0; // layout has changed -> need to recalculate bar sizes
38 43
44 public Q_SLOTS:
45 void setFloatingValues(QBarSet *set);
46
39 47 protected slots:
40 48 void handleModelChanged(int index);
41 49 void handleDomainChanged(const Domain& domain);
@@ -51,10 +59,15 protected:
51 59 bool mLayoutSet; // True, if component has been laid out.
52 60 bool mLayoutDirty;
53 61
54 QList<QColor> mColors; // List of colors for series for now
55 62 bool mSeparatorsVisible;
56 63 BarChartModel& mModel;
57 64
65 // Not owned.
66 QList<Bar*> mBars;
67 QList<BarLabel*> mLabels;
68 QList<Separator*> mSeparators;
69 QList<BarValue*> mFloatingValues;
70
58 71 QPen mPen;
59 72 };
60 73
@@ -1,6 +1,7
1 1 #include "percentbarpresenter.h"
2 2 #include "bar_p.h"
3 3 #include "barlabel_p.h"
4 #include "barvalue_p.h"
4 5 #include "separator_p.h"
5 6 #include "qbarset.h"
6 7 #include <QDebug>
@@ -15,7 +16,6 PercentBarPresenter::PercentBarPresenter(BarChartModel& model, QGraphicsItem *pa
15 16
16 17 void PercentBarPresenter::layoutChanged()
17 18 {
18 // qDebug() << "PercentBarGroup::layoutChanged";
19 19 // Scale bars to new layout
20 20 // Layout for bars:
21 21 if (mModel.countSets() <= 0) {
@@ -25,7 +25,7 void PercentBarPresenter::layoutChanged()
25 25 }
26 26
27 27 if (childItems().count() == 0) {
28 qDebug() << "WARNING: PercentBarGroup::layoutChanged called before graphics items are created!";
28 qDebug() << "WARNING: PercentBarPresenter::layoutChanged called before graphics items are created!";
29 29 return;
30 30 }
31 31
@@ -33,20 +33,20 void PercentBarPresenter::layoutChanged()
33 33 // Use reals for accurancy (we might get some compiler warnings... :)
34 34 int count = mModel.countCategories();
35 35 int itemIndex(0);
36 int labelIndex(0);
36 37 qreal tW = mWidth;
37 38 qreal tC = count+1;
38 39 qreal xStep = (tW/tC);
39 40 qreal xPos = ((tW/tC) - mBarDefaultWidth / 2);
40 int labelIndex = mModel.countCategories() * mModel.countSets();
41 qreal h = mHeight;
41 42
42 43 for (int category = 0; category < mModel.countCategories(); category++) {
43 44 qreal colSum = mModel.categorySum(category);
44 qreal h = mHeight;
45 45 qreal scale = (h / colSum);
46 46 qreal yPos = h;
47 47 for (int set=0; set < mModel.countSets(); set++) {
48 48 qreal barHeight = mModel.valueAt(set, category) * scale;
49 Bar* bar = reinterpret_cast<Bar*> (childItems().at(itemIndex));
49 Bar* bar = mBars.at(itemIndex);
50 50
51 51 // TODO: width settable per bar?
52 52 bar->resize(mBarDefaultWidth, barHeight);
@@ -57,21 +57,44 void PercentBarPresenter::layoutChanged()
57 57 }
58 58
59 59 // TODO: Layout for labels, remove magic number
60 BarLabel* label = reinterpret_cast<BarLabel*> (childItems().at(labelIndex));
60 BarLabel* label = mLabels.at(labelIndex);
61 61 label->setPos(xPos, mHeight + 20);
62 62 labelIndex++;
63 63 xPos += xStep;
64 64 }
65 65
66 66 // Position separators
67 int separatorIndex = labelIndex; // Separators are after labels in childItems(). TODO: better way to store these?
68 xPos = xStep + xStep/2; // Initial position is between first and second group. ie one and half steps from left.
67 xPos = xStep + xStep/2;
69 68 for (int s=0; s < mModel.countCategories() - 1; s++) {
70 Separator* sep = reinterpret_cast<Separator*> (childItems().at(separatorIndex));
69 Separator* sep = mSeparators.at(s);
71 70 sep->setPos(xPos,0);
72 71 sep->setSize(QSizeF(1,mHeight));
73 72 xPos += xStep;
74 separatorIndex++;
73 }
74
75 // Position floating values
76 itemIndex = 0;
77 xPos = ((tW/tC) - mBarDefaultWidth / 2);
78 for (int category=0; category < mModel.countCategories(); category++) {
79 qreal yPos = h;
80 qreal colSum = mModel.categorySum(category);
81 qreal scale = (h / colSum);
82 for (int set=0; set < mModel.countSets(); set++) {
83 qreal barHeight = mModel.valueAt(set,category) * scale;
84 BarValue* value = mFloatingValues.at(itemIndex);
85
86 // TODO: remove hard coding, apply layout
87 value->setPos(xPos + mBarDefaultWidth/2, yPos-barHeight/2);
88 value->setPen(QPen(QColor(255,255,255,255)));
89
90 QString vString(QString::number(mModel.percentageAt(set,category) * 100));
91 vString.append("%");
92 value->setValueString(vString);
93
94 itemIndex++;
95 yPos -= barHeight;
96 }
97 xPos += xStep;
75 98 }
76 99
77 100 mLayoutDirty = true;
@@ -5,6 +5,7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
5 5
6 6 QBarSet::QBarSet()
7 7 {
8 mFloatingValuesVisible = false;
8 9 }
9 10
10 11 void QBarSet::setName(QString name)
@@ -57,11 +58,29 const QBrush& QBarSet::brush() const
57 58 return mBrush;
58 59 }
59 60
61 bool QBarSet::isFloatingValuesVisible()
62 {
63 return mFloatingValuesVisible;
64 }
65
60 66 void QBarSet::barClicked()
61 67 {
68 qDebug() << "QBarset::barClicked";
62 69 // Some bar of this set has been clicked
63 70 // TODO: What happens then?
64 qDebug() << "bar Clicked";
71 emit clicked(); // Notify that set has been clicked
72 }
73
74 void QBarSet::toggleFloatingValuesVisible()
75 {
76 qDebug() << "QBarset::toggleFloatingValuesVisible";
77 // TODO: toggle vs explicit set?
78 if (mFloatingValuesVisible) {
79 mFloatingValuesVisible=false;
80 } else {
81 mFloatingValuesVisible=true;
82 }
83 emit setFloatingValuesVisible(this);
65 84 }
66 85
67 86
@@ -27,7 +27,11 public:
27 27 void setBrush(const QBrush& brush);
28 28 const QBrush& brush() const;
29 29
30 // void clicked();
30 bool isFloatingValuesVisible();
31
32 Q_SIGNALS:
33 void clicked();
34 void setFloatingValuesVisible(QBarSet* set);
31 35 /*
32 36 void hoverEnter();
33 37 void hoverLeave();
@@ -35,6 +39,7 public:
35 39
36 40 public Q_SLOTS:
37 41 void barClicked();
42 void toggleFloatingValuesVisible();
38 43
39 44 private:
40 45
@@ -43,6 +48,7 private:
43 48 QPen mPen;
44 49 QBrush mBrush;
45 50
51 bool mFloatingValuesVisible;
46 52 };
47 53
48 54 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,6 +1,7
1 1 #include "stackedbarpresenter.h"
2 2 #include "bar_p.h"
3 3 #include "barlabel_p.h"
4 #include "barvalue_p.h"
4 5 #include "separator_p.h"
5 6 #include "qbarset.h"
6 7 #include <QDebug>
@@ -14,7 +15,6 StackedBarPresenter::StackedBarPresenter(BarChartModel& model, QGraphicsItem *pa
14 15
15 16 void StackedBarPresenter::layoutChanged()
16 17 {
17 // qDebug() << "StackedBarGroup::layoutChanged";
18 18 // Scale bars to new layout
19 19 // Layout for bars:
20 20 if (mModel.countSets() <= 0) {
@@ -30,7 +30,7 void StackedBarPresenter::layoutChanged()
30 30 }
31 31
32 32 if (childItems().count() == 0) {
33 qDebug() << "WARNING: StackedBarGroup::layoutChanged called before graphics items are created!";
33 qDebug() << "WARNING: StackedBarPresenter::layoutChanged called before graphics items are created!";
34 34 return;
35 35 }
36 36
@@ -42,17 +42,17 void StackedBarPresenter::layoutChanged()
42 42 qreal scale = (h / maxSum);
43 43
44 44 int itemIndex(0);
45 int labelIndex(0);
45 46 qreal tW = mWidth;
46 47 qreal tC = mModel.countCategories() + 1;
47 48 qreal xStep = (tW/tC);
48 49 qreal xPos = ((tW/tC) - mBarDefaultWidth / 2);
49 int labelIndex = mModel.countSets() * mModel.countCategories();
50 50
51 51 for (int category = 0; category < mModel.countCategories(); category++) {
52 52 qreal yPos = h;
53 53 for (int set=0; set < mModel.countSets(); set++) {
54 54 qreal barHeight = mModel.valueAt(set, category) * scale;
55 Bar* bar = reinterpret_cast<Bar*> (childItems().at(itemIndex));
55 Bar* bar = mBars.at(itemIndex);
56 56
57 57 bar->resize(mBarDefaultWidth, barHeight);
58 58 bar->setBrush(mModel.setAt(set).brush());
@@ -62,21 +62,42 void StackedBarPresenter::layoutChanged()
62 62 }
63 63
64 64 // TODO: Layout for labels, remove magic number
65 BarLabel* label = reinterpret_cast<BarLabel*> (childItems().at(labelIndex));
65 BarLabel* label = mLabels.at(labelIndex);
66 66 label->setPos(xPos, mHeight + 20);
67 67 labelIndex++;
68 68 xPos += xStep;
69 69 }
70 70
71 71 // Position separators
72 int separatorIndex = labelIndex; // Separators are after labels in childItems(). TODO: better way to store these?
73 xPos = xStep + xStep/2; // Initial position is between first and second group. ie one and half steps from left.
72 xPos = xStep + xStep/2;
74 73 for (int s=0; s < mModel.countCategories() - 1; s++) {
75 Separator* sep = reinterpret_cast<Separator*> (childItems().at(separatorIndex));
74 Separator* sep = mSeparators.at(s);
76 75 sep->setPos(xPos,0);
77 76 sep->setSize(QSizeF(1,mHeight));
78 77 xPos += xStep;
79 separatorIndex++;
78 }
79
80 // Position floating values
81 itemIndex = 0;
82 xPos = ((tW/tC) - mBarDefaultWidth / 2);
83 for (int category=0; category < mModel.countCategories(); category++) {
84 qreal yPos = h;
85 for (int set=0; set < mModel.countSets(); set++) {
86 qreal barHeight = mModel.valueAt(set,category) * scale;
87 BarValue* value = mFloatingValues.at(itemIndex);
88
89 // TODO: remove hard coding, apply layout
90 value->resize(100,50);
91 value->setPos(xPos + mBarDefaultWidth/2, yPos-barHeight/2);
92 value->setPen(QPen(QColor(255,255,255,255)));
93
94 QString vString(QString::number(mModel.valueAt(set,category)));
95 value->setValueString(vString);
96
97 itemIndex++;
98 yPos -= barHeight;
99 }
100 xPos += xStep;
80 101 }
81 102
82 103 mLayoutDirty = true;
@@ -1,5 +1,5
1 #ifndef STACKEDBARGROUP_H
2 #define STACKEDBARGROUP_H
1 #ifndef STACKEDBARPRESENTER_H
2 #define STACKEDBARPRESENTER_H
3 3
4 4 #include "barpresenterbase.h"
5 5 #include "qstackedbarchartseries.h"
@@ -13,7 +13,7 public:
13 13 StackedBarPresenter(BarChartModel& model, QGraphicsItem *parent = 0);
14 14
15 15 private:
16 // From BarGroupBase
16 // From BarPresenterBase
17 17 void layoutChanged(); // layout has changed -> need to recalculate bar sizes
18 18
19 19 private:
@@ -23,4 +23,4 private:
23 23
24 24 QTCOMMERCIALCHART_END_NAMESPACE
25 25
26 #endif // STACKEDBARGROUP_H
26 #endif // STACKEDBARPRESENTER_H
@@ -168,16 +168,36 void ChartDataSet::removeSeries(QChartSeries* series)
168 168 emit seriesRemoved(series);
169 169 m_seriesMap.remove(axis,series);
170 170 //remove axis if no longer there
171 if(!m_seriesMap.contains(axis) && axis != m_axisY){
171 if(!m_seriesMap.contains(axis)){
172 172 emit axisRemoved(axis);
173 173 m_domainMap.remove(axis);
174 if(axis != m_axisY)
174 175 delete axis;
175 176 }
177 series->setParent(0);
176 178 break;
177 179 }
178 180 }
179 181 }
180 182
183 void ChartDataSet::removeAllSeries()
184 {
185 QList<QChartAxis*> keys = m_seriesMap.uniqueKeys();
186 foreach(QChartAxis* axis , keys) {
187 QList<QChartSeries*> seriesList = m_seriesMap.values(axis);
188 for(int i =0 ; i < seriesList.size();i++ )
189 {
190 emit seriesRemoved(seriesList.at(i));
191 delete(seriesList.at(i));
192 }
193 m_seriesMap.remove(axis);
194 m_domainMap.remove(axis);
195 emit axisRemoved(axis);
196 if(axis != m_axisY) delete axis;
197 }
198 m_domainIndex=0;
199 }
200
181 201 bool ChartDataSet::nextDomain()
182 202 {
183 203 int limit = (m_domainMap.values().size()/m_domainMap.uniqueKeys().size())-1;
@@ -207,10 +227,13 bool ChartDataSet::previousDomain()
207 227 void ChartDataSet::setDomain(int index)
208 228 {
209 229 QList<QChartAxis*> domainList = m_domainMap.uniqueKeys();
230
231 Domain domain;
232
210 233 foreach (QChartAxis* axis , domainList) {
211 234 int i = m_domainMap.count(axis) - index -1;
212 235 Q_ASSERT(i>=0);
213 Domain domain = m_domainMap.values(axis).at(i);
236 domain = m_domainMap.values(axis).at(i);
214 237 QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY);
215 238 QList<QChartSeries*> seriesList = m_seriesMap.values(axis);
216 239 foreach(QChartSeries* series, seriesList) {
@@ -219,7 +242,6 void ChartDataSet::setDomain(int index)
219 242 emit axisLabelsChanged(axis,labels);
220 243 }
221 244
222 Domain domain = m_domainMap.value(axisY());
223 245 QStringList labels = createLabels(axisX(),domain.m_minX,domain.m_maxX);
224 246 emit axisLabelsChanged(axisX(),labels);
225 247 }
@@ -254,8 +276,10 void ChartDataSet::addDomain(const QRectF& rect, const QRectF& viewport)
254 276
255 277 QList<QChartAxis*> domainList = m_domainMap.uniqueKeys();
256 278
279 Domain domain;
280
257 281 foreach (QChartAxis* axis , domainList){
258 Domain domain(m_domainMap.value(axis).subDomain(rect,viewport.width(),viewport.height()));
282 domain = m_domainMap.value(axis).subDomain(rect,viewport.width(),viewport.height());
259 283 QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY);
260 284 QList<QChartSeries*> seriesList = m_seriesMap.values(axis);
261 285 foreach(QChartSeries* series, seriesList){
@@ -265,7 +289,6 void ChartDataSet::addDomain(const QRectF& rect, const QRectF& viewport)
265 289 m_domainMap.insert(axis,domain);
266 290 }
267 291
268 Domain domain = m_domainMap.value(axisY());
269 292 QStringList labels = createLabels(axisX(),domain.m_minX,domain.m_maxX);
270 293 emit axisLabelsChanged(axisX(),labels);
271 294
@@ -18,6 +18,7 public:
18 18
19 19 void addSeries(QChartSeries* series,QChartAxis *axisY = 0);
20 20 void removeSeries(QChartSeries* series);
21 void removeAllSeries();
21 22 void addDomain(const QRectF& rect, const QRectF& viewport);
22 23 bool nextDomain();
23 24 bool previousDomain();
@@ -84,6 +84,9 void ChartPresenter::handleAxisAdded(QChartAxis* axis)
84 84 }
85 85 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
86 86 QObject::connect(axis,SIGNAL(update(QChartAxis*)),item,SLOT(handleAxisUpdate(QChartAxis*)));
87
88 item->handleAxisUpdate(axis);
89 item->handleGeometryChanged(m_rect);
87 90 m_chartTheme->decorate(axis,item);
88 91 m_axisItems.insert(axis,item);
89 92 }
@@ -20,6 +20,8 class ChartPresenter: public QObject
20 20 {
21 21 Q_OBJECT
22 22 public:
23 enum ZValues { BackgroundZValue = -1 , ShadesZValue, GridZValue, AxisZValue , LineChartZValue };
24
23 25 ChartPresenter(QChart* chart,ChartDataSet *dataset);
24 26 virtual ~ChartPresenter();
25 27
@@ -15,7 +15,7 m_dirtyData(false),
15 15 m_dirtyGeometry(false),
16 16 m_dirtyDomain(false)
17 17 {
18
18 setZValue(ChartPresenter::LineChartZValue);
19 19 }
20 20
21 21 QRectF LineChartItem::boundingRect() const
@@ -6,21 +6,44
6 6 #include <QGraphicsSceneResizeEvent>
7 7 #include <QDebug>
8 8
9 /*!
10 \class QChart
11 \brief QtCommercial chart API.
12
13 QChart is a QGraphicsWidget that you can show in a QGraphicsScene. It manages the graphical
14 representation of different types of QChartSeries and other chart related objects like
15 QChartAxis and QChartLegend. If you simply want to show a chart in a layout, you can use the
16 convenience class QChartView instead of QChart.
17 */
18
9 19 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 20
21 /*!
22 Constructs a chart object which is a child of parent.
23 */
11 24 QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags),
12 m_backgroundItem(0),
13 m_titleItem(0),
14 m_dataset(new ChartDataSet(this)),
15 m_presenter(new ChartPresenter(this,m_dataset))
25 m_backgroundItem(0),
26 m_titleItem(0),
27 m_dataset(new ChartDataSet(this)),
28 m_presenter(new ChartPresenter(this,m_dataset))
16 29 {
17 30 }
18 31
19 QChart::~QChart() {}
32 /*!
33 Destroys the object and it's children, like QChartSeries and QChartAxis object added to it.
34 */
35 QChart::~QChart()
36 {
37 }
20 38
21 void QChart::addSeries(QChartSeries* series,QChartAxis* axisY)
39 /*!
40 Adds the series and optional y axis onto the chart and takes the ownership of the objects.
41 If auto scaling is enabled, re-scales the axes the series is bound to (both the x axis and
42 the y axis).
43 */
44 void QChart::addSeries(QChartSeries* series, QChartAxis* axisY)
22 45 {
23 m_dataset->addSeries(series,axisY);
46 m_dataset->addSeries(series, axisY);
24 47 }
25 48
26 49 void QChart::removeSeries(QChartSeries* series)
@@ -28,6 +51,11 void QChart::removeSeries(QChartSeries* series)
28 51 m_dataset->removeSeries(series);
29 52 }
30 53
54 void QChart::removeAllSeries()
55 {
56 m_dataset->removeAllSeries();
57 }
58
31 59 void QChart::setChartBackgroundBrush(const QBrush& brush)
32 60 {
33 61 createChartBackgroundItem();
@@ -58,13 +86,16 void QChart::createChartBackgroundItem()
58 86 {
59 87 if(!m_backgroundItem) {
60 88 m_backgroundItem = new QGraphicsRectItem(this);
61 m_backgroundItem->setZValue(-1);
89 m_backgroundItem->setZValue(ChartPresenter::BackgroundZValue);
62 90 }
63 91 }
64 92
65 93 void QChart::createChartTitleItem()
66 94 {
67 if(!m_titleItem) m_titleItem = new QGraphicsTextItem(this);
95 if(!m_titleItem) {
96 m_titleItem = new QGraphicsTextItem(this);
97 m_titleItem->setZValue(ChartPresenter::BackgroundZValue);
98 }
68 99 }
69 100
70 101 int QChart::margin() const
@@ -1,5 +1,5
1 #ifndef CHART_H
2 #define CHART_H
1 #ifndef QCHART_H
2 #define QCHART_H
3 3
4 4 #include <qchartglobal.h>
5 5 #include <qchartseries.h>
@@ -21,9 +21,6 class ChartItem;
21 21 class ChartDataSet;
22 22 class ChartPresenter;
23 23
24 /*!
25 * TODO: define the responsibilities
26 */
27 24 class QTCOMMERCIALCHART_EXPORT QChart : public QGraphicsWidget
28 25 {
29 26 Q_OBJECT
@@ -34,7 +31,7 public:
34 31 ChartThemeVanilla,
35 32 ChartThemeIcy,
36 33 ChartThemeGrayscale,
37 ChartThemeScientific,
34 ChartThemeScientific
38 35 //ChartThemeUnnamed1
39 36 };
40 37
@@ -42,8 +39,9 public:
42 39 QChart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
43 40 ~QChart();
44 41
45 void addSeries(QChartSeries* series,QChartAxis *axisY=0);
46 void removeSeries(QChartSeries* series);
42 void addSeries(QChartSeries* series, QChartAxis* axisY = 0);
43 void removeSeries(QChartSeries* series); //returns ownership , deletes axis if no series attached
44 void removeAllSeries(); // deletes series and axis
47 45
48 46 void setMargin(int margin);
49 47 int margin() const;
@@ -51,6 +51,11 void QChartView::removeSeries(QChartSeries* series)
51 51 m_chart->removeSeries(series);
52 52 }
53 53
54 void QChartView::removeAllSeries()
55 {
56 m_chart->removeAllSeries();
57 }
58
54 59 void QChartView::zoomIn()
55 60 {
56 61 m_chart->zoomIn();
@@ -24,8 +24,9 public:
24 24 //implement from QWidget
25 25 void resizeEvent(QResizeEvent *event);
26 26
27 void addSeries(QChartSeries* series,QChartAxis* axisY=0);// takes ownership
28 void removeSeries(QChartSeries* series);
27 void addSeries(QChartSeries* series,QChartAxis* axisY=0);// takes series ownership , takes axis ownership
28 void removeSeries(QChartSeries* series); //returns ownership , deletes axis if no series attached
29 void removeAllSeries(); // deletes series and axis
29 30 int margin() const;
30 31
31 32 void setChartTitle(const QString& title);
@@ -15,23 +15,86 QScatterSeriesPrivate::QScatterSeriesPrivate() :
15 15 m_markerBrush.setColor(QColor::Invalid);
16 16 }
17 17
18 /*!
19 \enum QScatterSeries::MarkerShape
20
21 This enum describes the shape used when rendering marker items.
22
23 \value MarkerShapeDefault
24 \value MarkerShapePoint
25 \value MarkerShapeX
26 \value MarkerShapeRectangle
27 \value MarkerShapeTiltedRectangle
28 \value MarkerShapeTriangle
29 \value MarkerShapeCircle
30 */
31
32 /*!
33 \class QScatterSeries
34 \brief QtCommercial Chart series API for showing scatter series.
35
36 Example on how to create a chart with scatter series:
37 \code
38 #include <qchartglobal.h>
39 #include <qchartview.h>
40 #include <qscatterseries.h>
41 ...
42 QTCOMMERCIALCHART_USE_NAMESPACE
43
44 // Create chart widget
45 QChartView *chartView = new QChartView();
46 QScatterSeries *scatter = new QScatterSeries();
47 *scatter << QPointF(0.5, 5.0) << QPointF(1.0, 4.5) << QPointF(1.0, 5.5) << QPointF(1.5, 5.0);
48 chartView->addSeries(scatter);
49 // Then add the QChartView into a layout...
50 \endcode
51
52 The example code would result the following:
53
54 \image scatter_example1.jpg
55 */
56
57 /*!
58 Constructs a series object which is a child of \a parent.
59 */
18 60 QScatterSeries::QScatterSeries(QObject *parent) :
19 61 QChartSeries(parent),
20 62 d(new QScatterSeriesPrivate())
21 63 {
22 64 }
23 65
66 /*!
67 Destroys the object. Note that adding series to QChart transfers the ownership to the chart.
68 */
24 69 QScatterSeries::~QScatterSeries()
25 70 {
26 71 delete d;
27 72 }
28 73
74 /*!
75 Add single data point to the series.
76 For example:
77 \code
78 mySeries.addData(QPointF(0.5, 5.0));
79 \endcode
80 */
29 81 void QScatterSeries::addData(QPointF value)
30 82 {
31 83 d->m_data.append(value);
32 84 emit changed();
33 85 }
34 86
87 /*!
88 Stream operator for adding a data point to the series.
89 \sa addData(), QScatterSeries::addData(QPointF value)
90
91 For example:
92 \code
93 mySeries << QPointF(0.5, 5.0)
94 << QPointF(1.0, 4.5);
95 \endcode
96
97 */
35 98 QScatterSeries& QScatterSeries::operator << (const QPointF &value)
36 99 {
37 100 d->m_data.append(value);
@@ -39,42 +102,101 QScatterSeries& QScatterSeries::operator << (const QPointF &value)
39 102 return *this;
40 103 }
41 104
105 /*!
106 Replaces the data of the series with the given list of data points.
107 */
42 108 void QScatterSeries::setData(QList<QPointF> data)
43 109 {
44 110 d->m_data = data;
45 111 emit changed();
46 112 }
47 113
114 /*!
115 Returns the current list of data points of the series.
116 */
48 117 QList<QPointF> QScatterSeries::data()
49 118 {
50 119 return d->m_data;
51 120 }
52 121
122 /*!
123 Overrides the default pen used for drawing a marker item with a user defined pen. The default
124 pen is defined by chart theme setting.
125
126 For example:
127 \code
128 QPen pen(QColor(0, 255, 0, 80), 3);
129 myScatter->setMarkerPen(pen);
130 \endcode
131
132 Would present your scatter markers with an opaque, uglyish green outlines:
133 \image scatter_example_pen.jpg
134
135 \sa setMarkerBrush()
136 \sa QChart::setTheme()
137 */
53 138 void QScatterSeries::setMarkerPen(QPen pen)
54 139 {
55 140 d->m_markerPen = pen;
56 141 }
57 142
143 /*!
144 Returns the pen used for drawing markers.
145 */
58 146 QPen QScatterSeries::markerPen()
59 147 {
60 148 return d->m_markerPen;
61 149 }
62 150
151 /*!
152 Overrides the default brush of the marker items with a user defined brush. The default
153 brush is defined by chart theme setting.
154
155 For example:
156 \code
157 QBrush brush(QColor(255, 0, 0, 100), Qt::SolidPattern);
158 myRandomScatter->setMarkerBrush(brush);
159 \endcode
160
161 Would fill your scatter markers with an opaque red color:
162 \image scatter_example_brush.jpg
163
164 \sa setMarkerPen()
165 \sa QChart::setTheme()
166 */
63 167 void QScatterSeries::setMarkerBrush(QBrush brush)
64 168 {
65 169 d->m_markerBrush = brush;
66 170 }
67 171
172 /*!
173 Returns the brush used for drawing markers.
174 */
68 175 QBrush QScatterSeries::markerBrush()
69 176 {
70 177 return d->m_markerBrush;
71 178 }
72 179
180 /*!
181 Overrides the default shape of the marker items with a user defined shape. The default
182 shape is defined by chart theme setting.
183
184 For example:
185 \code
186 myScatter->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
187 \endcode
188
189 Would make your scatter marker items rectangle:
190 \image scatter_example_shape.jpg
191 */
73 192 void QScatterSeries::setMarkerShape(MarkerShape shape)
74 193 {
75 194 d->m_markerShape = shape;
76 195 }
77 196
197 /*!
198 Returns the shape used for drawing markers.
199 */
78 200 QScatterSeries::MarkerShape QScatterSeries::markerShape()
79 201 {
80 202 return (QScatterSeries::MarkerShape) d->m_markerShape;
@@ -45,13 +45,15 void ScatterPresenter::paint(QPainter *painter, const QStyleOptionGraphicsItem *
45 45 {
46 46 // TODO: Optimization: avoid setting on every paint method call?
47 47 // The custom settings in series override those defined by the theme
48 if (m_series->markerPen().color().isValid()) {
48 if (m_series->markerPen().color().isValid())
49 49 painter->setPen(m_series->markerPen());
50 painter->setBrush(m_series->markerBrush());
51 } else {
50 else
52 51 painter->setPen(m_markerPen);
52
53 if (m_series->markerBrush().color().isValid())
54 painter->setBrush(m_series->markerBrush());
55 else
53 56 painter->setBrush(m_markerBrush);
54 }
55 57
56 58 int shape = m_series->markerShape();
57 59
@@ -39,6 +39,8 private slots:
39 39 void nextpreviousDomain();
40 40 void removeSeries_data();
41 41 void removeSeries();
42 void removeAllSeries_data();
43 void removeAllSeries();
42 44 };
43 45
44 46 void tst_ChartDataSet::initTestCase()
@@ -189,8 +191,6 void tst_ChartDataSet::addSeries()
189 191 else
190 192 axisYCount++;
191 193
192
193
194 194 QCOMPARE(spy0.count(), axisYCount);
195 195 QCOMPARE(spy1.count(), seriesCount*2);
196 196 QCOMPARE(spy2.count(), 0);
@@ -513,6 +513,10 void tst_ChartDataSet::removeSeries()
513 513 dataSet.removeSeries(seriesList.at(i));
514 514 }
515 515
516 //default axis
517 if (axisYCount == 0)
518 axisYCount++;
519
516 520 QCOMPARE(spy0.count(), 0);
517 521 QCOMPARE(spy1.count(), 0);
518 522 QCOMPARE(spy2.count(), axisYCount);
@@ -521,8 +525,75 void tst_ChartDataSet::removeSeries()
521 525 QCOMPARE(spy5.count(), seriesCount);
522 526
523 527 QCOMPARE(dataSet.domainIndex(), 0);
528
529 qDeleteAll(seriesList);
524 530 }
525 531
532 void tst_ChartDataSet::removeAllSeries_data()
533 {
534 QTest::addColumn<int>("seriesCount");
535 QTest::addColumn<int>("axisYCount");
536 QTest::newRow("2 series, default axis") << 2 << 0;
537 QTest::newRow("2 series, 2 new axis") << 2 << 2;
538 QTest::newRow("2 series, 1 new axis") << 2 << 2;
539 QTest::newRow("3 series, 3 new axis") << 3 << 3;
540 QTest::newRow("3 series, 2 new axis") << 3 << 2;
541 QTest::newRow("3 series, 1 new axis") << 3 << 1;
542 }
543
544 void tst_ChartDataSet::removeAllSeries()
545 {
546 QFETCH(int, seriesCount);
547 QFETCH(int, axisYCount);
548
549 ChartDataSet dataSet;
550
551 QList<QChartAxis*> axisList;
552
553 for (int i = 0; i < axisYCount; i++) {
554 QChartAxis* axis = new QChartAxis();
555 axisList << axis;
556 }
557
558 QList<QChartAxis*>::iterator iterator = axisList.begin();
559
560 for (int i = 0; i < seriesCount; i++) {
561 QChartAxis* axisY = 0;
562 QLineChartSeries* series = new QLineChartSeries();
563 if (iterator != axisList.end()) {
564 axisY = *iterator;
565 iterator++;
566 } else if (axisList.count() > 0) {
567 iterator--;
568 axisY = *iterator;
569 iterator++;
570 }
571 dataSet.addSeries(series, axisY);
572 }
573
574 QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*)));
575 QSignalSpy spy1(&dataSet, SIGNAL(axisLabelsChanged(QChartAxis*, QStringList const&)));
576 QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*)));
577 QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QChartSeries*)));
578 QSignalSpy spy4(&dataSet, SIGNAL(seriesDomainChanged(QChartSeries*, Domain const&)));
579 QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QChartSeries*)));
580
581 dataSet.removeAllSeries();
582 //default axis
583 if (axisYCount == 0)
584 axisYCount++;
585
586 QCOMPARE(spy0.count(), 0);
587 QCOMPARE(spy1.count(), 0);
588 QCOMPARE(spy2.count(), axisYCount);
589 QCOMPARE(spy3.count(), 0);
590 QCOMPARE(spy4.count(), 0);
591 QCOMPARE(spy5.count(), seriesCount);
592
593 QCOMPARE(dataSet.domainIndex(), 0);
594 }
595
596
526 597 QTEST_MAIN(tst_ChartDataSet)
527 598 #include "tst_chartdataset.moc"
528 599
@@ -8,7 +8,7 Q_DECL_EXPORT int main(int argc, char *argv[])
8 8 QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());
9 9
10 10 viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
11 viewer->setMainQmlFile(QLatin1String("qml/qmlchart/main.qml"));
11 viewer->setSource(QUrl("qrc:/qml/qmlchart/loader.qml"));
12 12 viewer->showExpanded();
13 13
14 14 return app->exec();
@@ -2,8 +2,8 import QtQuick 1.0
2 2 import QtCommercial.Chart 1.0
3 3
4 4 Rectangle {
5 width: 360
6 height: 360
5 width: parent.width
6 height: parent.height
7 7
8 8 // Another option for QML data api:
9 9 // ListModel {
@@ -1,18 +1,21
1 1 !include( ../../common.pri ) {
2 2 error( "Couldn't find the common.pri file!" )
3 3 }
4 !include( ../../integrated.pri ) {
5 error( "Couldn't find the integrated.pri file !")
6 }
7 4
8 integrated_build: {
9 # cannot use integrated build for now; we would need the qml files copied to
10 # charts/bin folder also to make this work. And even in that case I'm not sure if
11 # the chart qml plugin can be found or if it needs to be installed to the qt's plugin
12 # folder always.
13 warning("TODO: Charts qml test app does not work with integrated builds")
5 DESTDIR = $$CHART_BUILD_BIN_DIR
6
7 OBJECTS_DIR = $$CHART_BUILD_DIR/bin/$$TARGET
8 MOC_DIR = $$CHART_BUILD_DIR/bin/$$TARGET
9 UI_DIR = $$CHART_BUILD_DIR/bin/$$TARGET
10 RCC_DIR = $$CHART_BUILD_DIR/bin/$$TARGET
11
12 integrated_build:{
13 message(Please export QML_IMPORT_PATH=$$CHART_BUILD_LIB_DIR)
14 14 }
15 15
16 RESOURCES += \
17 resources.qrc
18
16 19 # Add more folders to ship with the application, here
17 20 folder_01.source = qml/qmlchart
18 21 folder_01.target = qml
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now