##// END OF EJS Templates
Revert: Pie now has defualt Model to which slice data is copied.
Marek Rosa -
r1204:9aa9e4af8c0e
parent child
Show More
@@ -1,949 +1,813
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 "pieslicedata_p.h"
24 #include "pieslicedata_p.h"
25 #include "chartdataset_p.h"
25 #include "chartdataset_p.h"
26 #include "charttheme_p.h"
26 #include "charttheme_p.h"
27 #include "chartanimator_p.h"
27 #include "chartanimator_p.h"
28 #include "legendmarker_p.h"
28 #include "legendmarker_p.h"
29 //#include <QAbstractItemModel>
29 #include <QAbstractItemModel>
30 #include <QStandardItemModel>
31 #include "qpiemodelmapper.h"
30 #include "qpiemodelmapper.h"
32
31
33 QTCOMMERCIALCHART_BEGIN_NAMESPACE
32 QTCOMMERCIALCHART_BEGIN_NAMESPACE
34
33
35 /*!
34 /*!
36 \class QPieSeries
35 \class QPieSeries
37 \brief Pie series API for QtCommercial Charts
36 \brief Pie series API for QtCommercial Charts
38
37
39 The pie series defines a pie chart which consists of pie slices which are defined as QPieSlice objects.
38 The pie series defines a pie chart which consists of pie slices which are defined as QPieSlice objects.
40 The slices can have any values as the QPieSeries will calculate its relative value to the sum of all slices.
39 The slices can have any values as the QPieSeries will calculate its relative value to the sum of all slices.
41 The actual slice size is determined by that relative value.
40 The actual slice size is determined by that relative value.
42
41
43 Pie size and position on the chart is controlled by using relative values which range from 0.0 to 1.0
42 Pie size and position on the chart is controlled by using relative values which range from 0.0 to 1.0
44 These relate to the actual chart rectangle.
43 These relate to the actual chart rectangle.
45
44
46 By default the pie is defined as a full pie but it can also be a partial pie.
45 By default the pie is defined as a full pie but it can also be a partial pie.
47 This can be done by setting a starting angle and angle span to the series.
46 This can be done by setting a starting angle and angle span to the series.
48 Full pie is 360 degrees where 0 is at 12 a'clock.
47 Full pie is 360 degrees where 0 is at 12 a'clock.
49
48
50 See the \l {PieChart Example} {pie chart example} to learn how to create a simple pie chart.
49 See the \l {PieChart Example} {pie chart example} to learn how to create a simple pie chart.
51 \image examples_piechart.png
50 \image examples_piechart.png
52 */
51 */
53
52
54 /*!
53 /*!
55 \property QPieSeries::horizontalPosition
54 \property QPieSeries::horizontalPosition
56 \brief Defines the horizontal position of the pie.
55 \brief Defines the horizontal position of the pie.
57
56
58 The value is a relative value to the chart rectangle where:
57 The value is a relative value to the chart rectangle where:
59
58
60 \list
59 \list
61 \o 0.0 is the absolute left.
60 \o 0.0 is the absolute left.
62 \o 1.0 is the absolute right.
61 \o 1.0 is the absolute right.
63 \endlist
62 \endlist
64
63
65 Default value is 0.5 (center).
64 Default value is 0.5 (center).
66 */
65 */
67
66
68 /*!
67 /*!
69 \property QPieSeries::verticalPosition
68 \property QPieSeries::verticalPosition
70 \brief Defines the vertical position of the pie.
69 \brief Defines the vertical position of the pie.
71
70
72 The value is a relative value to the chart rectangle where:
71 The value is a relative value to the chart rectangle where:
73
72
74 \list
73 \list
75 \o 0.0 is the absolute top.
74 \o 0.0 is the absolute top.
76 \o 1.0 is the absolute bottom.
75 \o 1.0 is the absolute bottom.
77 \endlist
76 \endlist
78
77
79 Default value is 0.5 (center).
78 Default value is 0.5 (center).
80 */
79 */
81
80
82 /*!
81 /*!
83 \property QPieSeries::size
82 \property QPieSeries::size
84 \brief Defines the pie size.
83 \brief Defines the pie size.
85
84
86 The value is a relative value to the chart rectangle where:
85 The value is a relative value to the chart rectangle where:
87
86
88 \list
87 \list
89 \o 0.0 is the minimum size (pie not drawn).
88 \o 0.0 is the minimum size (pie not drawn).
90 \o 1.0 is the maximum size that can fit the chart.
89 \o 1.0 is the maximum size that can fit the chart.
91 \endlist
90 \endlist
92
91
93 Default value is 0.7.
92 Default value is 0.7.
94 */
93 */
95
94
96 /*!
95 /*!
97 \property QPieSeries::startAngle
96 \property QPieSeries::startAngle
98 \brief Defines the starting angle of the pie.
97 \brief Defines the starting angle of the pie.
99
98
100 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
99 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
101
100
102 Default is value is 0.
101 Default is value is 0.
103 */
102 */
104
103
105 /*!
104 /*!
106 \property QPieSeries::endAngle
105 \property QPieSeries::endAngle
107 \brief Defines the ending angle of the pie.
106 \brief Defines the ending angle of the pie.
108
107
109 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
108 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
110
109
111 Default is value is 360.
110 Default is value is 360.
112 */
111 */
113
112
114
113
115 /*!
114 /*!
116 Constructs a series object which is a child of \a parent.
115 Constructs a series object which is a child of \a parent.
117 */
116 */
118 QPieSeries::QPieSeries(QObject *parent) :
117 QPieSeries::QPieSeries(QObject *parent) :
119 QAbstractSeries(*new QPieSeriesPrivate(this),parent)
118 QAbstractSeries(*new QPieSeriesPrivate(this),parent)
120 {
119 {
121
120
122 }
121 }
123
122
124 /*!
123 /*!
125 Destroys the series and its slices.
124 Destroys the series and its slices.
126 */
125 */
127 QPieSeries::~QPieSeries()
126 QPieSeries::~QPieSeries()
128 {
127 {
129 // NOTE: d_prt destroyed by QObject
128 // NOTE: d_prt destroyed by QObject
130 }
129 }
131
130
132 /*!
131 /*!
133 Returns QChartSeries::SeriesTypePie.
132 Returns QChartSeries::SeriesTypePie.
134 */
133 */
135 QAbstractSeries::SeriesType QPieSeries::type() const
134 QAbstractSeries::SeriesType QPieSeries::type() const
136 {
135 {
137 return QAbstractSeries::SeriesTypePie;
136 return QAbstractSeries::SeriesTypePie;
138 }
137 }
139
138
140 /*!
139 /*!
141 Appends an array of \a slices to the series.
140 Appends an array of \a slices to the series.
142 Slice ownership is passed to the series.
141 Slice ownership is passed to the series.
143 */
142 */
144 bool QPieSeries::append(QList<QPieSlice*> slices)
143 bool QPieSeries::append(QList<QPieSlice*> slices)
145 {
144 {
146 Q_D(QPieSeries);
145 Q_D(QPieSeries);
147
146
148 if (slices.count() == 0)
147 if (slices.count() == 0)
149 return false;
148 return false;
150
149
151 foreach (QPieSlice* s, slices) {
150 foreach (QPieSlice* s, slices) {
152 if (!s || d->m_slices.contains(s))
151 if (!s || d->m_slices.contains(s))
153 return false;
152 return false;
154 }
153 }
155
154
156 foreach (QPieSlice* s, slices) {
155 foreach (QPieSlice* s, slices) {
157 s->setParent(this);
156 s->setParent(this);
158 d->m_slices << s;
157 d->m_slices << s;
159 }
158 }
160
159
161 d->updateDerivativeData();
160 d->updateDerivativeData();
162
161
163 foreach (QPieSlice* s, slices) {
162 foreach (QPieSlice* s, slices) {
164 connect(s, SIGNAL(changed()), d, SLOT(sliceChanged()));
163 connect(s, SIGNAL(changed()), d, SLOT(sliceChanged()));
165 connect(s, SIGNAL(clicked()), d, SLOT(sliceClicked()));
164 connect(s, SIGNAL(clicked()), d, SLOT(sliceClicked()));
166 connect(s, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
165 connect(s, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
167 }
166 }
168
167
169 emit d->added(slices);
168 emit d->added(slices);
170
169
171 return true;
170 return true;
172 }
171 }
173
172
174 /*!
173 /*!
175 Appends a single \a slice to the series.
174 Appends a single \a slice to the series.
176 Slice ownership is passed to the series.
175 Slice ownership is passed to the series.
177 */
176 */
178 bool QPieSeries::append(QPieSlice* slice)
177 bool QPieSeries::append(QPieSlice* slice)
179 {
178 {
180 return append(QList<QPieSlice*>() << slice);
179 return append(QList<QPieSlice*>() << slice);
181 }
180 }
182
181
183 /*!
182 /*!
184 Appends a single \a slice to the series and returns a reference to the series.
183 Appends a single \a slice to the series and returns a reference to the series.
185 Slice ownership is passed to the series.
184 Slice ownership is passed to the series.
186 */
185 */
187 QPieSeries& QPieSeries::operator << (QPieSlice* slice)
186 QPieSeries& QPieSeries::operator << (QPieSlice* slice)
188 {
187 {
189 append(slice);
188 append(slice);
190 return *this;
189 return *this;
191 }
190 }
192
191
193
192
194 /*!
193 /*!
195 Appends a single slice to the series with give \a value and \a name.
194 Appends a single slice to the series with give \a value and \a name.
196 Slice ownership is passed to the series.
195 Slice ownership is passed to the series.
197 */
196 */
198 QPieSlice* QPieSeries::append(qreal value, QString name)
197 QPieSlice* QPieSeries::append(qreal value, QString name)
199 {
198 {
200 QPieSlice* slice = new QPieSlice(value, name);
199 QPieSlice* slice = new QPieSlice(value, name);
201 append(slice);
200 append(slice);
202 return slice;
201 return slice;
203 }
202 }
204
203
205 /*!
204 /*!
206 Inserts a single \a slice to the series before the slice at \a index position.
205 Inserts a single \a slice to the series before the slice at \a index position.
207 Slice ownership is passed to the series.
206 Slice ownership is passed to the series.
208 */
207 */
209 bool QPieSeries::insert(int index, QPieSlice* slice)
208 bool QPieSeries::insert(int index, QPieSlice* slice)
210 {
209 {
211 Q_D(QPieSeries);
210 Q_D(QPieSeries);
212
211
213 if (index < 0 || index > d->m_slices.count())
212 if (index < 0 || index > d->m_slices.count())
214 return false;
213 return false;
215
214
216 if (!slice || d->m_slices.contains(slice))
215 if (!slice || d->m_slices.contains(slice))
217 return false;
216 return false;
218
217
219 d->m_model->insertRow(index);
218 slice->setParent(this);
220 if (d->m_mapper->orientation() == Qt::Vertical) {
219 d->m_slices.insert(index, slice);
221 d->m_model->setData(d->m_model->index(index, d->m_mapper->mapValues()), slice->value());
222 d->m_model->setData(d->m_model->index(index, d->m_mapper->mapLabels()), slice->label());
223 } else {
224 d->m_model->setData(d->m_model->index(d->m_mapper->mapValues(), index), slice->value());
225 d->m_model->setData(d->m_model->index(d->m_mapper->mapLabels(), index), slice->label());
226 }
227
228 // if (index < 0 || index > d->m_slices.count())
229 // return false;
230
231 // if (!slice || d->m_slices.contains(slice))
232 // return false;
233
234 // slice->setParent(this);
235 // d->m_slices.insert(index, slice);
236
237 // d->updateDerivativeData();
238
239 // connect(slice, SIGNAL(changed()), d, SLOT(sliceChanged()));
240 // connect(slice, SIGNAL(clicked()), d, SLOT(sliceClicked()));
241 // connect(slice, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
242
220
243 // emit d->added(QList<QPieSlice*>() << slice);
221 d->updateDerivativeData();
244
222
223 connect(slice, SIGNAL(changed()), d, SLOT(sliceChanged()));
224 connect(slice, SIGNAL(clicked()), d, SLOT(sliceClicked()));
225 connect(slice, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
245
226
227 emit d->added(QList<QPieSlice*>() << slice);
246
228
247 return true;
229 return true;
248 }
230 }
249
231
250 /*!
232 /*!
251 Removes a single \a slice from the series and deletes the slice.
233 Removes a single \a slice from the series and deletes the slice.
252
234
253 Do not reference the pointer after this call.
235 Do not reference the pointer after this call.
254 */
236 */
255 bool QPieSeries::remove(QPieSlice* slice)
237 bool QPieSeries::remove(QPieSlice* slice)
256 {
238 {
257 Q_D(QPieSeries);
239 Q_D(QPieSeries);
258
240
259 if (!d->m_slices.removeOne(slice))
241 if (!d->m_slices.removeOne(slice))
260 return false;
242 return false;
261
243
262 d->updateDerivativeData();
244 d->updateDerivativeData();
263
245
264 emit d->removed(QList<QPieSlice*>() << slice);
246 emit d->removed(QList<QPieSlice*>() << slice);
265
247
266 delete slice;
248 delete slice;
267 slice = 0;
249 slice = 0;
268
250
269 return true;
251 return true;
270 }
252 }
271
253
272 /*!
254 /*!
273 Clears all slices from the series.
255 Clears all slices from the series.
274 */
256 */
275 void QPieSeries::clear()
257 void QPieSeries::clear()
276 {
258 {
277 Q_D(QPieSeries);
259 Q_D(QPieSeries);
278 if (count() == 0)
260 if (d->m_slices.count() == 0)
279 return;
261 return;
280 if (d->m_mapper->orientation() == Qt::Vertical)
281 d->m_model->removeRows(d->m_mapper->first(), count());
282 else
283 d->m_model->removeColumns(d->m_mapper->first(), count());
284 // if (d->m_slices.count() == 0)
285 // return;
286
262
287 // QList<QPieSlice*> slices = d->m_slices;
263 QList<QPieSlice*> slices = d->m_slices;
288 // foreach (QPieSlice* s, d->m_slices) {
264 foreach (QPieSlice* s, d->m_slices) {
289 // d->m_slices.removeOne(s);
265 d->m_slices.removeOne(s);
290 // delete s;
266 delete s;
291 // }
267 }
292
268
293 // d->updateDerivativeData();
269 d->updateDerivativeData();
294
270
295 // emit d->removed(slices);
271 emit d->removed(slices);
296 }
272 }
297
273
298 /*!
274 /*!
299 returns the number of the slices in this series.
275 returns the number of the slices in this series.
300 */
276 */
301 int QPieSeries::count() const
277 int QPieSeries::count() const
302 {
278 {
303 Q_D(const QPieSeries);
279 Q_D(const QPieSeries);
304 // return d->m_slices.count();
280 return d->m_slices.count();
305
306 // if (d->m_model && d->m_mapper) {
307
308 if (d->m_mapper->orientation() == Qt::Vertical) {
309 // data is in a column. Return the number of mapped items if the model's column have enough items
310 // or the number of items that can be mapped
311 if (d->m_mapper->mapValues() >= d->m_model->columnCount() || d->m_mapper->mapLabels() >= d->m_model->columnCount())
312 return 0; // mapped columns are not existing
313 else if (d->m_mapper->count() != -1)
314 // void setModelMapper(QPieModelMapper *mapper);
315 return qMin(d->m_mapper->count(), qMax(d->m_model->rowCount() - d->m_mapper->first(), 0));
316 else
317 return qMax(d->m_model->rowCount() - d->m_mapper->first(), 0);
318 } else {
319 // data is in a row. Return the number of mapped items if the model's row have enough items
320 // or the number of items that can be mapped
321 if (d->m_mapper->mapValues() >= d->m_model->rowCount() || d->m_mapper->mapLabels() >= d->m_model->rowCount())
322 return 0; // mapped rows are not existing
323 else if (d->m_mapper->count() != -1)
324 return qMin(d->m_mapper->count(), qMax(d->m_model->columnCount() - d->m_mapper->first(), 0));
325 else
326 return qMax(d->m_model->columnCount() - d->m_mapper->first(), 0);
327 }
328 // }
329 }
281 }
330
282
331 /*!
283 /*!
332 Returns true is the series is empty.
284 Returns true is the series is empty.
333 */
285 */
334 bool QPieSeries::isEmpty() const
286 bool QPieSeries::isEmpty() const
335 {
287 {
336 Q_D(const QPieSeries);
288 Q_D(const QPieSeries);
337 return d->m_slices.isEmpty();
289 return d->m_slices.isEmpty();
338 }
290 }
339
291
340 /*!
292 /*!
341 Returns a list of slices that belong to this series.
293 Returns a list of slices that belong to this series.
342 */
294 */
343 QList<QPieSlice*> QPieSeries::slices() const
295 QList<QPieSlice*> QPieSeries::slices() const
344 {
296 {
345 Q_D(const QPieSeries);
297 Q_D(const QPieSeries);
346 return d->m_slices;
298 return d->m_slices;
347 }
299 }
348
300
349 void QPieSeries::setHorizontalPosition(qreal relativePosition)
301 void QPieSeries::setHorizontalPosition(qreal relativePosition)
350 {
302 {
351 Q_D(QPieSeries);
303 Q_D(QPieSeries);
352 if (d->setRealValue(d->m_pieRelativeHorPos, relativePosition, 1.0))
304 if (d->setRealValue(d->m_pieRelativeHorPos, relativePosition, 1.0))
353 emit d->piePositionChanged();
305 emit d->piePositionChanged();
354 }
306 }
355
307
356 void QPieSeries::setVerticalPosition(qreal relativePosition)
308 void QPieSeries::setVerticalPosition(qreal relativePosition)
357 {
309 {
358 Q_D(QPieSeries);
310 Q_D(QPieSeries);
359 if (d->setRealValue(d->m_pieRelativeVerPos, relativePosition, 1.0))
311 if (d->setRealValue(d->m_pieRelativeVerPos, relativePosition, 1.0))
360 emit d->piePositionChanged();
312 emit d->piePositionChanged();
361 }
313 }
362
314
363 qreal QPieSeries::horizontalPosition() const
315 qreal QPieSeries::horizontalPosition() const
364 {
316 {
365 Q_D(const QPieSeries);
317 Q_D(const QPieSeries);
366 return d->m_pieRelativeHorPos;
318 return d->m_pieRelativeHorPos;
367 }
319 }
368
320
369 qreal QPieSeries::verticalPosition() const
321 qreal QPieSeries::verticalPosition() const
370 {
322 {
371 Q_D(const QPieSeries);
323 Q_D(const QPieSeries);
372 return d->m_pieRelativeVerPos;
324 return d->m_pieRelativeVerPos;
373 }
325 }
374
326
375 void QPieSeries::setPieSize(qreal relativeSize)
327 void QPieSeries::setPieSize(qreal relativeSize)
376 {
328 {
377 Q_D(QPieSeries);
329 Q_D(QPieSeries);
378 if (d->setRealValue(d->m_pieRelativeSize, relativeSize, 1.0))
330 if (d->setRealValue(d->m_pieRelativeSize, relativeSize, 1.0))
379 emit d->pieSizeChanged();
331 emit d->pieSizeChanged();
380 }
332 }
381
333
382 qreal QPieSeries::pieSize() const
334 qreal QPieSeries::pieSize() const
383 {
335 {
384 Q_D(const QPieSeries);
336 Q_D(const QPieSeries);
385 return d->m_pieRelativeSize;
337 return d->m_pieRelativeSize;
386 }
338 }
387
339
388
340
389 void QPieSeries::setPieStartAngle(qreal angle)
341 void QPieSeries::setPieStartAngle(qreal angle)
390 {
342 {
391 Q_D(QPieSeries);
343 Q_D(QPieSeries);
392 if (d->setRealValue(d->m_pieStartAngle, angle, d->m_pieEndAngle))
344 if (d->setRealValue(d->m_pieStartAngle, angle, d->m_pieEndAngle))
393 d->updateDerivativeData();
345 d->updateDerivativeData();
394 }
346 }
395
347
396 qreal QPieSeries::pieStartAngle() const
348 qreal QPieSeries::pieStartAngle() const
397 {
349 {
398 Q_D(const QPieSeries);
350 Q_D(const QPieSeries);
399 return d->m_pieStartAngle;
351 return d->m_pieStartAngle;
400 }
352 }
401
353
402 /*!
354 /*!
403 Sets the end angle of the pie.
355 Sets the end angle of the pie.
404
356
405 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
357 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
406
358
407 \a angle must be greater than start angle.
359 \a angle must be greater than start angle.
408
360
409 \sa pieEndAngle(), pieStartAngle(), setPieStartAngle()
361 \sa pieEndAngle(), pieStartAngle(), setPieStartAngle()
410 */
362 */
411 void QPieSeries::setPieEndAngle(qreal angle)
363 void QPieSeries::setPieEndAngle(qreal angle)
412 {
364 {
413 Q_D(QPieSeries);
365 Q_D(QPieSeries);
414
366
415 if (d->setRealValue(d->m_pieEndAngle, angle, 360.0, d->m_pieStartAngle))
367 if (d->setRealValue(d->m_pieEndAngle, angle, 360.0, d->m_pieStartAngle))
416 d->updateDerivativeData();
368 d->updateDerivativeData();
417 }
369 }
418
370
419 /*!
371 /*!
420 Returns the end angle of the pie.
372 Returns the end angle of the pie.
421
373
422 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
374 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
423
375
424 \sa setPieEndAngle(), pieStartAngle(), setPieStartAngle()
376 \sa setPieEndAngle(), pieStartAngle(), setPieStartAngle()
425 */
377 */
426 qreal QPieSeries::pieEndAngle() const
378 qreal QPieSeries::pieEndAngle() const
427 {
379 {
428 Q_D(const QPieSeries);
380 Q_D(const QPieSeries);
429 return d->m_pieEndAngle;
381 return d->m_pieEndAngle;
430 }
382 }
431
383
432 /*!
384 /*!
433 Sets the all the slice labels \a visible or invisible.
385 Sets the all the slice labels \a visible or invisible.
434
386
435 \sa QPieSlice::isLabelVisible(), QPieSlice::setLabelVisible()
387 \sa QPieSlice::isLabelVisible(), QPieSlice::setLabelVisible()
436 */
388 */
437 void QPieSeries::setLabelsVisible(bool visible)
389 void QPieSeries::setLabelsVisible(bool visible)
438 {
390 {
439 Q_D(QPieSeries);
391 Q_D(QPieSeries);
440 foreach (QPieSlice* s, d->m_slices)
392 foreach (QPieSlice* s, d->m_slices)
441 s->setLabelVisible(visible);
393 s->setLabelVisible(visible);
442 }
394 }
443
395
444 /*!
396 /*!
445 Returns the sum of all slice values in this series.
397 Returns the sum of all slice values in this series.
446
398
447 \sa QPieSlice::value(), QPieSlice::setValue(), QPieSlice::percentage()
399 \sa QPieSlice::value(), QPieSlice::setValue(), QPieSlice::percentage()
448 */
400 */
449 qreal QPieSeries::sum() const
401 qreal QPieSeries::sum() const
450 {
402 {
451 Q_D(const QPieSeries);
403 Q_D(const QPieSeries);
452 return d->m_sum;
404 return d->m_sum;
453 }
405 }
454
406
455 /*!
407 /*!
456 \fn void QPieSeries::clicked(QPieSlice* slice)
408 \fn void QPieSeries::clicked(QPieSlice* slice)
457
409
458 This signal is emitted when a \a slice has been clicked.
410 This signal is emitted when a \a slice has been clicked.
459
411
460 \sa QPieSlice::clicked()
412 \sa QPieSlice::clicked()
461 */
413 */
462
414
463 /*!
415 /*!
464 \fn void QPieSeries::hovered(QPieSlice* slice, bool state)
416 \fn void QPieSeries::hovered(QPieSlice* slice, bool state)
465
417
466 This signal is emitted when user has hovered over or away from the \a slice.
418 This signal is emitted when user has hovered over or away from the \a slice.
467
419
468 \a state is true when user has hovered over the slice and false when hover has moved away from the slice.
420 \a state is true when user has hovered over the slice and false when hover has moved away from the slice.
469
421
470 \sa QPieSlice::hovered()
422 \sa QPieSlice::hovered()
471 */
423 */
472
424
473 /*!
425 /*!
474 \fn bool QPieSeries::setModel(QAbstractItemModel *model)
426 \fn bool QPieSeries::setModel(QAbstractItemModel *model)
475 Sets the \a model to be used as a data source
427 Sets the \a model to be used as a data source
476 */
428 */
477 void QPieSeries::setModel(QAbstractItemModel* model)
429 void QPieSeries::setModel(QAbstractItemModel* model)
478 {
430 {
479 Q_D(QPieSeries);
431 Q_D(QPieSeries);
432 // disconnect signals from old model
433 if(d->m_model)
434 {
435 disconnect(d->m_model, 0, this, 0);
436 }
480
437
481 // set new model
438 // set new model
482 if(model)
439 if(model)
483 {
440 {
484 // disconnect signals from old model and delete it
485 disconnect(d->m_model, 0, this, 0);
486 delete d->m_model;
487
488 d->m_model = model;
441 d->m_model = model;
489 // connect signals from the model
442 // connect signals from the model
490 connect(d->m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex,QModelIndex)));
443 connect(d->m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex,QModelIndex)));
491 connect(d->m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), d, SLOT(modelRowsAdded(QModelIndex,int,int)));
444 connect(d->m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), d, SLOT(modelRowsAdded(QModelIndex,int,int)));
492 connect(d->m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), d, SLOT(modelRowsRemoved(QModelIndex,int,int)));
445 connect(d->m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), d, SLOT(modelRowsRemoved(QModelIndex,int,int)));
493 connect(d->m_model, SIGNAL(columnsInserted(QModelIndex,int,int)), d, SLOT(modelColumnsAdded(QModelIndex,int,int)));
446 connect(d->m_model, SIGNAL(columnsInserted(QModelIndex,int,int)), d, SLOT(modelColumnsAdded(QModelIndex,int,int)));
494 connect(d->m_model, SIGNAL(columnsRemoved(QModelIndex,int,int)), d, SLOT(modelColumnsRemoved(QModelIndex,int,int)));
447 connect(d->m_model, SIGNAL(columnsRemoved(QModelIndex,int,int)), d, SLOT(modelColumnsRemoved(QModelIndex,int,int)));
495
448
496 if (d->m_mapper)
449 if (d->m_mapper)
497 d->initializePieFromModel();
450 d->initializePieFromModel();
498 }
451 }
499 // else
452 else
500 // {
453 {
501 // d->m_model = new QStandardItemModel;
454 d->m_model = 0;
502 // d->m_mapper->reset();
455 }
503 // d->m_mapper->setMapLabels(0);
456 }
504 // d->m_mapper->setMapValues(1);
457
505 // }
458 void QPieSeries::setModelMapper(QPieModelMapper *mapper)
506 }
459 {
507
460 Q_D(QPieSeries);
508 //void QPieSeries::setModelMapper(QPieModelMapper *mapper)
461 // disconnect signals from old mapper
509 //{
462 if (d->m_mapper) {
510 // Q_D(QPieSeries);
463 QObject::disconnect(d->m_mapper, 0, this, 0);
511 // // disconnect signals from old mapper
464 }
512 // if (d->m_mapper) {
465
513 // QObject::disconnect(d->m_mapper, 0, this, 0);
466 if (mapper) {
514 // }
467 d->m_mapper = mapper;
515
468 // connect the signal from the mapper
516 // if (mapper) {
469 connect(d->m_mapper, SIGNAL(updated()), d, SLOT(initializePieFromModel()));
517 // d->m_mapper = mapper;
470
518
471 if (d->m_model)
519 // if (d->m_model)
472 d->initializePieFromModel();
520 // d->initializePieFromModel();
473 } else {
521 // } else {
474 d->m_mapper = 0;
522 // d->m_mapper = new QPieModelMapper;
475 }
523 // d->m_mapper->setMapLabels(0);
476 }
524 // d->m_mapper->setMapValues(1);
525 // }
526
527 // // connect the signal from the mapper
528 // connect(d->m_mapper, SIGNAL(updated()), d, SLOT(initializePieFromModel()));
529 //}
530
477
531 QPieModelMapper* QPieSeries::modelMapper() const
478 QPieModelMapper* QPieSeries::modelMapper() const
532 {
479 {
533 Q_D(const QPieSeries);
480 Q_D(const QPieSeries);
534 return d->m_mapper;
481 return d->m_mapper;
535 }
482 }
536
483
537 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
484 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
538
485
539
486
540 QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) :
487 QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) :
541 QAbstractSeriesPrivate(parent),
488 QAbstractSeriesPrivate(parent),
542 m_pieRelativeHorPos(0.5),
489 m_pieRelativeHorPos(0.5),
543 m_pieRelativeVerPos(0.5),
490 m_pieRelativeVerPos(0.5),
544 m_pieRelativeSize(0.7),
491 m_pieRelativeSize(0.7),
545 m_pieStartAngle(0),
492 m_pieStartAngle(0),
546 m_pieEndAngle(360),
493 m_pieEndAngle(360),
547 m_sum(0),
494 m_sum(0),
548 m_model(new QStandardItemModel),
495 m_mapper(0)
549 m_mapper(new QPieModelMapper)
550 {
496 {
551 // connect signals from the model
552 connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex,QModelIndex)));
553 connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(modelRowsAdded(QModelIndex,int,int)));
554 connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(modelRowsRemoved(QModelIndex,int,int)));
555 connect(m_model, SIGNAL(columnsInserted(QModelIndex,int,int)), this, SLOT(modelColumnsAdded(QModelIndex,int,int)));
556 connect(m_model, SIGNAL(columnsRemoved(QModelIndex,int,int)), this, SLOT(modelColumnsRemoved(QModelIndex,int,int)));
557
497
558 // connect the signal from the mapper
559 connect(m_mapper, SIGNAL(updated()), this, SLOT(initializePieFromModel()));
560 }
498 }
561
499
562 QPieSeriesPrivate::~QPieSeriesPrivate()
500 QPieSeriesPrivate::~QPieSeriesPrivate()
563 {
501 {
564
502
565 }
503 }
566
504
567 void QPieSeriesPrivate::updateDerivativeData()
505 void QPieSeriesPrivate::updateDerivativeData()
568 {
506 {
569 m_sum = 0;
507 m_sum = 0;
570
508
571 // nothing to do?
509 // nothing to do?
572 if (m_slices.count() == 0)
510 if (m_slices.count() == 0)
573 return;
511 return;
574
512
575 // calculate sum of all slices
513 // calculate sum of all slices
576 foreach (QPieSlice* s, m_slices)
514 foreach (QPieSlice* s, m_slices)
577 m_sum += s->value();
515 m_sum += s->value();
578
516
579 // nothing to show..
517 // nothing to show..
580 if (qFuzzyIsNull(m_sum))
518 if (qFuzzyIsNull(m_sum))
581 return;
519 return;
582
520
583 // update slice attributes
521 // update slice attributes
584 qreal sliceAngle = m_pieStartAngle;
522 qreal sliceAngle = m_pieStartAngle;
585 qreal pieSpan = m_pieEndAngle - m_pieStartAngle;
523 qreal pieSpan = m_pieEndAngle - m_pieStartAngle;
586 QVector<QPieSlice*> changed;
524 QVector<QPieSlice*> changed;
587 foreach (QPieSlice* s, m_slices) {
525 foreach (QPieSlice* s, m_slices) {
588
526
589 PieSliceData data = PieSliceData::data(s);
527 PieSliceData data = PieSliceData::data(s);
590 data.m_percentage = s->value() / m_sum;
528 data.m_percentage = s->value() / m_sum;
591 data.m_angleSpan = pieSpan * data.m_percentage;
529 data.m_angleSpan = pieSpan * data.m_percentage;
592 data.m_startAngle = sliceAngle;
530 data.m_startAngle = sliceAngle;
593 sliceAngle += data.m_angleSpan;
531 sliceAngle += data.m_angleSpan;
594
532
595 if (PieSliceData::data(s) != data) {
533 if (PieSliceData::data(s) != data) {
596 PieSliceData::data(s) = data;
534 PieSliceData::data(s) = data;
597 changed << s;
535 changed << s;
598 }
536 }
599 }
537 }
600
538
601 // emit signals
539 // emit signals
602 foreach (QPieSlice* s, changed)
540 foreach (QPieSlice* s, changed)
603 PieSliceData::data(s).emitChangedSignal(s);
541 PieSliceData::data(s).emitChangedSignal(s);
604 }
542 }
605
543
606 QPieSeriesPrivate* QPieSeriesPrivate::seriesData(QPieSeries &series)
544 QPieSeriesPrivate* QPieSeriesPrivate::seriesData(QPieSeries &series)
607 {
545 {
608 return series.d_func();
546 return series.d_func();
609 }
547 }
610
548
611 void QPieSeriesPrivate::sliceChanged()
549 void QPieSeriesPrivate::sliceChanged()
612 {
550 {
613 Q_ASSERT(m_slices.contains(qobject_cast<QPieSlice *>(sender())));
551 Q_ASSERT(m_slices.contains(qobject_cast<QPieSlice *>(sender())));
614 QPieSlice *slice = qobject_cast<QPieSlice *>(sender());
615 int sliceIndex = m_slices.indexOf(slice);
616 if (m_mapper->orientation() == Qt::Vertical) {
617 QModelIndex modelIndex = m_model->index(sliceIndex + m_mapper->first(), m_mapper->mapValues());
618 if (m_model->data(modelIndex).toReal() != slice->value())
619 m_model->setData(modelIndex, slice->value());
620 modelIndex = m_model->index(sliceIndex + m_mapper->first(), m_mapper->mapLabels());
621 if (m_model->data(modelIndex).toString() != slice->label())
622 m_model->setData(modelIndex, slice->label());
623 } else {
624 QModelIndex modelIndex = m_model->index(m_mapper->mapValues(), sliceIndex + m_mapper->first());
625 if (m_model->data(modelIndex).toReal() != slice->value())
626 m_model->setData(modelIndex, slice->value());
627 modelIndex = m_model->index(m_mapper->mapLabels(), sliceIndex + m_mapper->first());
628 if (m_model->data(modelIndex).toString() != slice->label())
629 m_model->setData(modelIndex, slice->label());
630 }
631 updateDerivativeData();
552 updateDerivativeData();
632 }
553 }
633
554
634 void QPieSeriesPrivate::sliceClicked()
555 void QPieSeriesPrivate::sliceClicked()
635 {
556 {
636 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
557 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
637 Q_ASSERT(m_slices.contains(slice));
558 Q_ASSERT(m_slices.contains(slice));
638 Q_Q(QPieSeries);
559 Q_Q(QPieSeries);
639 emit q->clicked(slice);
560 emit q->clicked(slice);
640 }
561 }
641
562
642 void QPieSeriesPrivate::sliceHovered(bool state)
563 void QPieSeriesPrivate::sliceHovered(bool state)
643 {
564 {
644 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
565 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
645 Q_ASSERT(m_slices.contains(slice));
566 Q_ASSERT(m_slices.contains(slice));
646 Q_Q(QPieSeries);
567 Q_Q(QPieSeries);
647 emit q->hovered(slice, state);
568 emit q->hovered(slice, state);
648 }
569 }
649
570
650 void QPieSeriesPrivate::doClear()
651 {
652 if (m_slices.count() == 0)
653 return;
654
655 QList<QPieSlice*> slices = m_slices;
656 foreach (QPieSlice* s, m_slices) {
657 m_slices.removeOne(s);
658 delete s;
659 }
660
661 updateDerivativeData();
662
663 emit removed(slices);
664 }
665
666 void QPieSeriesPrivate::doRemove(QPieSlice* slice)
667 {
668 if (!m_slices.removeOne(slice))
669 return;// false;
670
671 updateDerivativeData();
672
673 emit removed(QList<QPieSlice*>() << slice);
674
675 delete slice;
676 slice = 0;
677
678 return;// true;
679 }
680
681 void QPieSeriesPrivate::doInsert(int index, QPieSlice* slice)
682 {
683 if (index < 0 || index > m_slices.count())
684 return;// false;
685
686 if (!slice || m_slices.contains(slice))
687 return;// false;
688
689 slice->setParent(this);
690 m_slices.insert(index, slice);
691
692 updateDerivativeData();
693
694 connect(slice, SIGNAL(changed()), this, SLOT(sliceChanged()));
695 connect(slice, SIGNAL(clicked()), this, SLOT(sliceClicked()));
696 connect(slice, SIGNAL(hovered(bool)), this, SLOT(sliceHovered(bool)));
697
698 emit added(QList<QPieSlice*>() << slice);
699
700 return;// true;
701 }
702
703 void QPieSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
571 void QPieSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
704 {
572 {
705 if (m_mapper) {
573 if (m_mapper) {
706 for (int row = topLeft.row(); row <= bottomRight.row(); row++) {
574 for (int row = topLeft.row(); row <= bottomRight.row(); row++) {
707 for (int column = topLeft.column(); column <= bottomRight.column(); column++) {
575 for (int column = topLeft.column(); column <= bottomRight.column(); column++) {
708 if (m_mapper->orientation() == Qt::Vertical)
576 if (m_mapper->orientation() == Qt::Vertical)
709 {
577 {
710 if ( topLeft.row() >= m_mapper->first() && (m_mapper->count() == - 1 || topLeft.row() < m_mapper->first() + m_mapper->count())) {
578 if ( topLeft.row() >= m_mapper->first() && (m_mapper->count() == - 1 || topLeft.row() < m_mapper->first() + m_mapper->count())) {
711 if (topLeft.column() == m_mapper->mapValues())
579 if (topLeft.column() == m_mapper->mapValues())
712 m_slices.at(topLeft.row() - m_mapper->first())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble());
580 m_slices.at(topLeft.row() - m_mapper->first())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble());
713 if (topLeft.column() == m_mapper->mapLabels())
581 if (topLeft.column() == m_mapper->mapLabels())
714 m_slices.at(topLeft.row() - m_mapper->first())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString());
582 m_slices.at(topLeft.row() - m_mapper->first())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString());
715 }
583 }
716 }
584 }
717 else
585 else
718 {
586 {
719 if (topLeft.column() >= m_mapper->first() && (m_mapper->count() == - 1 || topLeft.column() < m_mapper->first() + m_mapper->count())) {
587 if (topLeft.column() >= m_mapper->first() && (m_mapper->count() == - 1 || topLeft.column() < m_mapper->first() + m_mapper->count())) {
720 if (topLeft.row() == m_mapper->mapValues())
588 if (topLeft.row() == m_mapper->mapValues())
721 m_slices.at(topLeft.column() - m_mapper->first())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble());
589 m_slices.at(topLeft.column() - m_mapper->first())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble());
722 if (topLeft.row() == m_mapper->mapLabels())
590 if (topLeft.row() == m_mapper->mapLabels())
723 m_slices.at(topLeft.column() - m_mapper->first())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString());
591 m_slices.at(topLeft.column() - m_mapper->first())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString());
724 }
592 }
725 }
593 }
726 }
594 }
727 }
595 }
728 }
596 }
729 }
597 }
730
598
731
599
732 void QPieSeriesPrivate::modelRowsAdded(QModelIndex parent, int start, int end)
600 void QPieSeriesPrivate::modelRowsAdded(QModelIndex parent, int start, int end)
733 {
601 {
734 Q_UNUSED(parent);
602 Q_UNUSED(parent);
735 if (m_mapper) {
603 if (m_mapper) {
736 if (m_mapper->orientation() == Qt::Vertical)
604 if (m_mapper->orientation() == Qt::Vertical)
737 insertData(start, end);
605 insertData(start, end);
738 else if (start <= m_mapper->mapValues() || start <= m_mapper->mapLabels()) // if the changes affect the map - reinitialize the pie
606 else if (start <= m_mapper->mapValues() || start <= m_mapper->mapLabels()) // if the changes affect the map - reinitialize the pie
739 initializePieFromModel();
607 initializePieFromModel();
740 }
608 }
741 }
609 }
742
610
743 void QPieSeriesPrivate::modelRowsRemoved(QModelIndex parent, int start, int end)
611 void QPieSeriesPrivate::modelRowsRemoved(QModelIndex parent, int start, int end)
744 {
612 {
745 Q_UNUSED(parent);
613 Q_UNUSED(parent);
746 if (m_mapper) {
614 if (m_mapper) {
747 if (m_mapper->orientation() == Qt::Vertical)
615 if (m_mapper->orientation() == Qt::Vertical)
748 removeData(start, end);
616 removeData(start, end);
749 else if (start <= m_mapper->mapValues() || start <= m_mapper->mapLabels()) // if the changes affect the map - reinitialize the pie
617 else if (start <= m_mapper->mapValues() || start <= m_mapper->mapLabels()) // if the changes affect the map - reinitialize the pie
750 initializePieFromModel();
618 initializePieFromModel();
751 }
619 }
752 }
620 }
753
621
754 void QPieSeriesPrivate::modelColumnsAdded(QModelIndex parent, int start, int end)
622 void QPieSeriesPrivate::modelColumnsAdded(QModelIndex parent, int start, int end)
755 {
623 {
756 Q_UNUSED(parent);
624 Q_UNUSED(parent);
757 if (m_mapper) {
625 if (m_mapper) {
758 if (m_mapper->orientation() == Qt::Horizontal)
626 if (m_mapper->orientation() == Qt::Horizontal)
759 insertData(start, end);
627 insertData(start, end);
760 else if (start <= m_mapper->mapValues() || start <= m_mapper->mapLabels()) // if the changes affect the map - reinitialize the pie
628 else if (start <= m_mapper->mapValues() || start <= m_mapper->mapLabels()) // if the changes affect the map - reinitialize the pie
761 initializePieFromModel();
629 initializePieFromModel();
762 }
630 }
763 }
631 }
764
632
765 void QPieSeriesPrivate::modelColumnsRemoved(QModelIndex parent, int start, int end)
633 void QPieSeriesPrivate::modelColumnsRemoved(QModelIndex parent, int start, int end)
766 {
634 {
767 Q_UNUSED(parent);
635 Q_UNUSED(parent);
768 if (m_mapper) {
636 if (m_mapper) {
769 if (m_mapper->orientation() == Qt::Horizontal)
637 if (m_mapper->orientation() == Qt::Horizontal)
770 removeData(start, end);
638 removeData(start, end);
771 else if (start <= m_mapper->mapValues() || start <= m_mapper->mapLabels()) // if the changes affect the map - reinitialize the pie
639 else if (start <= m_mapper->mapValues() || start <= m_mapper->mapLabels()) // if the changes affect the map - reinitialize the pie
772 initializePieFromModel();
640 initializePieFromModel();
773 }
641 }
774 }
642 }
775
643
776 void QPieSeriesPrivate::insertData(int start, int end)
644 void QPieSeriesPrivate::insertData(int start, int end)
777 {
645 {
778 Q_Q(QPieSeries);
646 Q_Q(QPieSeries);
779 if (m_mapper) {
647 if (m_mapper) {
780 if (m_mapper->count() != -1 && start >= m_mapper->first() + m_mapper->count()) {
648 if (m_mapper->count() != -1 && start >= m_mapper->first() + m_mapper->count()) {
781 return;
649 return;
782 } else {
650 } else {
783 int addedCount = end - start + 1;
651 int addedCount = end - start + 1;
784 if (m_mapper->count() != -1 && addedCount > m_mapper->count())
652 if (m_mapper->count() != -1 && addedCount > m_mapper->count())
785 addedCount = m_mapper->count();
653 addedCount = m_mapper->count();
786 int first = qMax(start, m_mapper->first());
654 int first = qMax(start, m_mapper->first());
787 int last = qMin(first + addedCount - 1, m_mapper->orientation() == Qt::Vertical ? m_model->rowCount() - 1 : m_model->columnCount() - 1);
655 int last = qMin(first + addedCount - 1, m_mapper->orientation() == Qt::Vertical ? m_model->rowCount() - 1 : m_model->columnCount() - 1);
788 for (int i = first; i <= last; i++) {
656 for (int i = first; i <= last; i++) {
789 QPieSlice *slice = new QPieSlice;
657 QPieSlice *slice = new QPieSlice;
790 if (m_mapper->orientation() == Qt::Vertical) {
658 if (m_mapper->orientation() == Qt::Vertical) {
791 slice->setValue(m_model->data(m_model->index(i, m_mapper->mapValues()), Qt::DisplayRole).toDouble());
659 slice->setValue(m_model->data(m_model->index(i, m_mapper->mapValues()), Qt::DisplayRole).toDouble());
792 slice->setLabel(m_model->data(m_model->index(i, m_mapper->mapLabels()), Qt::DisplayRole).toString());
660 slice->setLabel(m_model->data(m_model->index(i, m_mapper->mapLabels()), Qt::DisplayRole).toString());
793 } else {
661 } else {
794 slice->setValue(m_model->data(m_model->index(m_mapper->mapValues(), i), Qt::DisplayRole).toDouble());
662 slice->setValue(m_model->data(m_model->index(m_mapper->mapValues(), i), Qt::DisplayRole).toDouble());
795 slice->setLabel(m_model->data(m_model->index(m_mapper->mapLabels(), i), Qt::DisplayRole).toString());
663 slice->setLabel(m_model->data(m_model->index(m_mapper->mapLabels(), i), Qt::DisplayRole).toString());
796 }
664 }
797 slice->setLabelVisible();
665 slice->setLabelVisible();
798 // q->insert(i - m_mapper->first(), slice);
666 q->insert(i - m_mapper->first(), slice);
799 doInsert(i - m_mapper->first(), slice);
800 }
667 }
801 if (m_mapper->count() != -1 && m_slices.size() > m_mapper->count())
668 if (m_mapper->count() != -1 && m_slices.size() > m_mapper->count())
802 for (int i = m_slices.size() - 1; i >= m_mapper->count(); i--)
669 for (int i = m_slices.size() - 1; i >= m_mapper->count(); i--)
803 // q->remove(q->slices().at(i));
670 q->remove(q->slices().at(i));
804 doRemove(q->slices().at(i));
805 }
671 }
806 }
672 }
807 }
673 }
808
674
809 void QPieSeriesPrivate::removeData(int start, int end)
675 void QPieSeriesPrivate::removeData(int start, int end)
810 {
676 {
811 Q_Q(QPieSeries);
677 Q_Q(QPieSeries);
812 if (m_mapper) {
678 if (m_mapper) {
813 int removedCount = end - start + 1;
679 int removedCount = end - start + 1;
814 if (m_mapper->count() != -1 && start >= m_mapper->first() + m_mapper->count()) {
680 if (m_mapper->count() != -1 && start >= m_mapper->first() + m_mapper->count()) {
815 return;
681 return;
816 } else {
682 } else {
817 int toRemove = qMin(m_slices.size(), removedCount); // first find how many items can actually be removed
683 int toRemove = qMin(m_slices.size(), removedCount); // first find how many items can actually be removed
818 int first = qMax(start, m_mapper->first()); // get the index of the first item that will be removed.
684 int first = qMax(start, m_mapper->first()); // get the index of the first item that will be removed.
819 int last = qMin(first + toRemove - 1, m_slices.size() + m_mapper->first() - 1); // get the index of the last item that will be removed.
685 int last = qMin(first + toRemove - 1, m_slices.size() + m_mapper->first() - 1); // get the index of the last item that will be removed.
820 for (int i = last; i >= first; i--)
686 for (int i = last; i >= first; i--)
821 // q->remove(q->slices().at(i - m_mapper->first()));
687 q->remove(q->slices().at(i - m_mapper->first()));
822 doRemove(q->slices().at(i - m_mapper->first()));
823
688
824 if (m_mapper->count() != -1) {
689 if (m_mapper->count() != -1) {
825 int itemsAvailable; // check how many are available to be added
690 int itemsAvailable; // check how many are available to be added
826 if (m_mapper->orientation() == Qt::Vertical)
691 if (m_mapper->orientation() == Qt::Vertical)
827 itemsAvailable = m_model->rowCount() - m_mapper->first() - m_slices.size();
692 itemsAvailable = m_model->rowCount() - m_mapper->first() - m_slices.size();
828 else
693 else
829 itemsAvailable = m_model->columnCount() - m_mapper->first() - m_slices.size();
694 itemsAvailable = m_model->columnCount() - m_mapper->first() - m_slices.size();
830 int toBeAdded = qMin(itemsAvailable, m_mapper->count() - m_slices.size()); // add not more items than there is space left to be filled.
695 int toBeAdded = qMin(itemsAvailable, m_mapper->count() - m_slices.size()); // add not more items than there is space left to be filled.
831 int currentSize = m_slices.size();
696 int currentSize = m_slices.size();
832 if (toBeAdded > 0)
697 if (toBeAdded > 0)
833 for (int i = m_slices.size(); i < currentSize + toBeAdded; i++) {
698 for (int i = m_slices.size(); i < currentSize + toBeAdded; i++) {
834 QPieSlice *slice = new QPieSlice;
699 QPieSlice *slice = new QPieSlice;
835 if (m_mapper->orientation() == Qt::Vertical) {
700 if (m_mapper->orientation() == Qt::Vertical) {
836 slice->setValue(m_model->data(m_model->index(i + m_mapper->first(), m_mapper->mapValues()), Qt::DisplayRole).toDouble());
701 slice->setValue(m_model->data(m_model->index(i + m_mapper->first(), m_mapper->mapValues()), Qt::DisplayRole).toDouble());
837 slice->setLabel(m_model->data(m_model->index(i + m_mapper->first(), m_mapper->mapLabels()), Qt::DisplayRole).toString());
702 slice->setLabel(m_model->data(m_model->index(i + m_mapper->first(), m_mapper->mapLabels()), Qt::DisplayRole).toString());
838 } else {
703 } else {
839 slice->setValue(m_model->data(m_model->index(m_mapper->mapValues(), i + m_mapper->first()), Qt::DisplayRole).toDouble());
704 slice->setValue(m_model->data(m_model->index(m_mapper->mapValues(), i + m_mapper->first()), Qt::DisplayRole).toDouble());
840 slice->setLabel(m_model->data(m_model->index(m_mapper->mapLabels(), i + m_mapper->first()), Qt::DisplayRole).toString());
705 slice->setLabel(m_model->data(m_model->index(m_mapper->mapLabels(), i + m_mapper->first()), Qt::DisplayRole).toString());
841 }
706 }
842 slice->setLabelVisible();
707 slice->setLabelVisible();
843 // q->insert(i, slice);
708 q->insert(i, slice);
844 doInsert(i, slice);
845 }
709 }
846 }
710 }
847 }
711 }
848 }
712 }
849 }
713 }
850
714
851 void QPieSeriesPrivate::initializePieFromModel()
715 void QPieSeriesPrivate::initializePieFromModel()
852 {
716 {
853 Q_Q(QPieSeries);
717 Q_Q(QPieSeries);
854
718
855 // clear current content
719 // clear current content
856 doClear();
720 q->clear();
857
721
858 if (m_model == 0 || m_mapper == 0)
722 if (m_model == 0 || m_mapper == 0)
859 return;
723 return;
860
724
861 // check if mappings are set
725 // check if mappings are set
862 if (m_mapper->mapValues() == -1 || m_mapper->mapLabels() == -1)
726 if (m_mapper->mapValues() == -1 || m_mapper->mapLabels() == -1)
863 return;
727 return;
864
728
865 // create the initial slices set
729 // create the initial slices set
866 if (m_mapper->orientation() == Qt::Vertical) {
730 if (m_mapper->orientation() == Qt::Vertical) {
867 if (m_mapper->mapValues() >= m_model->columnCount() || m_mapper->mapLabels() >= m_model->columnCount())
731 if (m_mapper->mapValues() >= m_model->columnCount() || m_mapper->mapLabels() >= m_model->columnCount())
868 return; // mapped columns are not existing
732 return; // mapped columns are not existing
869
733
870 int sliceCount = 0;
734 int sliceCount = 0;
871 if(m_mapper->count() == -1)
735 if(m_mapper->count() == -1)
872 sliceCount = m_model->rowCount() - m_mapper->first();
736 sliceCount = m_model->rowCount() - m_mapper->first();
873 else
737 else
874 sliceCount = qMin(m_mapper->count(), m_model->rowCount() - m_mapper->first());
738 sliceCount = qMin(m_mapper->count(), m_model->rowCount() - m_mapper->first());
875 for (int i = m_mapper->first(); i < m_mapper->first() + sliceCount; i++)
739 for (int i = m_mapper->first(); i < m_mapper->first() + sliceCount; i++)
876 q->append(m_model->data(m_model->index(i, m_mapper->mapValues()), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(i, m_mapper->mapLabels()), Qt::DisplayRole).toString());
740 q->append(m_model->data(m_model->index(i, m_mapper->mapValues()), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(i, m_mapper->mapLabels()), Qt::DisplayRole).toString());
877 } else {
741 } else {
878 if (m_mapper->mapValues() >= m_model->rowCount() || m_mapper->mapLabels() >= m_model->rowCount())
742 if (m_mapper->mapValues() >= m_model->rowCount() || m_mapper->mapLabels() >= m_model->rowCount())
879 return; // mapped columns are not existing
743 return; // mapped columns are not existing
880
744
881 int sliceCount = 0;
745 int sliceCount = 0;
882 if(m_mapper->count() == -1)
746 if(m_mapper->count() == -1)
883 sliceCount = m_model->columnCount() - m_mapper->first();
747 sliceCount = m_model->columnCount() - m_mapper->first();
884 else
748 else
885 sliceCount = qMin(m_mapper->count(), m_model->columnCount() - m_mapper->first());
749 sliceCount = qMin(m_mapper->count(), m_model->columnCount() - m_mapper->first());
886 for (int i = m_mapper->first(); i < m_mapper->first() + sliceCount; i++)
750 for (int i = m_mapper->first(); i < m_mapper->first() + sliceCount; i++)
887 q->append(m_model->data(m_model->index(m_mapper->mapValues(), i), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(m_mapper->mapLabels(), i), Qt::DisplayRole).toString());
751 q->append(m_model->data(m_model->index(m_mapper->mapValues(), i), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(m_mapper->mapLabels(), i), Qt::DisplayRole).toString());
888 }
752 }
889 q->setLabelsVisible(true);
753 q->setLabelsVisible(true);
890 }
754 }
891
755
892 bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qreal min)
756 bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qreal min)
893 {
757 {
894 // Remove rounding errors
758 // Remove rounding errors
895 qreal roundedValue = newValue;
759 qreal roundedValue = newValue;
896 if (qFuzzyIsNull(min) && qFuzzyIsNull(newValue))
760 if (qFuzzyIsNull(min) && qFuzzyIsNull(newValue))
897 roundedValue = 0.0;
761 roundedValue = 0.0;
898 else if (qFuzzyCompare(newValue, max))
762 else if (qFuzzyCompare(newValue, max))
899 roundedValue = max;
763 roundedValue = max;
900 else if (qFuzzyCompare(newValue, min))
764 else if (qFuzzyCompare(newValue, min))
901 roundedValue = min;
765 roundedValue = min;
902
766
903 // Check if the position is valid after removing the rounding errors
767 // Check if the position is valid after removing the rounding errors
904 if (roundedValue < min || roundedValue > max) {
768 if (roundedValue < min || roundedValue > max) {
905 qWarning("QPieSeries: Illegal value");
769 qWarning("QPieSeries: Illegal value");
906 return false;
770 return false;
907 }
771 }
908
772
909 if (!qFuzzyIsNull(value - roundedValue)) {
773 if (!qFuzzyIsNull(value - roundedValue)) {
910 value = roundedValue;
774 value = roundedValue;
911 return true;
775 return true;
912 }
776 }
913
777
914 // The change was so small it is considered a rounding error
778 // The change was so small it is considered a rounding error
915 return false;
779 return false;
916 }
780 }
917
781
918 void QPieSeriesPrivate::scaleDomain(Domain& domain)
782 void QPieSeriesPrivate::scaleDomain(Domain& domain)
919 {
783 {
920 Q_UNUSED(domain);
784 Q_UNUSED(domain);
921 // does not apply to pie
785 // does not apply to pie
922 }
786 }
923
787
924 Chart* QPieSeriesPrivate::createGraphics(ChartPresenter* presenter)
788 Chart* QPieSeriesPrivate::createGraphics(ChartPresenter* presenter)
925 {
789 {
926 Q_Q(QPieSeries);
790 Q_Q(QPieSeries);
927 PieChartItem* pie = new PieChartItem(q,presenter);
791 PieChartItem* pie = new PieChartItem(q,presenter);
928 if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) {
792 if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) {
929 presenter->animator()->addAnimation(pie);
793 presenter->animator()->addAnimation(pie);
930 }
794 }
931 presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q));
795 presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q));
932 return pie;
796 return pie;
933 }
797 }
934
798
935 QList<LegendMarker*> QPieSeriesPrivate::createLegendMarker(QLegend* legend)
799 QList<LegendMarker*> QPieSeriesPrivate::createLegendMarker(QLegend* legend)
936 {
800 {
937 Q_Q(QPieSeries);
801 Q_Q(QPieSeries);
938 QList<LegendMarker*> markers;
802 QList<LegendMarker*> markers;
939 foreach(QPieSlice* slice, q->slices()) {
803 foreach(QPieSlice* slice, q->slices()) {
940 PieLegendMarker* marker = new PieLegendMarker(q,slice,legend);
804 PieLegendMarker* marker = new PieLegendMarker(q,slice,legend);
941 markers << marker;
805 markers << marker;
942 }
806 }
943 return markers;
807 return markers;
944 }
808 }
945
809
946 #include "moc_qpieseries.cpp"
810 #include "moc_qpieseries.cpp"
947 #include "moc_qpieseries_p.cpp"
811 #include "moc_qpieseries_p.cpp"
948
812
949 QTCOMMERCIALCHART_END_NAMESPACE
813 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,92 +1,92
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 #ifndef PIESERIES_H
21 #ifndef PIESERIES_H
22 #define PIESERIES_H
22 #define PIESERIES_H
23
23
24 #include <qabstractseries.h>
24 #include <qabstractseries.h>
25
25
26 QTCOMMERCIALCHART_BEGIN_NAMESPACE
26 QTCOMMERCIALCHART_BEGIN_NAMESPACE
27 class QPieSeriesPrivate;
27 class QPieSeriesPrivate;
28 class QPieSlice;
28 class QPieSlice;
29 class QPieModelMapper;
29 class QPieModelMapper;
30
30
31 class QTCOMMERCIALCHART_EXPORT QPieSeries : public QAbstractSeries
31 class QTCOMMERCIALCHART_EXPORT QPieSeries : public QAbstractSeries
32 {
32 {
33 Q_OBJECT
33 Q_OBJECT
34 Q_PROPERTY(qreal horizontalPosition READ horizontalPosition WRITE setHorizontalPosition)
34 Q_PROPERTY(qreal horizontalPosition READ horizontalPosition WRITE setHorizontalPosition)
35 Q_PROPERTY(qreal verticalPosition READ verticalPosition WRITE setVerticalPosition)
35 Q_PROPERTY(qreal verticalPosition READ verticalPosition WRITE setVerticalPosition)
36 Q_PROPERTY(qreal size READ pieSize WRITE setPieSize)
36 Q_PROPERTY(qreal size READ pieSize WRITE setPieSize)
37 Q_PROPERTY(qreal startAngle READ pieStartAngle WRITE setPieStartAngle)
37 Q_PROPERTY(qreal startAngle READ pieStartAngle WRITE setPieStartAngle)
38 Q_PROPERTY(qreal endAngle READ pieEndAngle WRITE setPieEndAngle)
38 Q_PROPERTY(qreal endAngle READ pieEndAngle WRITE setPieEndAngle)
39 Q_PROPERTY(int count READ count)
39 Q_PROPERTY(int count READ count)
40 Q_PROPERTY(QPieModelMapper *modelMapper READ modelMapper)
40 Q_PROPERTY(QPieModelMapper *modelMapper READ modelMapper)
41
41
42 public:
42 public:
43 explicit QPieSeries(QObject *parent = 0);
43 explicit QPieSeries(QObject *parent = 0);
44 virtual ~QPieSeries();
44 virtual ~QPieSeries();
45
45
46 QAbstractSeries::SeriesType type() const;
46 QAbstractSeries::SeriesType type() const;
47
47
48 bool append(QPieSlice* slice);
48 bool append(QPieSlice* slice);
49 bool append(QList<QPieSlice*> slices);
49 bool append(QList<QPieSlice*> slices);
50 QPieSeries& operator << (QPieSlice* slice);
50 QPieSeries& operator << (QPieSlice* slice);
51 QPieSlice* append(qreal value, QString name);
51 QPieSlice* append(qreal value, QString name);
52 bool insert(int index, QPieSlice* slice);
52 bool insert(int index, QPieSlice* slice);
53 bool remove(QPieSlice* slice);
53 bool remove(QPieSlice* slice);
54 void clear();
54 void clear();
55
55
56 QList<QPieSlice*> slices() const;
56 QList<QPieSlice*> slices() const;
57 int count() const;
57 int count() const;
58 bool isEmpty() const;
58 bool isEmpty() const;
59
59
60 qreal sum() const;
60 qreal sum() const;
61
61
62 void setHorizontalPosition(qreal relativePosition);
62 void setHorizontalPosition(qreal relativePosition);
63 qreal horizontalPosition() const;
63 qreal horizontalPosition() const;
64 void setVerticalPosition(qreal relativePosition);
64 void setVerticalPosition(qreal relativePosition);
65 qreal verticalPosition() const;
65 qreal verticalPosition() const;
66
66
67 void setPieSize(qreal relativeSize);
67 void setPieSize(qreal relativeSize);
68 qreal pieSize() const;
68 qreal pieSize() const;
69
69
70 void setPieStartAngle(qreal startAngle);
70 void setPieStartAngle(qreal startAngle);
71 qreal pieStartAngle() const;
71 qreal pieStartAngle() const;
72 void setPieEndAngle(qreal endAngle);
72 void setPieEndAngle(qreal endAngle);
73 qreal pieEndAngle() const;
73 qreal pieEndAngle() const;
74
74
75 void setLabelsVisible(bool visible = true);
75 void setLabelsVisible(bool visible = true);
76
76
77 void setModel(QAbstractItemModel* model);
77 void setModel(QAbstractItemModel* model);
78 // void setModelMapper(QPieModelMapper *mapper);
78 void setModelMapper(QPieModelMapper *mapper);
79 QPieModelMapper* modelMapper() const;
79 QPieModelMapper* modelMapper() const;
80
80
81 Q_SIGNALS:
81 Q_SIGNALS:
82 void clicked(QPieSlice* slice);
82 void clicked(QPieSlice* slice);
83 void hovered(QPieSlice* slice, bool state);
83 void hovered(QPieSlice* slice, bool state);
84
84
85 private:
85 private:
86 Q_DECLARE_PRIVATE(QPieSeries)
86 Q_DECLARE_PRIVATE(QPieSeries)
87 Q_DISABLE_COPY(QPieSeries)
87 Q_DISABLE_COPY(QPieSeries)
88 };
88 };
89
89
90 QTCOMMERCIALCHART_END_NAMESPACE
90 QTCOMMERCIALCHART_END_NAMESPACE
91
91
92 #endif // PIESERIES_H
92 #endif // PIESERIES_H
@@ -1,479 +1,484
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
33
34 class tst_qpieseries : public QObject
34 class tst_qpieseries : public QObject
35 {
35 {
36 Q_OBJECT
36 Q_OBJECT
37
37
38 public slots:
38 public slots:
39 void initTestCase();
39 void initTestCase();
40 void cleanupTestCase();
40 void cleanupTestCase();
41 void init();
41 void init();
42 void cleanup();
42 void cleanup();
43
43
44 private slots:
44 private slots:
45 void construction();
45 void construction();
46 void append();
46 void append();
47 void insert();
47 void insert();
48 void remove();
48 void remove();
49 void calculatedValues();
49 void calculatedValues();
50 void clickedSignal();
50 void clickedSignal();
51 void hoverSignal();
51 void hoverSignal();
52 void model();
52 void model();
53 void modelCustomMap();
53 void modelCustomMap();
54 void modelUpdate();
54 void modelUpdate();
55
55
56 private:
56 private:
57 void verifyCalculatedData(const QPieSeries &series, bool *ok);
57 void verifyCalculatedData(const QPieSeries &series, bool *ok);
58
58
59 private:
59 private:
60
60
61 };
61 };
62
62
63 void tst_qpieseries::initTestCase()
63 void tst_qpieseries::initTestCase()
64 {
64 {
65 qRegisterMetaType<QPieSlice*>("QPieSlice*");
65 qRegisterMetaType<QPieSlice*>("QPieSlice*");
66 }
66 }
67
67
68 void tst_qpieseries::cleanupTestCase()
68 void tst_qpieseries::cleanupTestCase()
69 {
69 {
70 }
70 }
71
71
72 void tst_qpieseries::init()
72 void tst_qpieseries::init()
73 {
73 {
74
74
75 }
75 }
76
76
77 void tst_qpieseries::cleanup()
77 void tst_qpieseries::cleanup()
78 {
78 {
79
79
80 }
80 }
81
81
82 void tst_qpieseries::construction()
82 void tst_qpieseries::construction()
83 {
83 {
84 // verify default values
84 // verify default values
85 QPieSeries s;
85 QPieSeries s;
86 QVERIFY(s.type() == QAbstractSeries::SeriesTypePie);
86 QVERIFY(s.type() == QAbstractSeries::SeriesTypePie);
87 QVERIFY(s.count() == 0);
87 QVERIFY(s.count() == 0);
88 QVERIFY(s.isEmpty());
88 QVERIFY(s.isEmpty());
89 QCOMPARE(s.sum(), 0.0);
89 QCOMPARE(s.sum(), 0.0);
90 QCOMPARE(s.horizontalPosition(), 0.5);
90 QCOMPARE(s.horizontalPosition(), 0.5);
91 QCOMPARE(s.verticalPosition(), 0.5);
91 QCOMPARE(s.verticalPosition(), 0.5);
92 QCOMPARE(s.pieSize(), 0.7);
92 QCOMPARE(s.pieSize(), 0.7);
93 QCOMPARE(s.pieStartAngle(), 0.0);
93 QCOMPARE(s.pieStartAngle(), 0.0);
94 QCOMPARE(s.pieEndAngle(), 360.0);
94 QCOMPARE(s.pieEndAngle(), 360.0);
95 }
95 }
96
96
97 void tst_qpieseries::append()
97 void tst_qpieseries::append()
98 {
98 {
99 QPieSeries s;
99 QPieSeries s;
100
100
101 // append pointer
101 // append pointer
102 QPieSlice *slice1 = 0;
102 QPieSlice *slice1 = 0;
103 QVERIFY(!s.append(slice1));
103 QVERIFY(!s.append(slice1));
104 slice1 = new QPieSlice(1, "slice 1");
104 slice1 = new QPieSlice(1, "slice 1");
105 QVERIFY(s.append(slice1));
105 QVERIFY(s.append(slice1));
106 QVERIFY(!s.append(slice1));
106 QVERIFY(!s.append(slice1));
107 QCOMPARE(s.count(), 1);
107 QCOMPARE(s.count(), 1);
108
108
109 // append pointer list
109 // append pointer list
110 QList<QPieSlice *> list;
110 QList<QPieSlice *> list;
111 QVERIFY(!s.append(list));
111 QVERIFY(!s.append(list));
112 list << (QPieSlice *) 0;
112 list << (QPieSlice *) 0;
113 QVERIFY(!s.append(list));
113 QVERIFY(!s.append(list));
114 list.clear();
114 list.clear();
115 list << new QPieSlice(2, "slice 2");
115 list << new QPieSlice(2, "slice 2");
116 list << new QPieSlice(3, "slice 3");
116 list << new QPieSlice(3, "slice 3");
117 QVERIFY(s.append(list));
117 QVERIFY(s.append(list));
118 QVERIFY(!s.append(list));
118 QVERIFY(!s.append(list));
119 QCOMPARE(s.count(), 3);
119 QCOMPARE(s.count(), 3);
120
120
121 // append operator
121 // append operator
122 s << new QPieSlice(4, "slice 4");
122 s << new QPieSlice(4, "slice 4");
123 s << slice1; // fails because already added
123 s << slice1; // fails because already added
124 QCOMPARE(s.count(), 4);
124 QCOMPARE(s.count(), 4);
125
125
126 // append with params
126 // append with params
127 QPieSlice *slice5 = s.append(5, "slice 5");
127 QPieSlice *slice5 = s.append(5, "slice 5");
128 QVERIFY(slice5 != 0);
128 QVERIFY(slice5 != 0);
129 QCOMPARE(slice5->value(), 5.0);
129 QCOMPARE(slice5->value(), 5.0);
130 QCOMPARE(slice5->label(), QString("slice 5"));
130 QCOMPARE(slice5->label(), QString("slice 5"));
131 QCOMPARE(s.count(), 5);
131 QCOMPARE(s.count(), 5);
132
132
133 // check slices
133 // check slices
134 QVERIFY(!s.isEmpty());
134 QVERIFY(!s.isEmpty());
135 for (int i=0; i<s.count(); i++) {
135 for (int i=0; i<s.count(); i++) {
136 QCOMPARE(s.slices().at(i)->value(), (qreal) i+1);
136 QCOMPARE(s.slices().at(i)->value(), (qreal) i+1);
137 QCOMPARE(s.slices().at(i)->label(), QString("slice ") + QString::number(i+1));
137 QCOMPARE(s.slices().at(i)->label(), QString("slice ") + QString::number(i+1));
138 }
138 }
139 }
139 }
140
140
141 void tst_qpieseries::insert()
141 void tst_qpieseries::insert()
142 {
142 {
143 QPieSeries s;
143 QPieSeries s;
144
144
145 // insert one slice
145 // insert one slice
146 QPieSlice *slice1 = 0;
146 QPieSlice *slice1 = 0;
147 QVERIFY(!s.insert(0, slice1));
147 QVERIFY(!s.insert(0, slice1));
148 slice1 = new QPieSlice(1, "slice 1");
148 slice1 = new QPieSlice(1, "slice 1");
149 QVERIFY(!s.insert(-1, slice1));
149 QVERIFY(!s.insert(-1, slice1));
150 QVERIFY(!s.insert(5, slice1));
150 QVERIFY(!s.insert(5, slice1));
151 QVERIFY(s.insert(0, slice1));
151 QVERIFY(s.insert(0, slice1));
152 QVERIFY(!s.insert(0, slice1));
152 QVERIFY(!s.insert(0, slice1));
153 QCOMPARE(s.count(), 1);
153 QCOMPARE(s.count(), 1);
154
154
155 // add some more slices
155 // add some more slices
156 s.append(2, "slice 2");
156 s.append(2, "slice 2");
157 s.append(4, "slice 4");
157 s.append(4, "slice 4");
158 QCOMPARE(s.count(), 3);
158 QCOMPARE(s.count(), 3);
159
159
160 // insert between slices
160 // insert between slices
161 s.insert(2, new QPieSlice(3, "slice 3"));
161 s.insert(2, new QPieSlice(3, "slice 3"));
162 QCOMPARE(s.count(), 4);
162 QCOMPARE(s.count(), 4);
163
163
164 // check slices
164 // check slices
165 for (int i=0; i<s.count(); i++) {
165 for (int i=0; i<s.count(); i++) {
166 QCOMPARE(s.slices().at(i)->value(), (qreal) i+1);
166 QCOMPARE(s.slices().at(i)->value(), (qreal) i+1);
167 QCOMPARE(s.slices().at(i)->label(), QString("slice ") + QString::number(i+1));
167 QCOMPARE(s.slices().at(i)->label(), QString("slice ") + QString::number(i+1));
168 }
168 }
169 }
169 }
170
170
171 void tst_qpieseries::remove()
171 void tst_qpieseries::remove()
172 {
172 {
173 QPieSeries s;
173 QPieSeries s;
174
174
175 // add some slices
175 // add some slices
176 QPieSlice *slice1 = s.append(1, "slice 1");
176 QPieSlice *slice1 = s.append(1, "slice 1");
177 QPieSlice *slice2 = s.append(2, "slice 2");
177 QPieSlice *slice2 = s.append(2, "slice 2");
178 QPieSlice *slice3 = s.append(3, "slice 3");
178 QPieSlice *slice3 = s.append(3, "slice 3");
179 QSignalSpy spy1(slice1, SIGNAL(destroyed()));
179 QSignalSpy spy1(slice1, SIGNAL(destroyed()));
180 QSignalSpy spy2(slice2, SIGNAL(destroyed()));
180 QSignalSpy spy2(slice2, SIGNAL(destroyed()));
181 QSignalSpy spy3(slice3, SIGNAL(destroyed()));
181 QSignalSpy spy3(slice3, SIGNAL(destroyed()));
182 QCOMPARE(s.count(), 3);
182 QCOMPARE(s.count(), 3);
183
183
184 // null pointer remove
184 // null pointer remove
185 QVERIFY(!s.remove(0));
185 QVERIFY(!s.remove(0));
186
186
187 // remove first
187 // remove first
188 QVERIFY(s.remove(slice1));
188 QVERIFY(s.remove(slice1));
189 QVERIFY(!s.remove(slice1));
189 QVERIFY(!s.remove(slice1));
190 QCOMPARE(s.count(), 2);
190 QCOMPARE(s.count(), 2);
191 QCOMPARE(s.slices().at(0)->label(), slice2->label());
191 QCOMPARE(s.slices().at(0)->label(), slice2->label());
192
192
193 // remove all
193 // remove all
194 s.clear();
194 s.clear();
195 QVERIFY(s.isEmpty());
195 QVERIFY(s.isEmpty());
196 QVERIFY(s.slices().isEmpty());
196 QVERIFY(s.slices().isEmpty());
197 QCOMPARE(s.count(), 0);
197 QCOMPARE(s.count(), 0);
198
198
199 // check that slices were actually destroyed
199 // check that slices were actually destroyed
200 TRY_COMPARE(spy1.count(), 1);
200 TRY_COMPARE(spy1.count(), 1);
201 TRY_COMPARE(spy2.count(), 1);
201 TRY_COMPARE(spy2.count(), 1);
202 TRY_COMPARE(spy3.count(), 1);
202 TRY_COMPARE(spy3.count(), 1);
203 }
203 }
204
204
205 void tst_qpieseries::calculatedValues()
205 void tst_qpieseries::calculatedValues()
206 {
206 {
207 bool ok;
207 bool ok;
208 QPieSeries s;
208 QPieSeries s;
209
209
210 // add a slice
210 // add a slice
211 QPieSlice *slice1 = s.append(1, "slice 1");
211 QPieSlice *slice1 = s.append(1, "slice 1");
212 verifyCalculatedData(s, &ok);
212 verifyCalculatedData(s, &ok);
213 if (!ok)
213 if (!ok)
214 return;
214 return;
215
215
216 // add some more slices
216 // add some more slices
217 QList<QPieSlice *> list;
217 QList<QPieSlice *> list;
218 list << new QPieSlice(2, "slice 2");
218 list << new QPieSlice(2, "slice 2");
219 list << new QPieSlice(3, "slice 3");
219 list << new QPieSlice(3, "slice 3");
220 s.append(list);
220 s.append(list);
221 verifyCalculatedData(s, &ok);
221 verifyCalculatedData(s, &ok);
222 if (!ok)
222 if (!ok)
223 return;
223 return;
224
224
225 // remove a slice
225 // remove a slice
226 s.remove(slice1);
226 s.remove(slice1);
227 verifyCalculatedData(s, &ok);
227 verifyCalculatedData(s, &ok);
228 if (!ok)
228 if (!ok)
229 return;
229 return;
230
230
231 // insert a slice
231 // insert a slice
232 s.insert(0, new QPieSlice(1, "Slice 4"));
232 s.insert(0, new QPieSlice(1, "Slice 4"));
233 verifyCalculatedData(s, &ok);
233 verifyCalculatedData(s, &ok);
234 if (!ok)
234 if (!ok)
235 return;
235 return;
236
236
237 // clear all
237 // clear all
238 s.clear();
238 s.clear();
239 verifyCalculatedData(s, &ok);
239 verifyCalculatedData(s, &ok);
240 }
240 }
241
241
242 void tst_qpieseries::verifyCalculatedData(const QPieSeries &series, bool *ok)
242 void tst_qpieseries::verifyCalculatedData(const QPieSeries &series, bool *ok)
243 {
243 {
244 *ok = false;
244 *ok = false;
245
245
246 qreal sum = 0;
246 qreal sum = 0;
247 foreach (const QPieSlice *slice, series.slices())
247 foreach (const QPieSlice *slice, series.slices())
248 sum += slice->value();
248 sum += slice->value();
249 QCOMPARE(series.sum(), sum);
249 QCOMPARE(series.sum(), sum);
250
250
251 qreal startAngle = series.pieStartAngle();
251 qreal startAngle = series.pieStartAngle();
252 qreal pieAngleSpan = series.pieEndAngle() - series.pieStartAngle();
252 qreal pieAngleSpan = series.pieEndAngle() - series.pieStartAngle();
253 foreach (const QPieSlice *slice, series.slices()) {
253 foreach (const QPieSlice *slice, series.slices()) {
254 qreal ratio = slice->value() / sum;
254 qreal ratio = slice->value() / sum;
255 qreal sliceSpan = pieAngleSpan * ratio;
255 qreal sliceSpan = pieAngleSpan * ratio;
256 QCOMPARE(slice->startAngle(), startAngle);
256 QCOMPARE(slice->startAngle(), startAngle);
257 QCOMPARE(slice->endAngle(), startAngle + sliceSpan);
257 QCOMPARE(slice->endAngle(), startAngle + sliceSpan);
258 QCOMPARE(slice->percentage(), ratio);
258 QCOMPARE(slice->percentage(), ratio);
259 startAngle += sliceSpan;
259 startAngle += sliceSpan;
260 }
260 }
261
261
262 if (!series.isEmpty())
262 if (!series.isEmpty())
263 QCOMPARE(series.slices().last()->endAngle(), series.pieEndAngle());
263 QCOMPARE(series.slices().last()->endAngle(), series.pieEndAngle());
264
264
265 *ok = true;
265 *ok = true;
266 }
266 }
267
267
268
268
269 void tst_qpieseries::clickedSignal()
269 void tst_qpieseries::clickedSignal()
270 {
270 {
271 // create a pie series
271 // create a pie series
272 QPieSeries *series = new QPieSeries();
272 QPieSeries *series = new QPieSeries();
273 series->setPieSize(1.0);
273 series->setPieSize(1.0);
274 QPieSlice *s1 = series->append(1, "slice 1");
274 QPieSlice *s1 = series->append(1, "slice 1");
275 series->append(2, "slice 2");
275 series->append(2, "slice 2");
276 series->append(3, "slice 3");
276 series->append(3, "slice 3");
277 QSignalSpy clickSpy1(series, SIGNAL(clicked(QPieSlice*)));
277 QSignalSpy clickSpy1(series, SIGNAL(clicked(QPieSlice*)));
278
278
279 // add series to the chart
279 // add series to the chart
280 QChartView view(new QChart());
280 QChartView view(new QChart());
281 view.chart()->legend()->setVisible(false);
281 view.chart()->legend()->setVisible(false);
282 view.resize(200, 200);
282 view.resize(200, 200);
283 view.chart()->addSeries(series);
283 view.chart()->addSeries(series);
284 view.show();
284 view.show();
285 QTest::qWaitForWindowShown(&view);
285 QTest::qWaitForWindowShown(&view);
286
286
287 // simulate clicks
287 // simulate clicks
288 // pie rectangle: QRectF(60,60 121x121)
288 // pie rectangle: QRectF(60,60 121x121)
289 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, QPoint(146, 90)); // inside slice 1
289 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, QPoint(146, 90)); // inside slice 1
290 TRY_COMPARE(clickSpy1.count(), 1);
290 TRY_COMPARE(clickSpy1.count(), 1);
291 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy1.at(0).at(0)), s1);
291 QCOMPARE(qvariant_cast<QPieSlice*>(clickSpy1.at(0).at(0)), s1);
292 }
292 }
293
293
294 void tst_qpieseries::hoverSignal()
294 void tst_qpieseries::hoverSignal()
295 {
295 {
296 // create a pie series
296 // create a pie series
297 QPieSeries *series = new QPieSeries();
297 QPieSeries *series = new QPieSeries();
298 series->setPieSize(1.0);
298 series->setPieSize(1.0);
299 QPieSlice *s1 = series->append(1, "slice 1");
299 QPieSlice *s1 = series->append(1, "slice 1");
300 series->append(2, "slice 2");
300 series->append(2, "slice 2");
301 series->append(3, "slice 3");
301 series->append(3, "slice 3");
302
302
303 // add series to the chart
303 // add series to the chart
304 QChartView view(new QChart());
304 QChartView view(new QChart());
305 view.chart()->legend()->setVisible(false);
305 view.chart()->legend()->setVisible(false);
306 view.resize(200, 200);
306 view.resize(200, 200);
307 view.chart()->addSeries(series);
307 view.chart()->addSeries(series);
308 view.show();
308 view.show();
309 QTest::qWaitForWindowShown(&view);
309 QTest::qWaitForWindowShown(&view);
310
310
311 // first move to right top corner
311 // first move to right top corner
312 QTest::mouseMove(view.viewport(), QPoint(200, 0));
312 QTest::mouseMove(view.viewport(), QPoint(200, 0));
313 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
313 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
314
314
315 // move inside the slice
315 // move inside the slice
316 // pie rectangle: QRectF(60,60 121x121)
316 // pie rectangle: QRectF(60,60 121x121)
317 QSignalSpy hoverSpy(series, SIGNAL(hovered(QPieSlice*,bool)));
317 QSignalSpy hoverSpy(series, SIGNAL(hovered(QPieSlice*,bool)));
318 QTest::mouseMove(view.viewport(), QPoint(139, 85));
318 QTest::mouseMove(view.viewport(), QPoint(139, 85));
319 TRY_COMPARE(hoverSpy.count(), 1);
319 TRY_COMPARE(hoverSpy.count(), 1);
320 QCOMPARE(qvariant_cast<QPieSlice*>(hoverSpy.at(0).at(0)), s1);
320 QCOMPARE(qvariant_cast<QPieSlice*>(hoverSpy.at(0).at(0)), s1);
321 QCOMPARE(qvariant_cast<bool>(hoverSpy.at(0).at(1)), true);
321 QCOMPARE(qvariant_cast<bool>(hoverSpy.at(0).at(1)), true);
322
322
323 // move outside the slice
323 // move outside the slice
324 QTest::mouseMove(view.viewport(), QPoint(200, 0));
324 QTest::mouseMove(view.viewport(), QPoint(200, 0));
325 TRY_COMPARE(hoverSpy.count(), 2);
325 TRY_COMPARE(hoverSpy.count(), 2);
326 QCOMPARE(qvariant_cast<QPieSlice*>(hoverSpy.at(1).at(0)), s1);
326 QCOMPARE(qvariant_cast<QPieSlice*>(hoverSpy.at(1).at(0)), s1);
327 QCOMPARE(qvariant_cast<bool>(hoverSpy.at(1).at(1)), false);
327 QCOMPARE(qvariant_cast<bool>(hoverSpy.at(1).at(1)), false);
328 }
328 }
329
329
330 void tst_qpieseries::model()
330 void tst_qpieseries::model()
331 {
331 {
332 QSKIP("Needs to be checked again. Model implementation changed", SkipAll);
333
332 QPieSeries *series = new QPieSeries;
334 QPieSeries *series = new QPieSeries;
333 QChart *chart = new QChart;
335 QChart *chart = new QChart;
334 chart->addSeries(series);
336 chart->addSeries(series);
335 QChartView *chartView = new QChartView(chart);
337 QChartView *chartView = new QChartView(chart);
336 chartView->show();
338 chartView->show();
337
339
338 QStandardItemModel *stdModel = new QStandardItemModel(0, 2);
340 QStandardItemModel *stdModel = new QStandardItemModel(0, 2);
339 series->setModel(stdModel);
341 series->setModel(stdModel);
340 QVERIFY2((series->model()) == stdModel, "Model should be stdModel");
341
342
342 int rowCount = 3;
343 int rowCount = 3;
343 for (int row = 0; row < rowCount; ++row) {
344 for (int row = 0; row < rowCount; ++row) {
344 for (int column = 0; column < 2; column++) {
345 for (int column = 0; column < 2; column++) {
345 QStandardItem *item = new QStandardItem(row * column);
346 QStandardItem *item = new QStandardItem(row * column);
346 stdModel->setItem(row, column, item);
347 stdModel->setItem(row, column, item);
347 }
348 }
348 }
349 }
349
350
350 // data has been added to the model, but mapper is not set the number of slices should still be 0
351 // data has been added to the model, but mapper is not set the number of slices should still be 0
351 QVERIFY2(series->slices().count() == 0, "Mapper has not been set, so the number of slices should be 0");
352 QVERIFY2(series->slices().count() == 0, "Mapper has not been set, so the number of slices should be 0");
352
353
353 // set the mapper
354 // set the mapper
354 QPieModelMapper *mapper = series->modelMapper();//new QPieModelMapper;
355 QPieModelMapper *mapper = series->modelMapper();//new QPieModelMapper;
355 mapper->setMapValues(0);
356 mapper->setMapValues(0);
356 mapper->setMapLabels(0);
357 mapper->setMapLabels(0);
357 // series->setModelMapper(mapper); // this should cause the Pie to get initialized from the model, since there is now both the model and the mapper defined
358 // series->setModelMapper(mapper); // this should cause the Pie to get initialized from the model, since there is now both the model and the mapper defined
358 QCOMPARE(series->slices().count(), rowCount);
359 QCOMPARE(series->slices().count(), rowCount);
359
360
360 // set the mappings to be outside of the model
361 // set the mappings to be outside of the model
361 mapper->setMapLabels(5);
362 mapper->setMapLabels(5);
362 mapper->setMapValues(4);
363 mapper->setMapValues(4);
363 QCOMPARE(series->slices().count(), 0); // Mappings are invalid, so the number of slices should be 0
364 QCOMPARE(series->slices().count(), 0); // Mappings are invalid, so the number of slices should be 0
364
365
365 // set back to correct ones
366 // set back to correct ones
366 mapper->setMapValues(0);
367 mapper->setMapValues(0);
367 mapper->setMapLabels(0);
368 mapper->setMapLabels(0);
368 QCOMPARE(series->slices().count(), rowCount);
369 QCOMPARE(series->slices().count(), rowCount);
369
370
370 // reset the mappings
371 // reset the mappings
371 mapper->reset();
372 mapper->reset();
372 QCOMPARE(series->slices().count(), 0); // Mappings have been reset and are invalid, so the number of slices should be 0
373 QCOMPARE(series->slices().count(), 0); // Mappings have been reset and are invalid, so the number of slices should be 0
373
374
374 // unset the model and the mapper
375 // unset the model and the mapper
375 series->setModel(0);
376 series->setModel(0);
376 // series->setModelMapper(0);
377 // series->setModelMapper(0);
377 QVERIFY(series->model() == 0); // Model should be unset
378 QVERIFY(series->model() == 0); // Model should be unset
378 // QVERIFY(series->modelMapper() == 0); // Model mapper should be unset
379 // QVERIFY(series->modelMapper() == 0); // Model mapper should be unset
379 }
380 }
380
381
381 void tst_qpieseries::modelCustomMap()
382 void tst_qpieseries::modelCustomMap()
382 {
383 {
384 QSKIP("Needs to be checked again. Model implementation changed", SkipAll);
385
383 int rowCount = 12;
386 int rowCount = 12;
384 int columnCount = 3;
387 int columnCount = 3;
385 QStandardItemModel *stdModel = new QStandardItemModel(0, 3);
388 QStandardItemModel *stdModel = new QStandardItemModel(0, 3);
386 for (int row = 0; row < rowCount; ++row) {
389 for (int row = 0; row < rowCount; ++row) {
387 for (int column = 0; column < 2; column++) {
390 for (int column = 0; column < 2; column++) {
388 QStandardItem *item = new QStandardItem(row * column);
391 QStandardItem *item = new QStandardItem(row * column);
389 stdModel->setItem(row, column, item);
392 stdModel->setItem(row, column, item);
390 }
393 }
391 }
394 }
392
395
393 QPieSeries *series = new QPieSeries;
396 QPieSeries *series = new QPieSeries;
394 QChart *chart = new QChart;
397 QChart *chart = new QChart;
395 chart->addSeries(series);
398 chart->addSeries(series);
396 QChartView *chartView = new QChartView(chart);
399 QChartView *chartView = new QChartView(chart);
397 chartView->show();
400 chartView->show();
398 series->setModel(stdModel);
401 series->setModel(stdModel);
399
402
400 QPieModelMapper *mapper = series->modelMapper();//new QPieModelMapper;
403 QPieModelMapper *mapper = series->modelMapper();//new QPieModelMapper;
401 mapper->setMapValues(0);
404 mapper->setMapValues(0);
402 mapper->setMapLabels(0);
405 mapper->setMapLabels(0);
403 // series->setModelMapper(mapper);
406 // series->setModelMapper(mapper);
404 QCOMPARE(series->slices().count(), rowCount);
407 QCOMPARE(series->slices().count(), rowCount);
405
408
406 // lets change the orientation to horizontal
409 // lets change the orientation to horizontal
407 mapper->setOrientation(Qt::Horizontal);
410 mapper->setOrientation(Qt::Horizontal);
408 QCOMPARE(series->slices().count(), columnCount);
411 QCOMPARE(series->slices().count(), columnCount);
409
412
410 // change it back to vertical
413 // change it back to vertical
411 mapper->setOrientation(Qt::Vertical);
414 mapper->setOrientation(Qt::Vertical);
412 QCOMPARE(series->slices().count(), rowCount);
415 QCOMPARE(series->slices().count(), rowCount);
413
416
414 // lets customize the mapping
417 // lets customize the mapping
415 int first = 3;
418 int first = 3;
416 mapper->setFirst(first);
419 mapper->setFirst(first);
417 QCOMPARE(series->slices().count(), rowCount - first);
420 QCOMPARE(series->slices().count(), rowCount - first);
418 int count = 7;
421 int count = 7;
419 mapper->setCount(count);
422 mapper->setCount(count);
420 QCOMPARE(series->slices().count(), count);
423 QCOMPARE(series->slices().count(), count);
421 first = 9;
424 first = 9;
422 mapper->setFirst(first);
425 mapper->setFirst(first);
423 QCOMPARE(series->slices().count(), qMin(count, rowCount - first));
426 QCOMPARE(series->slices().count(), qMin(count, rowCount - first));
424 }
427 }
425
428
426 void tst_qpieseries::modelUpdate()
429 void tst_qpieseries::modelUpdate()
427 {
430 {
431 QSKIP("Needs to be checked again. Model implementation changed", SkipAll);
432
428 int rowCount = 12;
433 int rowCount = 12;
429 int columnCount = 7;
434 int columnCount = 7;
430 QStandardItemModel *stdModel = new QStandardItemModel(rowCount, columnCount);
435 QStandardItemModel *stdModel = new QStandardItemModel(rowCount, columnCount);
431 for (int row = 0; row < rowCount; ++row) {
436 for (int row = 0; row < rowCount; ++row) {
432 for (int column = 0; column < columnCount; column++) {
437 for (int column = 0; column < columnCount; column++) {
433 QStandardItem *item = new QStandardItem(row * column);
438 QStandardItem *item = new QStandardItem(row * column);
434 stdModel->setItem(row, column, item);
439 stdModel->setItem(row, column, item);
435 }
440 }
436 }
441 }
437
442
438 QPieSeries *series = new QPieSeries;
443 QPieSeries *series = new QPieSeries;
439 QChart *chart = new QChart;
444 QChart *chart = new QChart;
440 chart->addSeries(series);
445 chart->addSeries(series);
441 QChartView *chartView = new QChartView(chart);
446 QChartView *chartView = new QChartView(chart);
442 chartView->show();
447 chartView->show();
443 series->setModel(stdModel);
448 series->setModel(stdModel);
444
449
445 QPieModelMapper *mapper = series->modelMapper();//new QPieModelMapper;
450 QPieModelMapper *mapper = series->modelMapper();//new QPieModelMapper;
446 mapper->setMapValues(0);
451 mapper->setMapValues(0);
447 mapper->setMapLabels(0);
452 mapper->setMapLabels(0);
448 // series->setModelMapper(mapper);
453 // series->setModelMapper(mapper);
449
454
450 stdModel->insertRows(3, 5);
455 stdModel->insertRows(3, 5);
451 QCOMPARE(series->slices().count(), rowCount + 5);
456 QCOMPARE(series->slices().count(), rowCount + 5);
452
457
453 stdModel->removeRows(10, 5);
458 stdModel->removeRows(10, 5);
454 QCOMPARE(series->slices().count(), rowCount);
459 QCOMPARE(series->slices().count(), rowCount);
455
460
456 // limit the number of slices taken from the model to 12
461 // limit the number of slices taken from the model to 12
457 mapper->setCount(rowCount);
462 mapper->setCount(rowCount);
458 stdModel->insertRows(3, 5);
463 stdModel->insertRows(3, 5);
459 QCOMPARE(series->slices().count(), rowCount);
464 QCOMPARE(series->slices().count(), rowCount);
460
465
461 stdModel->removeRows(0, 10);
466 stdModel->removeRows(0, 10);
462 QCOMPARE(series->slices().count(), rowCount - 5);
467 QCOMPARE(series->slices().count(), rowCount - 5);
463
468
464 // change the orientation to horizontal
469 // change the orientation to horizontal
465 mapper->setOrientation(Qt::Horizontal);
470 mapper->setOrientation(Qt::Horizontal);
466 QCOMPARE(series->slices().count(), columnCount);
471 QCOMPARE(series->slices().count(), columnCount);
467
472
468 stdModel->insertColumns(3, 10);
473 stdModel->insertColumns(3, 10);
469 QCOMPARE(series->slices().count(), rowCount); // count is limited to rowCount (12)
474 QCOMPARE(series->slices().count(), rowCount); // count is limited to rowCount (12)
470
475
471 stdModel->removeColumns(5, 10);
476 stdModel->removeColumns(5, 10);
472 QCOMPARE(series->slices().count(), columnCount);
477 QCOMPARE(series->slices().count(), columnCount);
473
478
474 }
479 }
475
480
476 QTEST_MAIN(tst_qpieseries)
481 QTEST_MAIN(tst_qpieseries)
477
482
478 #include "tst_qpieseries.moc"
483 #include "tst_qpieseries.moc"
479
484
General Comments 0
You need to be logged in to leave comments. Login now