##// END OF EJS Templates
pie: prevent adding same slice to two series
Jani Honkonen -
r1324:89f2ab72ea24
parent child
Show More
@@ -1,667 +1,672
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2012 Digia Plc
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qpieseries.h"
21 #include "qpieseries.h"
22 #include "qpieseries_p.h"
22 #include "qpieseries_p.h"
23 #include "qpieslice.h"
23 #include "qpieslice.h"
24 #include "qpieslice_p.h"
24 #include "qpieslice_p.h"
25 #include "pieslicedata_p.h"
25 #include "pieslicedata_p.h"
26 #include "chartdataset_p.h"
26 #include "chartdataset_p.h"
27 #include "charttheme_p.h"
27 #include "charttheme_p.h"
28 #include "chartanimator_p.h"
28 #include "chartanimator_p.h"
29 #include "legendmarker_p.h"
29 #include "legendmarker_p.h"
30
30
31 QTCOMMERCIALCHART_BEGIN_NAMESPACE
31 QTCOMMERCIALCHART_BEGIN_NAMESPACE
32
32
33 /*!
33 /*!
34 \class QPieSeries
34 \class QPieSeries
35 \brief Pie series API for QtCommercial Charts
35 \brief Pie series API for QtCommercial Charts
36
36
37 The pie series defines a pie chart which consists of pie slices which are defined as QPieSlice objects.
37 The pie series defines a pie chart which consists of pie slices which are defined as QPieSlice objects.
38 The slices can have any values as the QPieSeries will calculate its relative value to the sum of all slices.
38 The slices can have any values as the QPieSeries will calculate its relative value to the sum of all slices.
39 The actual slice size is determined by that relative value.
39 The actual slice size is determined by that relative value.
40
40
41 Pie size and position on the chart is controlled by using relative values which range from 0.0 to 1.0
41 Pie size and position on the chart is controlled by using relative values which range from 0.0 to 1.0
42 These relate to the actual chart rectangle.
42 These relate to the actual chart rectangle.
43
43
44 By default the pie is defined as a full pie but it can also be a partial pie.
44 By default the pie is defined as a full pie but it can also be a partial pie.
45 This can be done by setting a starting angle and angle span to the series.
45 This can be done by setting a starting angle and angle span to the series.
46 Full pie is 360 degrees where 0 is at 12 a'clock.
46 Full pie is 360 degrees where 0 is at 12 a'clock.
47
47
48 See the \l {PieChart Example} {pie chart example} to learn how to create a simple pie chart.
48 See the \l {PieChart Example} {pie chart example} to learn how to create a simple pie chart.
49 \image examples_piechart.png
49 \image examples_piechart.png
50 */
50 */
51
51
52 /*!
52 /*!
53 \property QPieSeries::horizontalPosition
53 \property QPieSeries::horizontalPosition
54 \brief Defines the horizontal position of the pie.
54 \brief Defines the horizontal position of the pie.
55
55
56 The value is a relative value to the chart rectangle where:
56 The value is a relative value to the chart rectangle where:
57
57
58 \list
58 \list
59 \o 0.0 is the absolute left.
59 \o 0.0 is the absolute left.
60 \o 1.0 is the absolute right.
60 \o 1.0 is the absolute right.
61 \endlist
61 \endlist
62
62
63 Default value is 0.5 (center).
63 Default value is 0.5 (center).
64
64
65 \sa verticalPosition
65 \sa verticalPosition
66 */
66 */
67
67
68 /*!
68 /*!
69 \fn void QPieSeries::horizontalPositionChanged()
69 \fn void QPieSeries::horizontalPositionChanged()
70
70
71 Emitted then the horizontal position of the pie has changed.
71 Emitted then the horizontal position of the pie has changed.
72
72
73 \sa horizontalPosition
73 \sa horizontalPosition
74 */
74 */
75
75
76 /*!
76 /*!
77 \property QPieSeries::verticalPosition
77 \property QPieSeries::verticalPosition
78 \brief Defines the vertical position of the pie.
78 \brief Defines the vertical position of the pie.
79
79
80 The value is a relative value to the chart rectangle where:
80 The value is a relative value to the chart rectangle where:
81
81
82 \list
82 \list
83 \o 0.0 is the absolute top.
83 \o 0.0 is the absolute top.
84 \o 1.0 is the absolute bottom.
84 \o 1.0 is the absolute bottom.
85 \endlist
85 \endlist
86
86
87 Default value is 0.5 (center).
87 Default value is 0.5 (center).
88
88
89 \sa horizontalPosition
89 \sa horizontalPosition
90 */
90 */
91
91
92 /*!
92 /*!
93 \fn void QPieSeries::verticalPositionChanged()
93 \fn void QPieSeries::verticalPositionChanged()
94
94
95 Emitted then the vertical position of the pie has changed.
95 Emitted then the vertical position of the pie has changed.
96
96
97 \sa verticalPosition
97 \sa verticalPosition
98 */
98 */
99
99
100 /*!
100 /*!
101 \property QPieSeries::size
101 \property QPieSeries::size
102 \brief Defines the pie size.
102 \brief Defines the pie size.
103
103
104 The value is a relative value to the chart rectangle where:
104 The value is a relative value to the chart rectangle where:
105
105
106 \list
106 \list
107 \o 0.0 is the minimum size (pie not drawn).
107 \o 0.0 is the minimum size (pie not drawn).
108 \o 1.0 is the maximum size that can fit the chart.
108 \o 1.0 is the maximum size that can fit the chart.
109 \endlist
109 \endlist
110
110
111 Default value is 0.7.
111 Default value is 0.7.
112 */
112 */
113
113
114 /*!
114 /*!
115 \fn void QPieSeries::pieSizeChanged()
115 \fn void QPieSeries::pieSizeChanged()
116
116
117 Emitted when the pie size has changed.
117 Emitted when the pie size has changed.
118
118
119 \sa size
119 \sa size
120 */
120 */
121
121
122 /*!
122 /*!
123 \property QPieSeries::startAngle
123 \property QPieSeries::startAngle
124 \brief Defines the starting angle of the pie.
124 \brief Defines the starting angle of the pie.
125
125
126 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
126 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
127
127
128 Default is value is 0.
128 Default is value is 0.
129 */
129 */
130
130
131 /*!
131 /*!
132 \fn void QPieSeries::pieStartAngleChanged()
132 \fn void QPieSeries::pieStartAngleChanged()
133
133
134 Emitted when the starting angle of the pie has changed.
134 Emitted when the starting angle of the pie has changed.
135
135
136 \sa startAngle
136 \sa startAngle
137 */
137 */
138
138
139 /*!
139 /*!
140 \property QPieSeries::endAngle
140 \property QPieSeries::endAngle
141 \brief Defines the ending angle of the pie.
141 \brief Defines the ending angle of the pie.
142
142
143 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
143 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
144
144
145 Default is value is 360.
145 Default is value is 360.
146 */
146 */
147
147
148 /*!
148 /*!
149 \fn void QPieSeries::pieEndAngleChanged()
149 \fn void QPieSeries::pieEndAngleChanged()
150
150
151 Emitted when the ending angle of the pie has changed.
151 Emitted when the ending angle of the pie has changed.
152
152
153 \sa endAngle
153 \sa endAngle
154 */
154 */
155
155
156 /*!
156 /*!
157 \property QPieSeries::count
157 \property QPieSeries::count
158
158
159 Number of slices in the series.
159 Number of slices in the series.
160 */
160 */
161
161
162 /*!
162 /*!
163 \fn void QPieSeries::countChanged()
163 \fn void QPieSeries::countChanged()
164
164
165 Emitted when the slice count has changed.
165 Emitted when the slice count has changed.
166
166
167 \sa count
167 \sa count
168 */
168 */
169
169
170 /*!
170 /*!
171 \property QPieSeries::sum
171 \property QPieSeries::sum
172
172
173 Sum of all slices.
173 Sum of all slices.
174
174
175 The series keeps track of the sum of all slices it holds.
175 The series keeps track of the sum of all slices it holds.
176 */
176 */
177
177
178 /*!
178 /*!
179 \fn void QPieSeries::sumChanged()
179 \fn void QPieSeries::sumChanged()
180
180
181 Emitted when the sum of all slices has changed.
181 Emitted when the sum of all slices has changed.
182
182
183 \sa sum
183 \sa sum
184 */
184 */
185
185
186 /*!
186 /*!
187 \fn void QPieSeries::added(QList<QPieSlice*> slices)
187 \fn void QPieSeries::added(QList<QPieSlice*> slices)
188
188
189 This signal is emitted when \a slices have been added to the series.
189 This signal is emitted when \a slices have been added to the series.
190
190
191 \sa append(), insert()
191 \sa append(), insert()
192 */
192 */
193
193
194 /*!
194 /*!
195 \fn void QPieSeries::removed(QList<QPieSlice*> slices)
195 \fn void QPieSeries::removed(QList<QPieSlice*> slices)
196
196
197 This signal is emitted when \a slices have been removed from the series.
197 This signal is emitted when \a slices have been removed from the series.
198
198
199 \sa remove()
199 \sa remove()
200 */
200 */
201
201
202 /*!
202 /*!
203 \fn void QPieSeries::clicked(QPieSlice* slice)
203 \fn void QPieSeries::clicked(QPieSlice* slice)
204
204
205 This signal is emitted when a \a slice has been clicked.
205 This signal is emitted when a \a slice has been clicked.
206
206
207 \sa QPieSlice::clicked()
207 \sa QPieSlice::clicked()
208 */
208 */
209
209
210 /*!
210 /*!
211 \fn void QPieSeries::hovered(QPieSlice* slice, bool state)
211 \fn void QPieSeries::hovered(QPieSlice* slice, bool state)
212
212
213 This signal is emitted when user has hovered over or away from the \a slice.
213 This signal is emitted when user has hovered over or away from the \a slice.
214
214
215 \a state is true when user has hovered over the slice and false when hover has moved away from the slice.
215 \a state is true when user has hovered over the slice and false when hover has moved away from the slice.
216
216
217 \sa QPieSlice::hovered()
217 \sa QPieSlice::hovered()
218 */
218 */
219
219
220 /*!
220 /*!
221 Constructs a series object which is a child of \a parent.
221 Constructs a series object which is a child of \a parent.
222 */
222 */
223 QPieSeries::QPieSeries(QObject *parent) :
223 QPieSeries::QPieSeries(QObject *parent) :
224 QAbstractSeries(*new QPieSeriesPrivate(this),parent)
224 QAbstractSeries(*new QPieSeriesPrivate(this),parent)
225 {
225 {
226
226
227 }
227 }
228
228
229 /*!
229 /*!
230 Destroys the series and its slices.
230 Destroys the series and its slices.
231 */
231 */
232 QPieSeries::~QPieSeries()
232 QPieSeries::~QPieSeries()
233 {
233 {
234 // NOTE: d_prt destroyed by QObject
234 // NOTE: d_prt destroyed by QObject
235 }
235 }
236
236
237 /*!
237 /*!
238 Returns QChartSeries::SeriesTypePie.
238 Returns QChartSeries::SeriesTypePie.
239 */
239 */
240 QAbstractSeries::SeriesType QPieSeries::type() const
240 QAbstractSeries::SeriesType QPieSeries::type() const
241 {
241 {
242 return QAbstractSeries::SeriesTypePie;
242 return QAbstractSeries::SeriesTypePie;
243 }
243 }
244
244
245 /*!
245 /*!
246 Appends a single \a slice to the series.
246 Appends a single \a slice to the series.
247 Slice ownership is passed to the series.
247 Slice ownership is passed to the series.
248
248
249 Returns true if append was succesfull.
249 Returns true if append was succesfull.
250 */
250 */
251 bool QPieSeries::append(QPieSlice* slice)
251 bool QPieSeries::append(QPieSlice* slice)
252 {
252 {
253 return append(QList<QPieSlice*>() << slice);
253 return append(QList<QPieSlice*>() << slice);
254 }
254 }
255
255
256 /*!
256 /*!
257 Appends an array of \a slices to the series.
257 Appends an array of \a slices to the series.
258 Slice ownership is passed to the series.
258 Slice ownership is passed to the series.
259
259
260 Returns true if append was successfull.
260 Returns true if append was successfull.
261 */
261 */
262 bool QPieSeries::append(QList<QPieSlice*> slices)
262 bool QPieSeries::append(QList<QPieSlice*> slices)
263 {
263 {
264 Q_D(QPieSeries);
264 Q_D(QPieSeries);
265
265
266 if (slices.count() == 0)
266 if (slices.count() == 0)
267 return false;
267 return false;
268
268
269 foreach (QPieSlice* s, slices) {
269 foreach (QPieSlice* s, slices) {
270 if (!s || d->m_slices.contains(s))
270 if (!s || d->m_slices.contains(s))
271 return false;
271 return false;
272 if (s->series()) // already added to some series
273 return false;
272 }
274 }
273
275
274 foreach (QPieSlice* s, slices) {
276 foreach (QPieSlice* s, slices) {
275 s->setParent(this);
277 s->setParent(this);
276 QPieSlicePrivate::fromSlice(s)->m_series = this;
278 QPieSlicePrivate::fromSlice(s)->m_series = this;
277 d->m_slices << s;
279 d->m_slices << s;
278 }
280 }
279
281
280 d->updateDerivativeData();
282 d->updateDerivativeData();
281
283
282 foreach (QPieSlice* s, slices) {
284 foreach (QPieSlice* s, slices) {
283 connect(s, SIGNAL(valueChanged()), d, SLOT(sliceValueChanged()));
285 connect(s, SIGNAL(valueChanged()), d, SLOT(sliceValueChanged()));
284 connect(s, SIGNAL(clicked()), d, SLOT(sliceClicked()));
286 connect(s, SIGNAL(clicked()), d, SLOT(sliceClicked()));
285 connect(s, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
287 connect(s, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
286 }
288 }
287
289
288 emit added(slices);
290 emit added(slices);
289 emit countChanged();
291 emit countChanged();
290
292
291 return true;
293 return true;
292 }
294 }
293
295
294 /*!
296 /*!
295 Appends a single \a slice to the series and returns a reference to the series.
297 Appends a single \a slice to the series and returns a reference to the series.
296 Slice ownership is passed to the series.
298 Slice ownership is passed to the series.
297 */
299 */
298 QPieSeries& QPieSeries::operator << (QPieSlice* slice)
300 QPieSeries& QPieSeries::operator << (QPieSlice* slice)
299 {
301 {
300 append(slice);
302 append(slice);
301 return *this;
303 return *this;
302 }
304 }
303
305
304
306
305 /*!
307 /*!
306 Appends a single slice to the series with give \a value and \a label.
308 Appends a single slice to the series with give \a value and \a label.
307 Slice ownership is passed to the series.
309 Slice ownership is passed to the series.
308 */
310 */
309 QPieSlice* QPieSeries::append(QString label, qreal value)
311 QPieSlice* QPieSeries::append(QString label, qreal value)
310 {
312 {
311 QPieSlice* slice = new QPieSlice(label, value);
313 QPieSlice* slice = new QPieSlice(label, value);
312 append(slice);
314 append(slice);
313 return slice;
315 return slice;
314 }
316 }
315
317
316 /*!
318 /*!
317 Inserts a single \a slice to the series before the slice at \a index position.
319 Inserts a single \a slice to the series before the slice at \a index position.
318 Slice ownership is passed to the series.
320 Slice ownership is passed to the series.
319
321
320 Returns true if insert was successfull.
322 Returns true if insert was successfull.
321 */
323 */
322 bool QPieSeries::insert(int index, QPieSlice* slice)
324 bool QPieSeries::insert(int index, QPieSlice* slice)
323 {
325 {
324 Q_D(QPieSeries);
326 Q_D(QPieSeries);
325
327
326 if (index < 0 || index > d->m_slices.count())
328 if (index < 0 || index > d->m_slices.count())
327 return false;
329 return false;
328
330
329 if (!slice || d->m_slices.contains(slice))
331 if (!slice || d->m_slices.contains(slice))
330 return false;
332 return false;
331
333
334 if (slice->series()) // already added to some series
335 return false;
336
332 slice->setParent(this);
337 slice->setParent(this);
333 QPieSlicePrivate::fromSlice(slice)->m_series = this;
338 QPieSlicePrivate::fromSlice(slice)->m_series = this;
334 d->m_slices.insert(index, slice);
339 d->m_slices.insert(index, slice);
335
340
336 d->updateDerivativeData();
341 d->updateDerivativeData();
337
342
338 connect(slice, SIGNAL(valueChanged()), d, SLOT(sliceValueChanged()));
343 connect(slice, SIGNAL(valueChanged()), d, SLOT(sliceValueChanged()));
339 connect(slice, SIGNAL(clicked()), d, SLOT(sliceClicked()));
344 connect(slice, SIGNAL(clicked()), d, SLOT(sliceClicked()));
340 connect(slice, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
345 connect(slice, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
341
346
342 emit added(QList<QPieSlice*>() << slice);
347 emit added(QList<QPieSlice*>() << slice);
343 emit countChanged();
348 emit countChanged();
344
349
345 return true;
350 return true;
346 }
351 }
347
352
348 /*!
353 /*!
349 Removes a single \a slice from the series and deletes the slice.
354 Removes a single \a slice from the series and deletes the slice.
350
355
351 Do not reference the pointer after this call.
356 Do not reference the pointer after this call.
352
357
353 Returns true if remove was successfull.
358 Returns true if remove was successfull.
354 */
359 */
355 bool QPieSeries::remove(QPieSlice* slice)
360 bool QPieSeries::remove(QPieSlice* slice)
356 {
361 {
357 Q_D(QPieSeries);
362 Q_D(QPieSeries);
358
363
359 if (!d->m_slices.removeOne(slice))
364 if (!d->m_slices.removeOne(slice))
360 return false;
365 return false;
361
366
362 d->updateDerivativeData();
367 d->updateDerivativeData();
363
368
364 emit removed(QList<QPieSlice*>() << slice);
369 emit removed(QList<QPieSlice*>() << slice);
365 emit countChanged();
370 emit countChanged();
366
371
367 delete slice;
372 delete slice;
368 slice = 0;
373 slice = 0;
369
374
370 return true;
375 return true;
371 }
376 }
372
377
373 /*!
378 /*!
374 Clears all slices from the series.
379 Clears all slices from the series.
375 */
380 */
376 void QPieSeries::clear()
381 void QPieSeries::clear()
377 {
382 {
378 Q_D(QPieSeries);
383 Q_D(QPieSeries);
379 if (d->m_slices.count() == 0)
384 if (d->m_slices.count() == 0)
380 return;
385 return;
381
386
382 QList<QPieSlice*> slices = d->m_slices;
387 QList<QPieSlice*> slices = d->m_slices;
383 foreach (QPieSlice* s, d->m_slices) {
388 foreach (QPieSlice* s, d->m_slices) {
384 d->m_slices.removeOne(s);
389 d->m_slices.removeOne(s);
385 delete s;
390 delete s;
386 }
391 }
387
392
388 d->updateDerivativeData();
393 d->updateDerivativeData();
389
394
390 emit removed(slices);
395 emit removed(slices);
391 emit countChanged();
396 emit countChanged();
392 }
397 }
393
398
394 /*!
399 /*!
395 Returns a list of slices that belong to this series.
400 Returns a list of slices that belong to this series.
396 */
401 */
397 QList<QPieSlice*> QPieSeries::slices() const
402 QList<QPieSlice*> QPieSeries::slices() const
398 {
403 {
399 Q_D(const QPieSeries);
404 Q_D(const QPieSeries);
400 return d->m_slices;
405 return d->m_slices;
401 }
406 }
402
407
403 /*!
408 /*!
404 returns the number of the slices in this series.
409 returns the number of the slices in this series.
405 */
410 */
406 int QPieSeries::count() const
411 int QPieSeries::count() const
407 {
412 {
408 Q_D(const QPieSeries);
413 Q_D(const QPieSeries);
409 return d->m_slices.count();
414 return d->m_slices.count();
410 }
415 }
411
416
412 /*!
417 /*!
413 Returns true is the series is empty.
418 Returns true is the series is empty.
414 */
419 */
415 bool QPieSeries::isEmpty() const
420 bool QPieSeries::isEmpty() const
416 {
421 {
417 Q_D(const QPieSeries);
422 Q_D(const QPieSeries);
418 return d->m_slices.isEmpty();
423 return d->m_slices.isEmpty();
419 }
424 }
420
425
421 /*!
426 /*!
422 Returns the sum of all slice values in this series.
427 Returns the sum of all slice values in this series.
423
428
424 \sa QPieSlice::value(), QPieSlice::setValue(), QPieSlice::percentage()
429 \sa QPieSlice::value(), QPieSlice::setValue(), QPieSlice::percentage()
425 */
430 */
426 qreal QPieSeries::sum() const
431 qreal QPieSeries::sum() const
427 {
432 {
428 Q_D(const QPieSeries);
433 Q_D(const QPieSeries);
429 return d->m_sum;
434 return d->m_sum;
430 }
435 }
431
436
432 void QPieSeries::setHorizontalPosition(qreal relativePosition)
437 void QPieSeries::setHorizontalPosition(qreal relativePosition)
433 {
438 {
434 Q_D(QPieSeries);
439 Q_D(QPieSeries);
435
440
436 if (relativePosition < 0.0)
441 if (relativePosition < 0.0)
437 relativePosition = 0.0;
442 relativePosition = 0.0;
438 if (relativePosition > 1.0)
443 if (relativePosition > 1.0)
439 relativePosition = 1.0;
444 relativePosition = 1.0;
440
445
441 if (!qFuzzyIsNull(d->m_pieRelativeHorPos - relativePosition)) {
446 if (!qFuzzyIsNull(d->m_pieRelativeHorPos - relativePosition)) {
442 d->m_pieRelativeHorPos = relativePosition;
447 d->m_pieRelativeHorPos = relativePosition;
443 emit horizontalPositionChanged();
448 emit horizontalPositionChanged();
444 }
449 }
445 }
450 }
446
451
447 qreal QPieSeries::horizontalPosition() const
452 qreal QPieSeries::horizontalPosition() const
448 {
453 {
449 Q_D(const QPieSeries);
454 Q_D(const QPieSeries);
450 return d->m_pieRelativeHorPos;
455 return d->m_pieRelativeHorPos;
451 }
456 }
452
457
453 void QPieSeries::setVerticalPosition(qreal relativePosition)
458 void QPieSeries::setVerticalPosition(qreal relativePosition)
454 {
459 {
455 Q_D(QPieSeries);
460 Q_D(QPieSeries);
456
461
457 if (relativePosition < 0.0)
462 if (relativePosition < 0.0)
458 relativePosition = 0.0;
463 relativePosition = 0.0;
459 if (relativePosition > 1.0)
464 if (relativePosition > 1.0)
460 relativePosition = 1.0;
465 relativePosition = 1.0;
461
466
462 if (!qFuzzyIsNull(d->m_pieRelativeVerPos - relativePosition)) {
467 if (!qFuzzyIsNull(d->m_pieRelativeVerPos - relativePosition)) {
463 d->m_pieRelativeVerPos = relativePosition;
468 d->m_pieRelativeVerPos = relativePosition;
464 emit verticalPositionChanged();
469 emit verticalPositionChanged();
465 }
470 }
466 }
471 }
467
472
468 qreal QPieSeries::verticalPosition() const
473 qreal QPieSeries::verticalPosition() const
469 {
474 {
470 Q_D(const QPieSeries);
475 Q_D(const QPieSeries);
471 return d->m_pieRelativeVerPos;
476 return d->m_pieRelativeVerPos;
472 }
477 }
473
478
474 void QPieSeries::setPieSize(qreal relativeSize)
479 void QPieSeries::setPieSize(qreal relativeSize)
475 {
480 {
476 Q_D(QPieSeries);
481 Q_D(QPieSeries);
477
482
478 if (relativeSize < 0.0)
483 if (relativeSize < 0.0)
479 relativeSize = 0.0;
484 relativeSize = 0.0;
480 if (relativeSize > 1.0)
485 if (relativeSize > 1.0)
481 relativeSize = 1.0;
486 relativeSize = 1.0;
482
487
483 if (!qFuzzyIsNull(d->m_pieRelativeSize - relativeSize)) {
488 if (!qFuzzyIsNull(d->m_pieRelativeSize - relativeSize)) {
484 d->m_pieRelativeSize = relativeSize;
489 d->m_pieRelativeSize = relativeSize;
485 emit pieSizeChanged();
490 emit pieSizeChanged();
486 }
491 }
487 }
492 }
488
493
489 qreal QPieSeries::pieSize() const
494 qreal QPieSeries::pieSize() const
490 {
495 {
491 Q_D(const QPieSeries);
496 Q_D(const QPieSeries);
492 return d->m_pieRelativeSize;
497 return d->m_pieRelativeSize;
493 }
498 }
494
499
495
500
496 void QPieSeries::setPieStartAngle(qreal angle)
501 void QPieSeries::setPieStartAngle(qreal angle)
497 {
502 {
498 Q_D(QPieSeries);
503 Q_D(QPieSeries);
499 if (qFuzzyIsNull(d->m_pieStartAngle - angle))
504 if (qFuzzyIsNull(d->m_pieStartAngle - angle))
500 return;
505 return;
501 d->m_pieStartAngle = angle;
506 d->m_pieStartAngle = angle;
502 d->updateDerivativeData();
507 d->updateDerivativeData();
503 emit pieStartAngleChanged();
508 emit pieStartAngleChanged();
504 }
509 }
505
510
506 qreal QPieSeries::pieStartAngle() const
511 qreal QPieSeries::pieStartAngle() const
507 {
512 {
508 Q_D(const QPieSeries);
513 Q_D(const QPieSeries);
509 return d->m_pieStartAngle;
514 return d->m_pieStartAngle;
510 }
515 }
511
516
512 /*!
517 /*!
513 Sets the end angle of the pie.
518 Sets the end angle of the pie.
514
519
515 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
520 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
516
521
517 \a angle must be greater than start angle.
522 \a angle must be greater than start angle.
518
523
519 \sa pieEndAngle(), pieStartAngle(), setPieStartAngle()
524 \sa pieEndAngle(), pieStartAngle(), setPieStartAngle()
520 */
525 */
521 void QPieSeries::setPieEndAngle(qreal angle)
526 void QPieSeries::setPieEndAngle(qreal angle)
522 {
527 {
523 Q_D(QPieSeries);
528 Q_D(QPieSeries);
524 if (qFuzzyIsNull(d->m_pieEndAngle - angle))
529 if (qFuzzyIsNull(d->m_pieEndAngle - angle))
525 return;
530 return;
526 d->m_pieEndAngle = angle;
531 d->m_pieEndAngle = angle;
527 d->updateDerivativeData();
532 d->updateDerivativeData();
528 emit pieEndAngleChanged();
533 emit pieEndAngleChanged();
529 }
534 }
530
535
531 /*!
536 /*!
532 Returns the end angle of the pie.
537 Returns the end angle of the pie.
533
538
534 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
539 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
535
540
536 \sa setPieEndAngle(), pieStartAngle(), setPieStartAngle()
541 \sa setPieEndAngle(), pieStartAngle(), setPieStartAngle()
537 */
542 */
538 qreal QPieSeries::pieEndAngle() const
543 qreal QPieSeries::pieEndAngle() const
539 {
544 {
540 Q_D(const QPieSeries);
545 Q_D(const QPieSeries);
541 return d->m_pieEndAngle;
546 return d->m_pieEndAngle;
542 }
547 }
543
548
544 /*!
549 /*!
545 Sets the all the slice labels \a visible or invisible.
550 Sets the all the slice labels \a visible or invisible.
546
551
547 Note that this affects only the current slices in the series.
552 Note that this affects only the current slices in the series.
548 If user adds a new slice the default label visibility is false.
553 If user adds a new slice the default label visibility is false.
549
554
550 \sa QPieSlice::isLabelVisible(), QPieSlice::setLabelVisible()
555 \sa QPieSlice::isLabelVisible(), QPieSlice::setLabelVisible()
551 */
556 */
552 void QPieSeries::setLabelsVisible(bool visible)
557 void QPieSeries::setLabelsVisible(bool visible)
553 {
558 {
554 Q_D(QPieSeries);
559 Q_D(QPieSeries);
555 foreach (QPieSlice* s, d->m_slices)
560 foreach (QPieSlice* s, d->m_slices)
556 s->setLabelVisible(visible);
561 s->setLabelVisible(visible);
557 }
562 }
558
563
559 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
564 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
560
565
561
566
562 QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) :
567 QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) :
563 QAbstractSeriesPrivate(parent),
568 QAbstractSeriesPrivate(parent),
564 m_pieRelativeHorPos(0.5),
569 m_pieRelativeHorPos(0.5),
565 m_pieRelativeVerPos(0.5),
570 m_pieRelativeVerPos(0.5),
566 m_pieRelativeSize(0.7),
571 m_pieRelativeSize(0.7),
567 m_pieStartAngle(0),
572 m_pieStartAngle(0),
568 m_pieEndAngle(360),
573 m_pieEndAngle(360),
569 m_sum(0)
574 m_sum(0)
570 {
575 {
571 }
576 }
572
577
573 QPieSeriesPrivate::~QPieSeriesPrivate()
578 QPieSeriesPrivate::~QPieSeriesPrivate()
574 {
579 {
575 }
580 }
576
581
577 void QPieSeriesPrivate::updateDerivativeData()
582 void QPieSeriesPrivate::updateDerivativeData()
578 {
583 {
579 // calculate sum of all slices
584 // calculate sum of all slices
580 qreal sum = 0;
585 qreal sum = 0;
581 foreach (QPieSlice* s, m_slices)
586 foreach (QPieSlice* s, m_slices)
582 sum += s->value();
587 sum += s->value();
583
588
584 if (!qFuzzyIsNull(m_sum - sum)) {
589 if (!qFuzzyIsNull(m_sum - sum)) {
585 m_sum = sum;
590 m_sum = sum;
586 emit q_func()->sumChanged();
591 emit q_func()->sumChanged();
587 }
592 }
588
593
589 // nothing to show..
594 // nothing to show..
590 if (qFuzzyIsNull(m_sum))
595 if (qFuzzyIsNull(m_sum))
591 return;
596 return;
592
597
593 // update slice attributes
598 // update slice attributes
594 qreal sliceAngle = m_pieStartAngle;
599 qreal sliceAngle = m_pieStartAngle;
595 qreal pieSpan = m_pieEndAngle - m_pieStartAngle;
600 qreal pieSpan = m_pieEndAngle - m_pieStartAngle;
596 QVector<QPieSlice*> changed;
601 QVector<QPieSlice*> changed;
597 foreach (QPieSlice* s, m_slices) {
602 foreach (QPieSlice* s, m_slices) {
598 QPieSlicePrivate *d = QPieSlicePrivate::fromSlice(s);
603 QPieSlicePrivate *d = QPieSlicePrivate::fromSlice(s);
599 d->setPercentage(s->value() / m_sum);
604 d->setPercentage(s->value() / m_sum);
600 d->setStartAngle(sliceAngle);
605 d->setStartAngle(sliceAngle);
601 d->setAngleSpan(pieSpan * s->percentage());
606 d->setAngleSpan(pieSpan * s->percentage());
602 sliceAngle += s->angleSpan();
607 sliceAngle += s->angleSpan();
603 }
608 }
604
609
605
610
606 emit calculatedDataChanged();
611 emit calculatedDataChanged();
607 }
612 }
608
613
609 QPieSeriesPrivate* QPieSeriesPrivate::fromSeries(QPieSeries *series)
614 QPieSeriesPrivate* QPieSeriesPrivate::fromSeries(QPieSeries *series)
610 {
615 {
611 return series->d_func();
616 return series->d_func();
612 }
617 }
613
618
614 void QPieSeriesPrivate::sliceValueChanged()
619 void QPieSeriesPrivate::sliceValueChanged()
615 {
620 {
616 Q_ASSERT(m_slices.contains(qobject_cast<QPieSlice *>(sender())));
621 Q_ASSERT(m_slices.contains(qobject_cast<QPieSlice *>(sender())));
617 updateDerivativeData();
622 updateDerivativeData();
618 }
623 }
619
624
620 void QPieSeriesPrivate::sliceClicked()
625 void QPieSeriesPrivate::sliceClicked()
621 {
626 {
622 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
627 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
623 Q_ASSERT(m_slices.contains(slice));
628 Q_ASSERT(m_slices.contains(slice));
624 Q_Q(QPieSeries);
629 Q_Q(QPieSeries);
625 emit q->clicked(slice);
630 emit q->clicked(slice);
626 }
631 }
627
632
628 void QPieSeriesPrivate::sliceHovered(bool state)
633 void QPieSeriesPrivate::sliceHovered(bool state)
629 {
634 {
630 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
635 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
631 Q_ASSERT(m_slices.contains(slice));
636 Q_ASSERT(m_slices.contains(slice));
632 Q_Q(QPieSeries);
637 Q_Q(QPieSeries);
633 emit q->hovered(slice, state);
638 emit q->hovered(slice, state);
634 }
639 }
635
640
636 void QPieSeriesPrivate::scaleDomain(Domain& domain)
641 void QPieSeriesPrivate::scaleDomain(Domain& domain)
637 {
642 {
638 Q_UNUSED(domain);
643 Q_UNUSED(domain);
639 // does not apply to pie
644 // does not apply to pie
640 }
645 }
641
646
642 Chart* QPieSeriesPrivate::createGraphics(ChartPresenter* presenter)
647 Chart* QPieSeriesPrivate::createGraphics(ChartPresenter* presenter)
643 {
648 {
644 Q_Q(QPieSeries);
649 Q_Q(QPieSeries);
645 PieChartItem* pie = new PieChartItem(q,presenter);
650 PieChartItem* pie = new PieChartItem(q,presenter);
646 if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) {
651 if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) {
647 presenter->animator()->addAnimation(pie);
652 presenter->animator()->addAnimation(pie);
648 }
653 }
649 presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q));
654 presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q));
650 return pie;
655 return pie;
651 }
656 }
652
657
653 QList<LegendMarker*> QPieSeriesPrivate::createLegendMarker(QLegend* legend)
658 QList<LegendMarker*> QPieSeriesPrivate::createLegendMarker(QLegend* legend)
654 {
659 {
655 Q_Q(QPieSeries);
660 Q_Q(QPieSeries);
656 QList<LegendMarker*> markers;
661 QList<LegendMarker*> markers;
657 foreach(QPieSlice* slice, q->slices()) {
662 foreach(QPieSlice* slice, q->slices()) {
658 PieLegendMarker* marker = new PieLegendMarker(q,slice,legend);
663 PieLegendMarker* marker = new PieLegendMarker(q,slice,legend);
659 markers << marker;
664 markers << marker;
660 }
665 }
661 return markers;
666 return markers;
662 }
667 }
663
668
664 #include "moc_qpieseries.cpp"
669 #include "moc_qpieseries.cpp"
665 #include "moc_qpieseries_p.cpp"
670 #include "moc_qpieseries_p.cpp"
666
671
667 QTCOMMERCIALCHART_END_NAMESPACE
672 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,555 +1,563
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2012 Digia Plc
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include <QtTest/QtTest>
21 #include <QtTest/QtTest>
22 #include <qchartview.h>
22 #include <qchartview.h>
23 #include <qchart.h>
23 #include <qchart.h>
24 #include <qpieseries.h>
24 #include <qpieseries.h>
25 #include <qpieslice.h>
25 #include <qpieslice.h>
26 #include <qpiemodelmapper.h>
26 #include <qpiemodelmapper.h>
27 #include <QStandardItemModel>
27 #include <QStandardItemModel>
28 #include <tst_definitions.h>
28 #include <tst_definitions.h>
29
29
30 QTCOMMERCIALCHART_USE_NAMESPACE
30 QTCOMMERCIALCHART_USE_NAMESPACE
31
31
32 Q_DECLARE_METATYPE(QPieSlice*)
32 Q_DECLARE_METATYPE(QPieSlice*)
33 Q_DECLARE_METATYPE(QList<QPieSlice*>)
33 Q_DECLARE_METATYPE(QList<QPieSlice*>)
34
34
35 class tst_qpieseries : public QObject
35 class tst_qpieseries : public QObject
36 {
36 {
37 Q_OBJECT
37 Q_OBJECT
38
38
39 public slots:
39 public slots:
40 void initTestCase();
40 void initTestCase();
41 void cleanupTestCase();
41 void cleanupTestCase();
42 void init();
42 void init();
43 void cleanup();
43 void cleanup();
44
44
45 private slots:
45 private slots:
46 void properties();
46 void properties();
47 void append();
47 void append();
48 void appendAnimated();
48 void appendAnimated();
49 void insert();
49 void insert();
50 void insertAnimated();
50 void insertAnimated();
51 void remove();
51 void remove();
52 void removeAnimated();
52 void removeAnimated();
53 void calculatedValues();
53 void calculatedValues();
54 void clickedSignal();
54 void clickedSignal();
55 void hoverSignal();
55 void hoverSignal();
56 void sliceSeries();
56 void sliceSeries();
57
57
58 private:
58 private:
59 void verifyCalculatedData(const QPieSeries &series, bool *ok);
59 void verifyCalculatedData(const QPieSeries &series, bool *ok);
60
60
61 private:
61 private:
62 QChartView *m_view;
62 QChartView *m_view;
63 QPieSeries *m_series;
63 QPieSeries *m_series;
64 };
64 };
65
65
66 void tst_qpieseries::initTestCase()
66 void tst_qpieseries::initTestCase()
67 {
67 {
68 qRegisterMetaType<QPieSlice*>("QPieSlice*");
68 qRegisterMetaType<QPieSlice*>("QPieSlice*");
69 qRegisterMetaType<QList<QPieSlice*> >("QList<QPieSlice*>");
69 qRegisterMetaType<QList<QPieSlice*> >("QList<QPieSlice*>");
70 }
70 }
71
71
72 void tst_qpieseries::cleanupTestCase()
72 void tst_qpieseries::cleanupTestCase()
73 {
73 {
74 }
74 }
75
75
76 void tst_qpieseries::init()
76 void tst_qpieseries::init()
77 {
77 {
78 m_view = new QChartView();
78 m_view = new QChartView();
79 m_series = new QPieSeries(m_view);
79 m_series = new QPieSeries(m_view);
80 }
80 }
81
81
82 void tst_qpieseries::cleanup()
82 void tst_qpieseries::cleanup()
83 {
83 {
84 delete m_view;
84 delete m_view;
85 m_view = 0;
85 m_view = 0;
86 m_series = 0;
86 m_series = 0;
87 }
87 }
88
88
89 void tst_qpieseries::properties()
89 void tst_qpieseries::properties()
90 {
90 {
91 QSignalSpy countSpy(m_series, SIGNAL(countChanged()));
91 QSignalSpy countSpy(m_series, SIGNAL(countChanged()));
92 QSignalSpy sumSpy(m_series, SIGNAL(sumChanged()));
92 QSignalSpy sumSpy(m_series, SIGNAL(sumChanged()));
93 QSignalSpy sizeSpy(m_series, SIGNAL(pieSizeChanged()));
93 QSignalSpy sizeSpy(m_series, SIGNAL(pieSizeChanged()));
94 QSignalSpy startAngleSpy(m_series, SIGNAL(pieStartAngleChanged()));
94 QSignalSpy startAngleSpy(m_series, SIGNAL(pieStartAngleChanged()));
95 QSignalSpy endAngleSpy(m_series, SIGNAL(pieEndAngleChanged()));
95 QSignalSpy endAngleSpy(m_series, SIGNAL(pieEndAngleChanged()));
96 QSignalSpy horPosSpy(m_series, SIGNAL(horizontalPositionChanged()));
96 QSignalSpy horPosSpy(m_series, SIGNAL(horizontalPositionChanged()));
97 QSignalSpy verPosSpy(m_series, SIGNAL(verticalPositionChanged()));
97 QSignalSpy verPosSpy(m_series, SIGNAL(verticalPositionChanged()));
98
98
99 QVERIFY(m_series->type() == QAbstractSeries::SeriesTypePie);
99 QVERIFY(m_series->type() == QAbstractSeries::SeriesTypePie);
100 QVERIFY(m_series->count() == 0);
100 QVERIFY(m_series->count() == 0);
101 QVERIFY(m_series->isEmpty());
101 QVERIFY(m_series->isEmpty());
102 QCOMPARE(m_series->sum(), 0.0);
102 QCOMPARE(m_series->sum(), 0.0);
103 QCOMPARE(m_series->horizontalPosition(), 0.5);
103 QCOMPARE(m_series->horizontalPosition(), 0.5);
104 QCOMPARE(m_series->verticalPosition(), 0.5);
104 QCOMPARE(m_series->verticalPosition(), 0.5);
105 QCOMPARE(m_series->pieSize(), 0.7);
105 QCOMPARE(m_series->pieSize(), 0.7);
106 QCOMPARE(m_series->pieStartAngle(), 0.0);
106 QCOMPARE(m_series->pieStartAngle(), 0.0);
107 QCOMPARE(m_series->pieEndAngle(), 360.0);
107 QCOMPARE(m_series->pieEndAngle(), 360.0);
108
108
109 m_series->append("s1", 1);
109 m_series->append("s1", 1);
110 m_series->append("s2", 1);
110 m_series->append("s2", 1);
111 m_series->append("s3", 1);
111 m_series->append("s3", 1);
112 m_series->insert(1, new QPieSlice("s4", 1));
112 m_series->insert(1, new QPieSlice("s4", 1));
113 m_series->remove(m_series->slices().first());
113 m_series->remove(m_series->slices().first());
114 QCOMPARE(m_series->count(), 3);
114 QCOMPARE(m_series->count(), 3);
115 QCOMPARE(m_series->sum(), 3.0);
115 QCOMPARE(m_series->sum(), 3.0);
116 m_series->clear();
116 m_series->clear();
117 QCOMPARE(m_series->count(), 0);
117 QCOMPARE(m_series->count(), 0);
118 QCOMPARE(m_series->sum(), 0.0);
118 QCOMPARE(m_series->sum(), 0.0);
119 QCOMPARE(countSpy.count(), 6);
119 QCOMPARE(countSpy.count(), 6);
120 QCOMPARE(sumSpy.count(), 6);
120 QCOMPARE(sumSpy.count(), 6);
121
121
122 m_series->setPieSize(-1.0);
122 m_series->setPieSize(-1.0);
123 QCOMPARE(m_series->pieSize(), 0.0);
123 QCOMPARE(m_series->pieSize(), 0.0);
124 m_series->setPieSize(0.0);
124 m_series->setPieSize(0.0);
125 m_series->setPieSize(0.9);
125 m_series->setPieSize(0.9);
126 m_series->setPieSize(2.0);
126 m_series->setPieSize(2.0);
127 QCOMPARE(m_series->pieSize(), 1.0);
127 QCOMPARE(m_series->pieSize(), 1.0);
128 QCOMPARE(sizeSpy.count(), 3);
128 QCOMPARE(sizeSpy.count(), 3);
129
129
130 m_series->setPieStartAngle(0);
130 m_series->setPieStartAngle(0);
131 m_series->setPieStartAngle(-180);
131 m_series->setPieStartAngle(-180);
132 m_series->setPieStartAngle(180);
132 m_series->setPieStartAngle(180);
133 QCOMPARE(startAngleSpy.count(), 2);
133 QCOMPARE(startAngleSpy.count(), 2);
134
134
135 m_series->setPieEndAngle(360);
135 m_series->setPieEndAngle(360);
136 m_series->setPieEndAngle(-180);
136 m_series->setPieEndAngle(-180);
137 m_series->setPieEndAngle(180);
137 m_series->setPieEndAngle(180);
138 QCOMPARE(endAngleSpy.count(), 2);
138 QCOMPARE(endAngleSpy.count(), 2);
139
139
140 m_series->setHorizontalPosition(0.5);
140 m_series->setHorizontalPosition(0.5);
141 m_series->setHorizontalPosition(-1.0);
141 m_series->setHorizontalPosition(-1.0);
142 QCOMPARE(m_series->horizontalPosition(), 0.0);
142 QCOMPARE(m_series->horizontalPosition(), 0.0);
143 m_series->setHorizontalPosition(1.0);
143 m_series->setHorizontalPosition(1.0);
144 m_series->setHorizontalPosition(2.0);
144 m_series->setHorizontalPosition(2.0);
145 QCOMPARE(m_series->horizontalPosition(), 1.0);
145 QCOMPARE(m_series->horizontalPosition(), 1.0);
146 QCOMPARE(horPosSpy.count(), 2);
146 QCOMPARE(horPosSpy.count(), 2);
147
147
148 m_series->setVerticalPosition(0.5);
148 m_series->setVerticalPosition(0.5);
149 m_series->setVerticalPosition(-1.0);
149 m_series->setVerticalPosition(-1.0);
150 QCOMPARE(m_series->verticalPosition(), 0.0);
150 QCOMPARE(m_series->verticalPosition(), 0.0);
151 m_series->setVerticalPosition(1.0);
151 m_series->setVerticalPosition(1.0);
152 m_series->setVerticalPosition(2.0);
152 m_series->setVerticalPosition(2.0);
153 QCOMPARE(m_series->verticalPosition(), 1.0);
153 QCOMPARE(m_series->verticalPosition(), 1.0);
154 QCOMPARE(verPosSpy.count(), 2);
154 QCOMPARE(verPosSpy.count(), 2);
155 }
155 }
156
156
157 void tst_qpieseries::append()
157 void tst_qpieseries::append()
158 {
158 {
159 m_view->chart()->addSeries(m_series);
159 m_view->chart()->addSeries(m_series);
160 QSignalSpy addedSpy(m_series, SIGNAL(added(QList<QPieSlice*>)));
160 QSignalSpy addedSpy(m_series, SIGNAL(added(QList<QPieSlice*>)));
161
161
162 // append pointer
162 // append pointer
163 QPieSlice *slice1 = 0;
163 QPieSlice *slice1 = 0;
164 QVERIFY(!m_series->append(slice1));
164 QVERIFY(!m_series->append(slice1));
165 slice1 = new QPieSlice("slice 1", 1);
165 slice1 = new QPieSlice("slice 1", 1);
166 QVERIFY(m_series->append(slice1));
166 QVERIFY(m_series->append(slice1));
167 QVERIFY(!m_series->append(slice1));
167 QVERIFY(!m_series->append(slice1));
168 QCOMPARE(m_series->count(), 1);
168 QCOMPARE(m_series->count(), 1);
169 QCOMPARE(addedSpy.count(), 1);
169 QCOMPARE(addedSpy.count(), 1);
170 QList<QPieSlice*> added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(0).at(0));
170 QList<QPieSlice*> added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(0).at(0));
171 QCOMPARE(added.count(), 1);
171 QCOMPARE(added.count(), 1);
172 QCOMPARE(added.first(), slice1);
172 QCOMPARE(added.first(), slice1);
173
173
174 // try to append same slice to another series
175 QPieSeries series2;
176 QVERIFY(!series2.append(slice1));
177
174 // append pointer list
178 // append pointer list
175 QList<QPieSlice *> list;
179 QList<QPieSlice *> list;
176 QVERIFY(!m_series->append(list));
180 QVERIFY(!m_series->append(list));
177 list << (QPieSlice *) 0;
181 list << (QPieSlice *) 0;
178 QVERIFY(!m_series->append(list));
182 QVERIFY(!m_series->append(list));
179 list.clear();
183 list.clear();
180 list << new QPieSlice("slice 2", 2);
184 list << new QPieSlice("slice 2", 2);
181 list << new QPieSlice("slice 3", 3);
185 list << new QPieSlice("slice 3", 3);
182 QVERIFY(m_series->append(list));
186 QVERIFY(m_series->append(list));
183 QVERIFY(!m_series->append(list));
187 QVERIFY(!m_series->append(list));
184 QCOMPARE(m_series->count(), 3);
188 QCOMPARE(m_series->count(), 3);
185 QCOMPARE(addedSpy.count(), 2);
189 QCOMPARE(addedSpy.count(), 2);
186 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(1).at(0));
190 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(1).at(0));
187 QCOMPARE(added.count(), 2);
191 QCOMPARE(added.count(), 2);
188 QCOMPARE(added, list);
192 QCOMPARE(added, list);
189
193
190 // append operator
194 // append operator
191 QPieSlice *slice4 = new QPieSlice("slice 4", 4);
195 QPieSlice *slice4 = new QPieSlice("slice 4", 4);
192 *m_series << slice4;
196 *m_series << slice4;
193 *m_series << slice1; // fails because already added
197 *m_series << slice1; // fails because already added
194 QCOMPARE(m_series->count(), 4);
198 QCOMPARE(m_series->count(), 4);
195 QCOMPARE(addedSpy.count(), 3);
199 QCOMPARE(addedSpy.count(), 3);
196 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(2).at(0));
200 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(2).at(0));
197 QCOMPARE(added.count(), 1);
201 QCOMPARE(added.count(), 1);
198 QCOMPARE(added.first(), slice4);
202 QCOMPARE(added.first(), slice4);
199
203
200 // append with params
204 // append with params
201 QPieSlice *slice5 = m_series->append("slice 5", 5);
205 QPieSlice *slice5 = m_series->append("slice 5", 5);
202 QVERIFY(slice5 != 0);
206 QVERIFY(slice5 != 0);
203 QCOMPARE(slice5->value(), 5.0);
207 QCOMPARE(slice5->value(), 5.0);
204 QCOMPARE(slice5->label(), QString("slice 5"));
208 QCOMPARE(slice5->label(), QString("slice 5"));
205 QCOMPARE(m_series->count(), 5);
209 QCOMPARE(m_series->count(), 5);
206 QCOMPARE(addedSpy.count(), 4);
210 QCOMPARE(addedSpy.count(), 4);
207 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(3).at(0));
211 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(3).at(0));
208 QCOMPARE(added.count(), 1);
212 QCOMPARE(added.count(), 1);
209 QCOMPARE(added.first(), slice5);
213 QCOMPARE(added.first(), slice5);
210
214
211 // check slices
215 // check slices
212 QVERIFY(!m_series->isEmpty());
216 QVERIFY(!m_series->isEmpty());
213 for (int i=0; i<m_series->count(); i++) {
217 for (int i=0; i<m_series->count(); i++) {
214 QCOMPARE(m_series->slices().at(i)->value(), (qreal) i+1);
218 QCOMPARE(m_series->slices().at(i)->value(), (qreal) i+1);
215 QCOMPARE(m_series->slices().at(i)->label(), QString("slice ") + QString::number(i+1));
219 QCOMPARE(m_series->slices().at(i)->label(), QString("slice ") + QString::number(i+1));
216 }
220 }
217 }
221 }
218
222
219 void tst_qpieseries::appendAnimated()
223 void tst_qpieseries::appendAnimated()
220 {
224 {
221 m_view->chart()->setAnimationOptions(QChart::AllAnimations);
225 m_view->chart()->setAnimationOptions(QChart::AllAnimations);
222 }
226 }
223
227
224 void tst_qpieseries::insert()
228 void tst_qpieseries::insert()
225 {
229 {
226 m_view->chart()->addSeries(m_series);
230 m_view->chart()->addSeries(m_series);
227 QSignalSpy addedSpy(m_series, SIGNAL(added(QList<QPieSlice*>)));
231 QSignalSpy addedSpy(m_series, SIGNAL(added(QList<QPieSlice*>)));
228
232
229 // insert one slice
233 // insert one slice
230 QPieSlice *slice1 = 0;
234 QPieSlice *slice1 = 0;
231 QVERIFY(!m_series->insert(0, slice1));
235 QVERIFY(!m_series->insert(0, slice1));
232 slice1 = new QPieSlice("slice 1", 1);
236 slice1 = new QPieSlice("slice 1", 1);
233 QVERIFY(!m_series->insert(-1, slice1));
237 QVERIFY(!m_series->insert(-1, slice1));
234 QVERIFY(!m_series->insert(5, slice1));
238 QVERIFY(!m_series->insert(5, slice1));
235 QVERIFY(m_series->insert(0, slice1));
239 QVERIFY(m_series->insert(0, slice1));
236 QVERIFY(!m_series->insert(0, slice1));
240 QVERIFY(!m_series->insert(0, slice1));
237 QCOMPARE(m_series->count(), 1);
241 QCOMPARE(m_series->count(), 1);
238 QCOMPARE(addedSpy.count(), 1);
242 QCOMPARE(addedSpy.count(), 1);
239 QList<QPieSlice*> added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(0).at(0));
243 QList<QPieSlice*> added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(0).at(0));
240 QCOMPARE(added.count(), 1);
244 QCOMPARE(added.count(), 1);
241 QCOMPARE(added.first(), slice1);
245 QCOMPARE(added.first(), slice1);
242
246
247 // try to insert same slice to another series
248 QPieSeries series2;
249 QVERIFY(!series2.insert(0, slice1));
250
243 // add some more slices
251 // add some more slices
244 QPieSlice *slice2 = m_series->append("slice 2", 2);
252 QPieSlice *slice2 = m_series->append("slice 2", 2);
245 QPieSlice *slice4 = m_series->append("slice 4", 4);
253 QPieSlice *slice4 = m_series->append("slice 4", 4);
246 QCOMPARE(m_series->count(), 3);
254 QCOMPARE(m_series->count(), 3);
247 QCOMPARE(addedSpy.count(), 3);
255 QCOMPARE(addedSpy.count(), 3);
248 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(1).at(0));
256 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(1).at(0));
249 QCOMPARE(added.count(), 1);
257 QCOMPARE(added.count(), 1);
250 QCOMPARE(added.first(), slice2);
258 QCOMPARE(added.first(), slice2);
251 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(2).at(0));
259 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(2).at(0));
252 QCOMPARE(added.count(), 1);
260 QCOMPARE(added.count(), 1);
253 QCOMPARE(added.first(), slice4);
261 QCOMPARE(added.first(), slice4);
254
262
255 // insert between slices
263 // insert between slices
256 QPieSlice *slice3 = new QPieSlice("slice 3", 3);
264 QPieSlice *slice3 = new QPieSlice("slice 3", 3);
257 m_series->insert(2, slice3);
265 m_series->insert(2, slice3);
258 QCOMPARE(m_series->count(), 4);
266 QCOMPARE(m_series->count(), 4);
259 QCOMPARE(addedSpy.count(), 4);
267 QCOMPARE(addedSpy.count(), 4);
260 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(3).at(0));
268 added = qvariant_cast<QList<QPieSlice*> >(addedSpy.at(3).at(0));
261 QCOMPARE(added.count(), 1);
269 QCOMPARE(added.count(), 1);
262 QCOMPARE(added.first(), slice3);
270 QCOMPARE(added.first(), slice3);
263
271
264 // check slices
272 // check slices
265 for (int i=0; i<m_series->count(); i++) {
273 for (int i=0; i<m_series->count(); i++) {
266 QCOMPARE(m_series->slices().at(i)->value(), (qreal) i+1);
274 QCOMPARE(m_series->slices().at(i)->value(), (qreal) i+1);
267 QCOMPARE(m_series->slices().at(i)->label(), QString("slice ") + QString::number(i+1));
275 QCOMPARE(m_series->slices().at(i)->label(), QString("slice ") + QString::number(i+1));
268 }
276 }
269 }
277 }
270
278
271 void tst_qpieseries::insertAnimated()
279 void tst_qpieseries::insertAnimated()
272 {
280 {
273 m_view->chart()->setAnimationOptions(QChart::AllAnimations);
281 m_view->chart()->setAnimationOptions(QChart::AllAnimations);
274 }
282 }
275
283
276 void tst_qpieseries::remove()
284 void tst_qpieseries::remove()
277 {
285 {
278 m_view->chart()->addSeries(m_series);
286 m_view->chart()->addSeries(m_series);
279 QSignalSpy removedSpy(m_series, SIGNAL(removed(QList<QPieSlice*>)));
287 QSignalSpy removedSpy(m_series, SIGNAL(removed(QList<QPieSlice*>)));
280
288
281 // add some slices
289 // add some slices
282 QPieSlice *slice1 = m_series->append("slice 1", 1);
290 QPieSlice *slice1 = m_series->append("slice 1", 1);
283 QPieSlice *slice2 = m_series->append("slice 2", 2);
291 QPieSlice *slice2 = m_series->append("slice 2", 2);
284 QPieSlice *slice3 = m_series->append("slice 3", 3);
292 QPieSlice *slice3 = m_series->append("slice 3", 3);
285 QSignalSpy spy1(slice1, SIGNAL(destroyed()));
293 QSignalSpy spy1(slice1, SIGNAL(destroyed()));
286 QSignalSpy spy2(slice2, SIGNAL(destroyed()));
294 QSignalSpy spy2(slice2, SIGNAL(destroyed()));
287 QSignalSpy spy3(slice3, SIGNAL(destroyed()));
295 QSignalSpy spy3(slice3, SIGNAL(destroyed()));
288 QCOMPARE(m_series->count(), 3);
296 QCOMPARE(m_series->count(), 3);
289
297
290 // null pointer remove
298 // null pointer remove
291 QVERIFY(!m_series->remove(0));
299 QVERIFY(!m_series->remove(0));
292
300
293 // remove first
301 // remove first
294 QVERIFY(m_series->remove(slice1));
302 QVERIFY(m_series->remove(slice1));
295 QVERIFY(!m_series->remove(slice1));
303 QVERIFY(!m_series->remove(slice1));
296 QCOMPARE(m_series->count(), 2);
304 QCOMPARE(m_series->count(), 2);
297 QCOMPARE(m_series->slices().at(0)->label(), slice2->label());
305 QCOMPARE(m_series->slices().at(0)->label(), slice2->label());
298 QCOMPARE(removedSpy.count(), 1);
306 QCOMPARE(removedSpy.count(), 1);
299 QList<QPieSlice*> removed = qvariant_cast<QList<QPieSlice*> >(removedSpy.at(0).at(0));
307 QList<QPieSlice*> removed = qvariant_cast<QList<QPieSlice*> >(removedSpy.at(0).at(0));
300 QCOMPARE(removed.count(), 1);
308 QCOMPARE(removed.count(), 1);
301 QCOMPARE(removed.first(), slice1);
309 QCOMPARE(removed.first(), slice1);
302
310
303 // remove all
311 // remove all
304 m_series->clear();
312 m_series->clear();
305 QVERIFY(m_series->isEmpty());
313 QVERIFY(m_series->isEmpty());
306 QVERIFY(m_series->slices().isEmpty());
314 QVERIFY(m_series->slices().isEmpty());
307 QCOMPARE(m_series->count(), 0);
315 QCOMPARE(m_series->count(), 0);
308 QCOMPARE(removedSpy.count(), 2);
316 QCOMPARE(removedSpy.count(), 2);
309 removed = qvariant_cast<QList<QPieSlice*> >(removedSpy.at(1).at(0));
317 removed = qvariant_cast<QList<QPieSlice*> >(removedSpy.at(1).at(0));
310 QCOMPARE(removed.count(), 2);
318 QCOMPARE(removed.count(), 2);
311 QCOMPARE(removed.first(), slice2);
319 QCOMPARE(removed.first(), slice2);
312 QCOMPARE(removed.last(), slice3);
320 QCOMPARE(removed.last(), slice3);
313
321
314 // check that slices were actually destroyed
322 // check that slices were actually destroyed
315 TRY_COMPARE(spy1.count(), 1);
323 TRY_COMPARE(spy1.count(), 1);
316 TRY_COMPARE(spy2.count(), 1);
324 TRY_COMPARE(spy2.count(), 1);
317 TRY_COMPARE(spy3.count(), 1);
325 TRY_COMPARE(spy3.count(), 1);
318 }
326 }
319
327
320 void tst_qpieseries::removeAnimated()
328 void tst_qpieseries::removeAnimated()
321 {
329 {
322 m_view->chart()->setAnimationOptions(QChart::AllAnimations);
330 m_view->chart()->setAnimationOptions(QChart::AllAnimations);
323 }
331 }
324
332
325 void tst_qpieseries::calculatedValues()
333 void tst_qpieseries::calculatedValues()
326 {
334 {
327 m_view->chart()->addSeries(m_series);
335 m_view->chart()->addSeries(m_series);
328
336
329 QPieSlice *slice1 = new QPieSlice("slice 1", 1);
337 QPieSlice *slice1 = new QPieSlice("slice 1", 1);
330 QSignalSpy percentageSpy(slice1, SIGNAL(percentageChanged()));
338 QSignalSpy percentageSpy(slice1, SIGNAL(percentageChanged()));
331 QSignalSpy startAngleSpy(slice1, SIGNAL(startAngleChanged()));
339 QSignalSpy startAngleSpy(slice1, SIGNAL(startAngleChanged()));
332 QSignalSpy angleSpanSpy(slice1, SIGNAL(angleSpanChanged()));
340 QSignalSpy angleSpanSpy(slice1, SIGNAL(angleSpanChanged()));
333
341
334 // add a slice
342 // add a slice
335 m_series->append(slice1);
343 m_series->append(slice1);
336 bool ok;
344 bool ok;
337 verifyCalculatedData(*m_series, &ok);
345 verifyCalculatedData(*m_series, &ok);
338 if (!ok)
346 if (!ok)
339 return;
347 return;
340 QCOMPARE(percentageSpy.count(), 1);
348 QCOMPARE(percentageSpy.count(), 1);
341 QCOMPARE(startAngleSpy.count(), 0);
349 QCOMPARE(startAngleSpy.count(), 0);
342 QCOMPARE(angleSpanSpy.count(), 1);
350 QCOMPARE(angleSpanSpy.count(), 1);
343
351
344 // add some more slices
352 // add some more slices
345 QList<QPieSlice *> list;
353 QList<QPieSlice *> list;
346 list << new QPieSlice("slice 2", 2);
354 list << new QPieSlice("slice 2", 2);
347 list << new QPieSlice("slice 3", 3);
355 list << new QPieSlice("slice 3", 3);
348 m_series->append(list);
356 m_series->append(list);
349 verifyCalculatedData(*m_series, &ok);
357 verifyCalculatedData(*m_series, &ok);
350 if (!ok)
358 if (!ok)
351 return;
359 return;
352 QCOMPARE(percentageSpy.count(), 2);
360 QCOMPARE(percentageSpy.count(), 2);
353 QCOMPARE(startAngleSpy.count(), 0);
361 QCOMPARE(startAngleSpy.count(), 0);
354 QCOMPARE(angleSpanSpy.count(), 2);
362 QCOMPARE(angleSpanSpy.count(), 2);
355
363
356 // remove a slice
364 // remove a slice
357 m_series->remove(list.first()); // remove slice 2
365 m_series->remove(list.first()); // remove slice 2
358 verifyCalculatedData(*m_series, &ok);
366 verifyCalculatedData(*m_series, &ok);
359 if (!ok)
367 if (!ok)
360 return;
368 return;
361 QCOMPARE(percentageSpy.count(), 3);
369 QCOMPARE(percentageSpy.count(), 3);
362 QCOMPARE(startAngleSpy.count(), 0);
370 QCOMPARE(startAngleSpy.count(), 0);
363 QCOMPARE(angleSpanSpy.count(), 3);
371 QCOMPARE(angleSpanSpy.count(), 3);
364
372
365 // insert a slice
373 // insert a slice
366 m_series->insert(0, new QPieSlice("Slice 4", 4));
374 m_series->insert(0, new QPieSlice("Slice 4", 4));
367 verifyCalculatedData(*m_series, &ok);
375 verifyCalculatedData(*m_series, &ok);
368 if (!ok)
376 if (!ok)
369 return;
377 return;
370 QCOMPARE(percentageSpy.count(), 4);
378 QCOMPARE(percentageSpy.count(), 4);
371 QCOMPARE(startAngleSpy.count(), 1);
379 QCOMPARE(startAngleSpy.count(), 1);
372 QCOMPARE(angleSpanSpy.count(), 4);
380 QCOMPARE(angleSpanSpy.count(), 4);
373
381
374 // modify pie angles
382 // modify pie angles
375 m_series->setPieStartAngle(-90);
383 m_series->setPieStartAngle(-90);
376 m_series->setPieEndAngle(90);
384 m_series->setPieEndAngle(90);
377 verifyCalculatedData(*m_series, &ok);
385 verifyCalculatedData(*m_series, &ok);
378 if (!ok)
386 if (!ok)
379 return;
387 return;
380 QCOMPARE(percentageSpy.count(), 4);
388 QCOMPARE(percentageSpy.count(), 4);
381 QCOMPARE(startAngleSpy.count(), 3);
389 QCOMPARE(startAngleSpy.count(), 3);
382 QCOMPARE(angleSpanSpy.count(), 6);
390 QCOMPARE(angleSpanSpy.count(), 6);
383
391
384 // clear all
392 // clear all
385 m_series->clear();
393 m_series->clear();
386 verifyCalculatedData(*m_series, &ok);
394 verifyCalculatedData(*m_series, &ok);
387 if (!ok)
395 if (!ok)
388 return;
396 return;
389 QCOMPARE(percentageSpy.count(), 4);
397 QCOMPARE(percentageSpy.count(), 4);
390 QCOMPARE(startAngleSpy.count(), 3);
398 QCOMPARE(startAngleSpy.count(), 3);
391 QCOMPARE(angleSpanSpy.count(), 6);
399 QCOMPARE(angleSpanSpy.count(), 6);
392 }
400 }
393
401
394 void tst_qpieseries::verifyCalculatedData(const QPieSeries &series, bool *ok)
402 void tst_qpieseries::verifyCalculatedData(const QPieSeries &series, bool *ok)
395 {
403 {
396 *ok = false;
404 *ok = false;
397
405
398 qreal sum = 0;
406 qreal sum = 0;
399 foreach (const QPieSlice *slice, series.slices())
407 foreach (const QPieSlice *slice, series.slices())
400 sum += slice->value();
408 sum += slice->value();
401 QCOMPARE(series.sum(), sum);
409 QCOMPARE(series.sum(), sum);
402
410
403 qreal startAngle = series.pieStartAngle();
411 qreal startAngle = series.pieStartAngle();
404 qreal pieAngleSpan = series.pieEndAngle() - series.pieStartAngle();
412 qreal pieAngleSpan = series.pieEndAngle() - series.pieStartAngle();
405 foreach (const QPieSlice *slice, series.slices()) {
413 foreach (const QPieSlice *slice, series.slices()) {
406 qreal ratio = slice->value() / sum;
414 qreal ratio = slice->value() / sum;
407 qreal sliceSpan = pieAngleSpan * ratio;
415 qreal sliceSpan = pieAngleSpan * ratio;
408 QCOMPARE(slice->startAngle(), startAngle);
416 QCOMPARE(slice->startAngle(), startAngle);
409 QCOMPARE(slice->angleSpan(), sliceSpan);
417 QCOMPARE(slice->angleSpan(), sliceSpan);
410 QCOMPARE(slice->percentage(), ratio);
418 QCOMPARE(slice->percentage(), ratio);
411 startAngle += sliceSpan;
419 startAngle += sliceSpan;
412 }
420 }
413
421
414 if (!series.isEmpty())
422 if (!series.isEmpty())
415 QCOMPARE(series.slices().last()->startAngle() + series.slices().last()->angleSpan(), series.pieEndAngle());
423 QCOMPARE(series.slices().last()->startAngle() + series.slices().last()->angleSpan(), series.pieEndAngle());
416
424
417 *ok = true;
425 *ok = true;
418 }
426 }
419
427
420
428
421 void tst_qpieseries::clickedSignal()
429 void tst_qpieseries::clickedSignal()
422 {
430 {
423 // add some slices
431 // add some slices
424 QPieSlice *s1 = m_series->append("slice 1", 1);
432 QPieSlice *s1 = m_series->append("slice 1", 1);
425 QPieSlice *s2 = m_series->append("slice 2", 1);
433 QPieSlice *s2 = m_series->append("slice 2", 1);
426 QPieSlice *s3 = m_series->append("slice 3", 1);
434 QPieSlice *s3 = m_series->append("slice 3", 1);
427 QPieSlice *s4 = m_series->append("slice 4", 1);
435 QPieSlice *s4 = m_series->append("slice 4", 1);
428 QSignalSpy clickSpy(m_series, SIGNAL(clicked(QPieSlice*)));
436 QSignalSpy clickSpy(m_series, SIGNAL(clicked(QPieSlice*)));
429
437
430 // add series to the chart
438 // add series to the chart
431 m_view->chart()->legend()->setVisible(false);
439 m_view->chart()->legend()->setVisible(false);
432 m_view->resize(200, 200);
440 m_view->resize(200, 200);
433 m_view->chart()->addSeries(m_series);
441 m_view->chart()->addSeries(m_series);
434 m_view->show();
442 m_view->show();
435 QTest::qWaitForWindowShown(m_view);
443 QTest::qWaitForWindowShown(m_view);
436
444
437 // if you devide the chart in four equal tiles these
445 // if you devide the chart in four equal tiles these
438 // are the center points of those tiles
446 // are the center points of those tiles
439 QPoint p1(90.25, 90);
447 QPoint p1(90.25, 90);
440 QPoint p2(150, 90);
448 QPoint p2(150, 90);
441 QPoint p3(90, 150);
449 QPoint p3(90, 150);
442 QPoint p4(150, 150);
450 QPoint p4(150, 150);
443
451
444 QPoint center(120, 120);
452 QPoint center(120, 120);
445
453
446 m_series->setPieSize(1.0);
454 m_series->setPieSize(1.0);
447 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1);
455 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1);
448 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2);
456 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2);
449 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3);
457 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3);
450 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4);
458 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4);
451 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
459 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
452 TRY_COMPARE(clickSpy.count(), 5); // all hit
460 TRY_COMPARE(clickSpy.count(), 5); // all hit
453 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy.at(0).at(0)), s4);
461 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy.at(0).at(0)), s4);
454 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy.at(1).at(0)), s1);
462 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy.at(1).at(0)), s1);
455 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy.at(2).at(0)), s3);
463 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy.at(2).at(0)), s3);
456 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy.at(3).at(0)), s2);
464 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy.at(3).at(0)), s2);
457 clickSpy.clear();
465 clickSpy.clear();
458
466
459 m_series->setPieSize(0.5);
467 m_series->setPieSize(0.5);
460 m_series->setVerticalPosition(0.25);
468 m_series->setVerticalPosition(0.25);
461 m_series->setHorizontalPosition(0.25);
469 m_series->setHorizontalPosition(0.25);
462 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1); // hits
470 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1); // hits
463 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2);
471 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2);
464 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3);
472 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3);
465 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4);
473 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4);
466 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
474 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
467 TRY_COMPARE(clickSpy.count(), 1);
475 TRY_COMPARE(clickSpy.count(), 1);
468 clickSpy.clear();
476 clickSpy.clear();
469
477
470 m_series->setVerticalPosition(0.25);
478 m_series->setVerticalPosition(0.25);
471 m_series->setHorizontalPosition(0.75);
479 m_series->setHorizontalPosition(0.75);
472 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1);
480 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1);
473 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2); // hits
481 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2); // hits
474 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3);
482 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3);
475 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4);
483 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4);
476 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
484 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
477 TRY_COMPARE(clickSpy.count(), 1);
485 TRY_COMPARE(clickSpy.count(), 1);
478 clickSpy.clear();
486 clickSpy.clear();
479
487
480 m_series->setVerticalPosition(0.75);
488 m_series->setVerticalPosition(0.75);
481 m_series->setHorizontalPosition(0.25);
489 m_series->setHorizontalPosition(0.25);
482 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1);
490 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1);
483 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2);
491 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2);
484 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3); // hits
492 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3); // hits
485 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4);
493 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4);
486 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
494 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
487 TRY_COMPARE(clickSpy.count(), 1);
495 TRY_COMPARE(clickSpy.count(), 1);
488 clickSpy.clear();
496 clickSpy.clear();
489
497
490 m_series->setVerticalPosition(0.75);
498 m_series->setVerticalPosition(0.75);
491 m_series->setHorizontalPosition(0.75);
499 m_series->setHorizontalPosition(0.75);
492 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1);
500 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p1);
493 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2);
501 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p2);
494 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3);
502 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p3);
495 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4); // hits
503 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, p4); // hits
496 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
504 QTest::mouseClick(m_view->viewport(), Qt::LeftButton, 0, center);
497 TRY_COMPARE(clickSpy.count(), 1);
505 TRY_COMPARE(clickSpy.count(), 1);
498 clickSpy.clear();
506 clickSpy.clear();
499 }
507 }
500
508
501 void tst_qpieseries::hoverSignal()
509 void tst_qpieseries::hoverSignal()
502 {
510 {
503 // add some slices
511 // add some slices
504 m_series->setPieSize(1.0);
512 m_series->setPieSize(1.0);
505 QPieSlice *s1 = m_series->append("slice 1", 1);
513 QPieSlice *s1 = m_series->append("slice 1", 1);
506 m_series->append("slice 2", 2);
514 m_series->append("slice 2", 2);
507 m_series->append("slice 3", 3);
515 m_series->append("slice 3", 3);
508
516
509 // add series to the chart
517 // add series to the chart
510 m_view->chart()->legend()->setVisible(false);
518 m_view->chart()->legend()->setVisible(false);
511 m_view->resize(200, 200);
519 m_view->resize(200, 200);
512 m_view->chart()->addSeries(m_series);
520 m_view->chart()->addSeries(m_series);
513 m_view->show();
521 m_view->show();
514 QTest::qWaitForWindowShown(m_view);
522 QTest::qWaitForWindowShown(m_view);
515
523
516 // first move to right top corner
524 // first move to right top corner
517 QTest::mouseMove(m_view->viewport(), QPoint(200, 0));
525 QTest::mouseMove(m_view->viewport(), QPoint(200, 0));
518 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
526 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
519
527
520 // move inside the slice
528 // move inside the slice
521 // pie rectangle: QRectF(60,60 121x121)
529 // pie rectangle: QRectF(60,60 121x121)
522 QSignalSpy hoverSpy(m_series, SIGNAL(hovered(QPieSlice*,bool)));
530 QSignalSpy hoverSpy(m_series, SIGNAL(hovered(QPieSlice*,bool)));
523 QTest::mouseMove(m_view->viewport(), QPoint(139, 85));
531 QTest::mouseMove(m_view->viewport(), QPoint(139, 85));
524 TRY_COMPARE(hoverSpy.count(), 1);
532 TRY_COMPARE(hoverSpy.count(), 1);
525 QCOMPARE(qvariant_cast<QPieSlice*>(hoverSpy.at(0).at(0)), s1);
533 QCOMPARE(qvariant_cast<QPieSlice*>(hoverSpy.at(0).at(0)), s1);
526 QCOMPARE(qvariant_cast<bool>(hoverSpy.at(0).at(1)), true);
534 QCOMPARE(qvariant_cast<bool>(hoverSpy.at(0).at(1)), true);
527
535
528 // move outside the slice
536 // move outside the slice
529 QTest::mouseMove(m_view->viewport(), QPoint(200, 0));
537 QTest::mouseMove(m_view->viewport(), QPoint(200, 0));
530 TRY_COMPARE(hoverSpy.count(), 2);
538 TRY_COMPARE(hoverSpy.count(), 2);
531 QCOMPARE(qvariant_cast<QPieSlice*>(hoverSpy.at(1).at(0)), s1);
539 QCOMPARE(qvariant_cast<QPieSlice*>(hoverSpy.at(1).at(0)), s1);
532 QCOMPARE(qvariant_cast<bool>(hoverSpy.at(1).at(1)), false);
540 QCOMPARE(qvariant_cast<bool>(hoverSpy.at(1).at(1)), false);
533 }
541 }
534
542
535 void tst_qpieseries::sliceSeries()
543 void tst_qpieseries::sliceSeries()
536 {
544 {
537 QPieSlice *slice = new QPieSlice();
545 QPieSlice *slice = new QPieSlice();
538 QVERIFY(!slice->series());
546 QVERIFY(!slice->series());
539 delete slice;
547 delete slice;
540
548
541 slice = new QPieSlice(m_series);
549 slice = new QPieSlice(m_series);
542 QVERIFY(!slice->series());
550 QVERIFY(!slice->series());
543
551
544 m_series->append(slice);
552 m_series->append(slice);
545 QCOMPARE(slice->series(), m_series);
553 QCOMPARE(slice->series(), m_series);
546
554
547 slice = new QPieSlice();
555 slice = new QPieSlice();
548 m_series->insert(0, slice);
556 m_series->insert(0, slice);
549 QCOMPARE(slice->series(), m_series);
557 QCOMPARE(slice->series(), m_series);
550 }
558 }
551
559
552 QTEST_MAIN(tst_qpieseries)
560 QTEST_MAIN(tst_qpieseries)
553
561
554 #include "tst_qpieseries.moc"
562 #include "tst_qpieseries.moc"
555
563
General Comments 0
You need to be logged in to leave comments. Login now