##// END OF EJS Templates
missing signal/slot parameter at QPieSeries::insert()
Jani Honkonen -
r819:c24876e34874
parent child
Show More
@@ -1,694 +1,694
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 "qpieseriesprivate_p.h"
22 #include "qpieseriesprivate_p.h"
23 #include "qpieslice.h"
23 #include "qpieslice.h"
24 #include "pieslicedata_p.h"
24 #include "pieslicedata_p.h"
25 #include <QDebug>
25 #include <QDebug>
26
26
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28
28
29 QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent)
29 QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent)
30 :QObject(parent),
30 :QObject(parent),
31 q_ptr(parent),
31 q_ptr(parent),
32 m_pieRelativeHorPos(0.5),
32 m_pieRelativeHorPos(0.5),
33 m_pieRelativeVerPos(0.5),
33 m_pieRelativeVerPos(0.5),
34 m_pieRelativeSize(0.7),
34 m_pieRelativeSize(0.7),
35 m_pieStartAngle(0),
35 m_pieStartAngle(0),
36 m_pieEndAngle(360),
36 m_pieEndAngle(360),
37 m_total(0),
37 m_total(0),
38 m_mapValues(0),
38 m_mapValues(0),
39 m_mapLabels(0),
39 m_mapLabels(0),
40 m_mapOrientation(Qt::Horizontal)
40 m_mapOrientation(Qt::Horizontal)
41 {
41 {
42
42
43 }
43 }
44
44
45 QPieSeriesPrivate::~QPieSeriesPrivate()
45 QPieSeriesPrivate::~QPieSeriesPrivate()
46 {
46 {
47
47
48 }
48 }
49
49
50 void QPieSeriesPrivate::updateDerivativeData()
50 void QPieSeriesPrivate::updateDerivativeData()
51 {
51 {
52 m_total = 0;
52 m_total = 0;
53
53
54 // nothing to do?
54 // nothing to do?
55 if (m_slices.count() == 0)
55 if (m_slices.count() == 0)
56 return;
56 return;
57
57
58 // calculate total
58 // calculate total
59 foreach (QPieSlice* s, m_slices)
59 foreach (QPieSlice* s, m_slices)
60 m_total += s->value();
60 m_total += s->value();
61
61
62 // nothing to show..
62 // nothing to show..
63 if (qFuzzyIsNull(m_total))
63 if (qFuzzyIsNull(m_total))
64 return;
64 return;
65
65
66 // update slice attributes
66 // update slice attributes
67 qreal sliceAngle = m_pieStartAngle;
67 qreal sliceAngle = m_pieStartAngle;
68 qreal pieSpan = m_pieEndAngle - m_pieStartAngle;
68 qreal pieSpan = m_pieEndAngle - m_pieStartAngle;
69 QVector<QPieSlice*> changed;
69 QVector<QPieSlice*> changed;
70 foreach (QPieSlice* s, m_slices) {
70 foreach (QPieSlice* s, m_slices) {
71
71
72 PieSliceData data = *s->data_ptr();
72 PieSliceData data = *s->data_ptr();
73 data.m_percentage = s->value() / m_total;
73 data.m_percentage = s->value() / m_total;
74 data.m_angleSpan = pieSpan * data.m_percentage;
74 data.m_angleSpan = pieSpan * data.m_percentage;
75 data.m_startAngle = sliceAngle;
75 data.m_startAngle = sliceAngle;
76 sliceAngle += data.m_angleSpan;
76 sliceAngle += data.m_angleSpan;
77
77
78 if (*s->data_ptr() != data) {
78 if (*s->data_ptr() != data) {
79 *s->data_ptr() = data;
79 *s->data_ptr() = data;
80 changed << s;
80 changed << s;
81 }
81 }
82 }
82 }
83
83
84 // emit signals
84 // emit signals
85 foreach (QPieSlice* s, changed)
85 foreach (QPieSlice* s, changed)
86 s->data_ptr()->emitChangedSignal(s);
86 s->data_ptr()->emitChangedSignal(s);
87 }
87 }
88
88
89 void QPieSeriesPrivate::sliceChanged()
89 void QPieSeriesPrivate::sliceChanged()
90 {
90 {
91 Q_ASSERT(m_slices.contains(qobject_cast<QPieSlice *>(sender())));
91 Q_ASSERT(m_slices.contains(qobject_cast<QPieSlice *>(sender())));
92 updateDerivativeData();
92 updateDerivativeData();
93 }
93 }
94
94
95 void QPieSeriesPrivate::sliceClicked(Qt::MouseButtons buttons)
95 void QPieSeriesPrivate::sliceClicked(Qt::MouseButtons buttons)
96 {
96 {
97 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
97 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
98 Q_ASSERT(m_slices.contains(slice));
98 Q_ASSERT(m_slices.contains(slice));
99 Q_Q(QPieSeries);
99 Q_Q(QPieSeries);
100 emit q->clicked(slice, buttons);
100 emit q->clicked(slice, buttons);
101 }
101 }
102
102
103 void QPieSeriesPrivate::sliceHoverEnter()
103 void QPieSeriesPrivate::sliceHoverEnter()
104 {
104 {
105 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
105 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
106 Q_ASSERT(m_slices.contains(slice));
106 Q_ASSERT(m_slices.contains(slice));
107 Q_Q(QPieSeries);
107 Q_Q(QPieSeries);
108 emit q->hoverEnter(slice);
108 emit q->hoverEnter(slice);
109 }
109 }
110
110
111 void QPieSeriesPrivate::sliceHoverLeave()
111 void QPieSeriesPrivate::sliceHoverLeave()
112 {
112 {
113 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
113 QPieSlice* slice = qobject_cast<QPieSlice *>(sender());
114 Q_ASSERT(m_slices.contains(slice));
114 Q_ASSERT(m_slices.contains(slice));
115 Q_Q(QPieSeries);
115 Q_Q(QPieSeries);
116 emit q->hoverLeave(slice);
116 emit q->hoverLeave(slice);
117 }
117 }
118
118
119 void QPieSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
119 void QPieSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight)
120 {
120 {
121 Q_UNUSED(bottomRight)
121 Q_UNUSED(bottomRight)
122 Q_Q(QPieSeries);
122 Q_Q(QPieSeries);
123
123
124 if (m_mapOrientation == Qt::Vertical)
124 if (m_mapOrientation == Qt::Vertical)
125 {
125 {
126 // slices().at(topLeft.row())->setValue(m_model->data(m_model->index(topLeft.row(), topLeft.column()), Qt::DisplayRole).toDouble());
126 // slices().at(topLeft.row())->setValue(m_model->data(m_model->index(topLeft.row(), topLeft.column()), Qt::DisplayRole).toDouble());
127 if (topLeft.column() == m_mapValues)
127 if (topLeft.column() == m_mapValues)
128 if (m_mapValues == m_mapLabels)
128 if (m_mapValues == m_mapLabels)
129 {
129 {
130 m_slices.at(topLeft.row())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
130 m_slices.at(topLeft.row())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
131 m_slices.at(topLeft.row())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
131 m_slices.at(topLeft.row())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
132 }
132 }
133 else
133 else
134 {
134 {
135 m_slices.at(topLeft.row())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
135 m_slices.at(topLeft.row())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
136 }
136 }
137 else if (topLeft.column() == m_mapLabels)
137 else if (topLeft.column() == m_mapLabels)
138 m_slices.at(topLeft.row())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
138 m_slices.at(topLeft.row())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
139 }
139 }
140 else
140 else
141 {
141 {
142 // slices().at(topLeft.column())->setValue(m_model->data(m_model->index(topLeft.row(), topLeft.column()), Qt::DisplayRole).toDouble());
142 // slices().at(topLeft.column())->setValue(m_model->data(m_model->index(topLeft.row(), topLeft.column()), Qt::DisplayRole).toDouble());
143 if (topLeft.row() == m_mapValues)
143 if (topLeft.row() == m_mapValues)
144 if (m_mapValues == m_mapLabels)
144 if (m_mapValues == m_mapLabels)
145 {
145 {
146 m_slices.at(topLeft.column())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
146 m_slices.at(topLeft.column())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
147 m_slices.at(topLeft.column())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
147 m_slices.at(topLeft.column())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
148 }
148 }
149 else
149 else
150 {
150 {
151 m_slices.at(topLeft.column())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
151 m_slices.at(topLeft.column())->setValue(q->m_model->data(topLeft, Qt::DisplayRole).toDouble());
152 }
152 }
153 else if (topLeft.row() == m_mapLabels)
153 else if (topLeft.row() == m_mapLabels)
154 m_slices.at(topLeft.column())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
154 m_slices.at(topLeft.column())->setLabel(q->m_model->data(topLeft, Qt::DisplayRole).toString());
155 }
155 }
156 }
156 }
157
157
158 void QPieSeriesPrivate::modelDataAdded(QModelIndex parent, int start, int end)
158 void QPieSeriesPrivate::modelDataAdded(QModelIndex parent, int start, int end)
159 {
159 {
160 Q_UNUSED(parent)
160 Q_UNUSED(parent)
161 Q_UNUSED(end)
161 Q_UNUSED(end)
162 Q_Q(QPieSeries);
162 Q_Q(QPieSeries);
163
163
164 QPieSlice* newSlice = new QPieSlice;
164 QPieSlice* newSlice = new QPieSlice;
165 newSlice->setLabelVisible(true);
165 newSlice->setLabelVisible(true);
166 if (m_mapOrientation == Qt::Vertical)
166 if (m_mapOrientation == Qt::Vertical)
167 {
167 {
168 newSlice->setValue(q->m_model->data(q->m_model->index(start, m_mapValues), Qt::DisplayRole).toDouble());
168 newSlice->setValue(q->m_model->data(q->m_model->index(start, m_mapValues), Qt::DisplayRole).toDouble());
169 newSlice->setLabel(q->m_model->data(q->m_model->index(start, m_mapLabels), Qt::DisplayRole).toString());
169 newSlice->setLabel(q->m_model->data(q->m_model->index(start, m_mapLabels), Qt::DisplayRole).toString());
170 }
170 }
171 else
171 else
172 {
172 {
173 newSlice->setValue(q->m_model->data(q->m_model->index(m_mapValues, start), Qt::DisplayRole).toDouble());
173 newSlice->setValue(q->m_model->data(q->m_model->index(m_mapValues, start), Qt::DisplayRole).toDouble());
174 newSlice->setLabel(q->m_model->data(q->m_model->index(m_mapLabels, start), Qt::DisplayRole).toString());
174 newSlice->setLabel(q->m_model->data(q->m_model->index(m_mapLabels, start), Qt::DisplayRole).toString());
175 }
175 }
176
176
177 q->insert(start, newSlice);
177 q->insert(start, newSlice);
178 }
178 }
179
179
180 void QPieSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end)
180 void QPieSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end)
181 {
181 {
182 Q_UNUSED(parent)
182 Q_UNUSED(parent)
183 Q_UNUSED(end)
183 Q_UNUSED(end)
184 Q_Q(QPieSeries);
184 Q_Q(QPieSeries);
185 q->remove(m_slices.at(start));
185 q->remove(m_slices.at(start));
186 }
186 }
187
187
188
188
189
189
190 /*!
190 /*!
191 \class QPieSeries
191 \class QPieSeries
192 \brief Pie series API for QtCommercial Charts
192 \brief Pie series API for QtCommercial Charts
193
193
194 The pie series defines a pie chart which consists of pie slices which are QPieSlice objects.
194 The pie series defines a pie chart which consists of pie slices which are QPieSlice objects.
195 The slices can have any values as the QPieSeries will calculate its relative value to the sum of all slices.
195 The slices can have any values as the QPieSeries will calculate its relative value to the sum of all slices.
196 The actual slice size is determined by that relative value.
196 The actual slice size is determined by that relative value.
197
197
198 By default the pie is defined as a full pie but it can be a partial pie.
198 By default the pie is defined as a full pie but it can be a partial pie.
199 This can be done by setting a starting angle and angle span to the series.
199 This can be done by setting a starting angle and angle span to the series.
200 */
200 */
201
201
202 /*!
202 /*!
203 Constructs a series object which is a child of \a parent.
203 Constructs a series object which is a child of \a parent.
204 */
204 */
205 QPieSeries::QPieSeries(QObject *parent) :
205 QPieSeries::QPieSeries(QObject *parent) :
206 QSeries(parent),
206 QSeries(parent),
207 d_ptr(new QPieSeriesPrivate(this))
207 d_ptr(new QPieSeriesPrivate(this))
208 {
208 {
209
209
210 }
210 }
211
211
212 /*!
212 /*!
213 Destroys the object. Note that adding series to QChart transfers the ownership to the chart.
213 Destroys the object. Note that adding series to QChart transfers the ownership to the chart.
214 */
214 */
215 QPieSeries::~QPieSeries()
215 QPieSeries::~QPieSeries()
216 {
216 {
217 // NOTE: d_prt destroyed by QObject
217 // NOTE: d_prt destroyed by QObject
218 }
218 }
219
219
220 /*!
220 /*!
221 Returns QChartSeries::SeriesTypePie.
221 Returns QChartSeries::SeriesTypePie.
222 */
222 */
223 QSeries::QSeriesType QPieSeries::type() const
223 QSeries::QSeriesType QPieSeries::type() const
224 {
224 {
225 return QSeries::SeriesTypePie;
225 return QSeries::SeriesTypePie;
226 }
226 }
227
227
228 /*!
228 /*!
229 Sets an array of \a slices to the series replacing the existing slices.
229 Sets an array of \a slices to the series replacing the existing slices.
230 Slice ownership is passed to the series.
230 Slice ownership is passed to the series.
231 */
231 */
232 void QPieSeries::replace(QList<QPieSlice*> slices)
232 void QPieSeries::replace(QList<QPieSlice*> slices)
233 {
233 {
234 clear();
234 clear();
235 append(slices);
235 append(slices);
236 }
236 }
237
237
238 /*!
238 /*!
239 Adds an array of \a slices to the series.
239 Adds an array of \a slices to the series.
240 Slice ownership is passed to the series.
240 Slice ownership is passed to the series.
241 */
241 */
242 void QPieSeries::append(QList<QPieSlice*> slices)
242 void QPieSeries::append(QList<QPieSlice*> slices)
243 {
243 {
244 Q_D(QPieSeries);
244 Q_D(QPieSeries);
245
245
246 foreach (QPieSlice* s, slices) {
246 foreach (QPieSlice* s, slices) {
247 s->setParent(this);
247 s->setParent(this);
248 d->m_slices << s;
248 d->m_slices << s;
249 }
249 }
250
250
251 d->updateDerivativeData();
251 d->updateDerivativeData();
252
252
253 foreach (QPieSlice* s, slices) {
253 foreach (QPieSlice* s, slices) {
254 connect(s, SIGNAL(changed()), d, SLOT(sliceChanged()));
254 connect(s, SIGNAL(changed()), d, SLOT(sliceChanged()));
255 connect(s, SIGNAL(clicked(Qt::MouseButtons)), d, SLOT(sliceClicked(Qt::MouseButtons)));
255 connect(s, SIGNAL(clicked(Qt::MouseButtons)), d, SLOT(sliceClicked(Qt::MouseButtons)));
256 connect(s, SIGNAL(hoverEnter()), d, SLOT(sliceHoverEnter()));
256 connect(s, SIGNAL(hoverEnter()), d, SLOT(sliceHoverEnter()));
257 connect(s, SIGNAL(hoverLeave()), d, SLOT(sliceHoverLeave()));
257 connect(s, SIGNAL(hoverLeave()), d, SLOT(sliceHoverLeave()));
258 }
258 }
259
259
260 emit added(slices);
260 emit added(slices);
261 }
261 }
262
262
263 /*!
263 /*!
264 Adds a single \a slice to the series.
264 Adds a single \a slice to the series.
265 Slice ownership is passed to the series.
265 Slice ownership is passed to the series.
266 */
266 */
267 void QPieSeries::append(QPieSlice* slice)
267 void QPieSeries::append(QPieSlice* slice)
268 {
268 {
269 append(QList<QPieSlice*>() << slice);
269 append(QList<QPieSlice*>() << slice);
270 }
270 }
271
271
272 /*!
272 /*!
273 Adds a single \a slice to the series and returns a reference to the series.
273 Adds a single \a slice to the series and returns a reference to the series.
274 Slice ownership is passed to the series.
274 Slice ownership is passed to the series.
275 */
275 */
276 QPieSeries& QPieSeries::operator << (QPieSlice* slice)
276 QPieSeries& QPieSeries::operator << (QPieSlice* slice)
277 {
277 {
278 append(slice);
278 append(slice);
279 return *this;
279 return *this;
280 }
280 }
281
281
282
282
283 /*!
283 /*!
284 Appends a single slice to the series with give \a value and \a name.
284 Appends a single slice to the series with give \a value and \a name.
285 Slice ownership is passed to the series.
285 Slice ownership is passed to the series.
286 */
286 */
287 QPieSlice* QPieSeries::append(qreal value, QString name)
287 QPieSlice* QPieSeries::append(qreal value, QString name)
288 {
288 {
289 QPieSlice* slice = new QPieSlice(value, name);
289 QPieSlice* slice = new QPieSlice(value, name);
290 append(slice);
290 append(slice);
291 return slice;
291 return slice;
292 }
292 }
293
293
294 /*!
294 /*!
295 Inserts a single \a slice to the series before the slice at \a index position.
295 Inserts a single \a slice to the series before the slice at \a index position.
296 Slice ownership is passed to the series.
296 Slice ownership is passed to the series.
297 */
297 */
298 void QPieSeries::insert(int index, QPieSlice* slice)
298 void QPieSeries::insert(int index, QPieSlice* slice)
299 {
299 {
300 Q_D(QPieSeries);
300 Q_D(QPieSeries);
301 Q_ASSERT(index <= d->m_slices.count());
301 Q_ASSERT(index <= d->m_slices.count());
302 slice->setParent(this);
302 slice->setParent(this);
303 d->m_slices.insert(index, slice);
303 d->m_slices.insert(index, slice);
304
304
305 d->updateDerivativeData();
305 d->updateDerivativeData();
306
306
307 connect(slice, SIGNAL(changed()), d, SLOT(sliceChanged()));
307 connect(slice, SIGNAL(changed()), d, SLOT(sliceChanged()));
308 connect(slice, SIGNAL(clicked()), d, SLOT(sliceClicked()));
308 connect(slice, SIGNAL(clicked(Qt::MouseButtons)), d, SLOT(sliceClicked(Qt::MouseButtons)));
309 connect(slice, SIGNAL(hoverEnter()), d, SLOT(sliceHoverEnter()));
309 connect(slice, SIGNAL(hoverEnter()), d, SLOT(sliceHoverEnter()));
310 connect(slice, SIGNAL(hoverLeave()), d, SLOT(sliceHoverLeave()));
310 connect(slice, SIGNAL(hoverLeave()), d, SLOT(sliceHoverLeave()));
311
311
312 emit added(QList<QPieSlice*>() << slice);
312 emit added(QList<QPieSlice*>() << slice);
313 }
313 }
314
314
315 /*!
315 /*!
316 Removes a single \a slice from the series and deletes the slice.
316 Removes a single \a slice from the series and deletes the slice.
317
317
318 Do not reference this pointer after this call.
318 Do not reference this pointer after this call.
319 */
319 */
320 void QPieSeries::remove(QPieSlice* slice)
320 void QPieSeries::remove(QPieSlice* slice)
321 {
321 {
322 Q_D(QPieSeries);
322 Q_D(QPieSeries);
323 if (!d->m_slices.removeOne(slice)) {
323 if (!d->m_slices.removeOne(slice)) {
324 Q_ASSERT(0); // TODO: how should this be reported?
324 Q_ASSERT(0); // TODO: how should this be reported?
325 return;
325 return;
326 }
326 }
327
327
328 d->updateDerivativeData();
328 d->updateDerivativeData();
329
329
330 emit removed(QList<QPieSlice*>() << slice);
330 emit removed(QList<QPieSlice*>() << slice);
331
331
332 delete slice;
332 delete slice;
333 slice = NULL;
333 slice = NULL;
334 }
334 }
335
335
336 /*!
336 /*!
337 Clears all slices from the series.
337 Clears all slices from the series.
338 */
338 */
339 void QPieSeries::clear()
339 void QPieSeries::clear()
340 {
340 {
341 Q_D(QPieSeries);
341 Q_D(QPieSeries);
342 if (d->m_slices.count() == 0)
342 if (d->m_slices.count() == 0)
343 return;
343 return;
344
344
345 QList<QPieSlice*> slices = d->m_slices;
345 QList<QPieSlice*> slices = d->m_slices;
346 foreach (QPieSlice* s, d->m_slices) {
346 foreach (QPieSlice* s, d->m_slices) {
347 d->m_slices.removeOne(s);
347 d->m_slices.removeOne(s);
348 delete s;
348 delete s;
349 }
349 }
350
350
351 d->updateDerivativeData();
351 d->updateDerivativeData();
352
352
353 emit removed(slices);
353 emit removed(slices);
354 }
354 }
355
355
356 /*!
356 /*!
357 Counts the number of the slices in this series.
357 Counts the number of the slices in this series.
358 */
358 */
359 int QPieSeries::count() const
359 int QPieSeries::count() const
360 {
360 {
361 Q_D(const QPieSeries);
361 Q_D(const QPieSeries);
362 return d->m_slices.count();
362 return d->m_slices.count();
363 }
363 }
364
364
365 /*!
365 /*!
366 Returns true is the series is empty.
366 Returns true is the series is empty.
367 */
367 */
368 bool QPieSeries::isEmpty() const
368 bool QPieSeries::isEmpty() const
369 {
369 {
370 Q_D(const QPieSeries);
370 Q_D(const QPieSeries);
371 return d->m_slices.isEmpty();
371 return d->m_slices.isEmpty();
372 }
372 }
373
373
374 /*!
374 /*!
375 Returns a list of slices that belong to this series.
375 Returns a list of slices that belong to this series.
376 */
376 */
377 QList<QPieSlice*> QPieSeries::slices() const
377 QList<QPieSlice*> QPieSeries::slices() const
378 {
378 {
379 Q_D(const QPieSeries);
379 Q_D(const QPieSeries);
380 return d->m_slices;
380 return d->m_slices;
381 }
381 }
382
382
383 /*!
383 /*!
384 Sets the center position of the pie by \a relativeHorizontalPosition and \a relativeVerticalPosition.
384 Sets the center position of the pie by \a relativeHorizontalPosition and \a relativeVerticalPosition.
385
385
386 The factors are relative to the chart rectangle where:
386 The factors are relative to the chart rectangle where:
387
387
388 \a relativeHorizontalPosition 0.0 means the absolute left.
388 \a relativeHorizontalPosition 0.0 means the absolute left.
389 \a relativeHorizontalPosition 1.0 means the absolute right.
389 \a relativeHorizontalPosition 1.0 means the absolute right.
390 \a relativeVerticalPosition 0.0 means the absolute top.
390 \a relativeVerticalPosition 0.0 means the absolute top.
391 \a relativeVerticalPosition 1.0 means the absolute bottom.
391 \a relativeVerticalPosition 1.0 means the absolute bottom.
392
392
393 By default both values are 0.5 which puts the pie in the middle of the chart rectangle.
393 By default both values are 0.5 which puts the pie in the middle of the chart rectangle.
394
394
395 \sa pieHorizontalPosition(), pieVerticalPosition(), setPieSize()
395 \sa pieHorizontalPosition(), pieVerticalPosition(), setPieSize()
396 */
396 */
397 void QPieSeries::setPiePosition(qreal relativeHorizontalPosition, qreal relativeVerticalPosition)
397 void QPieSeries::setPiePosition(qreal relativeHorizontalPosition, qreal relativeVerticalPosition)
398 {
398 {
399 Q_D(QPieSeries);
399 Q_D(QPieSeries);
400 if (relativeHorizontalPosition < 0.0 || relativeHorizontalPosition > 1.0 ||
400 if (relativeHorizontalPosition < 0.0 || relativeHorizontalPosition > 1.0 ||
401 relativeVerticalPosition < 0.0 || relativeVerticalPosition > 1.0)
401 relativeVerticalPosition < 0.0 || relativeVerticalPosition > 1.0)
402 return;
402 return;
403
403
404 if (!qFuzzyIsNull(d->m_pieRelativeHorPos - relativeHorizontalPosition) ||
404 if (!qFuzzyIsNull(d->m_pieRelativeHorPos - relativeHorizontalPosition) ||
405 !qFuzzyIsNull(d->m_pieRelativeVerPos - relativeVerticalPosition)) {
405 !qFuzzyIsNull(d->m_pieRelativeVerPos - relativeVerticalPosition)) {
406 d->m_pieRelativeHorPos = relativeHorizontalPosition;
406 d->m_pieRelativeHorPos = relativeHorizontalPosition;
407 d->m_pieRelativeVerPos = relativeVerticalPosition;
407 d->m_pieRelativeVerPos = relativeVerticalPosition;
408 emit piePositionChanged();
408 emit piePositionChanged();
409 }
409 }
410 }
410 }
411
411
412 /*!
412 /*!
413 Gets the horizontal position of the pie.
413 Gets the horizontal position of the pie.
414
414
415 The returned value is relative to the chart rectangle where:
415 The returned value is relative to the chart rectangle where:
416
416
417 0.0 means the absolute left.
417 0.0 means the absolute left.
418 1.0 means the absolute right.
418 1.0 means the absolute right.
419
419
420 By default it is 0.5 which puts the pie in the horizontal middle of the chart rectangle.
420 By default it is 0.5 which puts the pie in the horizontal middle of the chart rectangle.
421
421
422 \sa setPiePosition(), pieVerticalPosition(), setPieSize()
422 \sa setPiePosition(), pieVerticalPosition(), setPieSize()
423 */
423 */
424 qreal QPieSeries::pieHorizontalPosition() const
424 qreal QPieSeries::pieHorizontalPosition() const
425 {
425 {
426 Q_D(const QPieSeries);
426 Q_D(const QPieSeries);
427 return d->m_pieRelativeHorPos;
427 return d->m_pieRelativeHorPos;
428 }
428 }
429
429
430 /*!
430 /*!
431 Gets the vertical position position of the pie.
431 Gets the vertical position position of the pie.
432
432
433 The returned value is relative to the chart rectangle where:
433 The returned value is relative to the chart rectangle where:
434
434
435 0.0 means the absolute top.
435 0.0 means the absolute top.
436 1.0 means the absolute bottom.
436 1.0 means the absolute bottom.
437
437
438 By default it is 0.5 which puts the pie in the vertical middle of the chart rectangle.
438 By default it is 0.5 which puts the pie in the vertical middle of the chart rectangle.
439
439
440 \sa setPiePosition(), pieHorizontalPosition(), setPieSize()
440 \sa setPiePosition(), pieHorizontalPosition(), setPieSize()
441 */
441 */
442 qreal QPieSeries::pieVerticalPosition() const
442 qreal QPieSeries::pieVerticalPosition() const
443 {
443 {
444 Q_D(const QPieSeries);
444 Q_D(const QPieSeries);
445 return d->m_pieRelativeVerPos;
445 return d->m_pieRelativeVerPos;
446 }
446 }
447
447
448 /*!
448 /*!
449 Sets the relative size of the pie.
449 Sets the relative size of the pie.
450
450
451 The \a relativeSize is defined so that the 1.0 is the maximum that can fit the given chart rectangle.
451 The \a relativeSize is defined so that the 1.0 is the maximum that can fit the given chart rectangle.
452
452
453 Default value is 0.7.
453 Default value is 0.7.
454
454
455 \sa pieSize(), setPiePosition(), pieVerticalPosition(), pieHorizontalPosition()
455 \sa pieSize(), setPiePosition(), pieVerticalPosition(), pieHorizontalPosition()
456 */
456 */
457 void QPieSeries::setPieSize(qreal relativeSize)
457 void QPieSeries::setPieSize(qreal relativeSize)
458 {
458 {
459 Q_D(QPieSeries);
459 Q_D(QPieSeries);
460 if (relativeSize < 0.0 || relativeSize > 1.0)
460 if (relativeSize < 0.0 || relativeSize > 1.0)
461 return;
461 return;
462
462
463 if (!qFuzzyIsNull(d->m_pieRelativeSize- relativeSize)) {
463 if (!qFuzzyIsNull(d->m_pieRelativeSize- relativeSize)) {
464 d->m_pieRelativeSize = relativeSize;
464 d->m_pieRelativeSize = relativeSize;
465 emit pieSizeChanged();
465 emit pieSizeChanged();
466 }
466 }
467 }
467 }
468
468
469 /*!
469 /*!
470 Gets the relative size of the pie.
470 Gets the relative size of the pie.
471
471
472 The size is defined so that the 1.0 is the maximum that can fit the given chart rectangle.
472 The size is defined so that the 1.0 is the maximum that can fit the given chart rectangle.
473
473
474 Default value is 0.7.
474 Default value is 0.7.
475
475
476 \sa setPieSize(), setPiePosition(), pieVerticalPosition(), pieHorizontalPosition()
476 \sa setPieSize(), setPiePosition(), pieVerticalPosition(), pieHorizontalPosition()
477 */
477 */
478 qreal QPieSeries::pieSize() const
478 qreal QPieSeries::pieSize() const
479 {
479 {
480 Q_D(const QPieSeries);
480 Q_D(const QPieSeries);
481 return d->m_pieRelativeSize;
481 return d->m_pieRelativeSize;
482 }
482 }
483
483
484
484
485 /*!
485 /*!
486 Sets the end angle of the pie.
486 Sets the end angle of the pie.
487
487
488 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
488 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
489
489
490 \a angle must be less than pie end angle. Default value is 0.
490 \a angle must be less than pie end angle. Default value is 0.
491
491
492 \sa pieStartAngle(), pieEndAngle(), setPieEndAngle()
492 \sa pieStartAngle(), pieEndAngle(), setPieEndAngle()
493 */
493 */
494 void QPieSeries::setPieStartAngle(qreal angle)
494 void QPieSeries::setPieStartAngle(qreal angle)
495 {
495 {
496 Q_D(QPieSeries);
496 Q_D(QPieSeries);
497
497
498 if (angle < 0 || angle > 360 || angle > d->m_pieEndAngle)
498 if (angle < 0 || angle > 360 || angle > d->m_pieEndAngle)
499 return;
499 return;
500
500
501 if (!qFuzzyIsNull(angle - d->m_pieStartAngle)) {
501 if (!qFuzzyIsNull(angle - d->m_pieStartAngle)) {
502 d->m_pieStartAngle = angle;
502 d->m_pieStartAngle = angle;
503 d->updateDerivativeData();
503 d->updateDerivativeData();
504 }
504 }
505 }
505 }
506
506
507 /*!
507 /*!
508 Gets the start angle of the pie.
508 Gets the start angle of the pie.
509
509
510 Full pie is 360 degrees where 0 degrees is at 12 a'clock. Default value is 360.
510 Full pie is 360 degrees where 0 degrees is at 12 a'clock. Default value is 360.
511
511
512 \sa setPieStartAngle(), pieEndAngle(), setPieEndAngle()
512 \sa setPieStartAngle(), pieEndAngle(), setPieEndAngle()
513 */
513 */
514 qreal QPieSeries::pieStartAngle() const
514 qreal QPieSeries::pieStartAngle() const
515 {
515 {
516 Q_D(const QPieSeries);
516 Q_D(const QPieSeries);
517 return d->m_pieStartAngle;
517 return d->m_pieStartAngle;
518 }
518 }
519
519
520 /*!
520 /*!
521 Sets the end angle of the pie.
521 Sets the end angle of the pie.
522
522
523 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
523 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
524
524
525 \a angle must be greater than start angle.
525 \a angle must be greater than start angle.
526
526
527 \sa pieEndAngle(), pieStartAngle(), setPieStartAngle()
527 \sa pieEndAngle(), pieStartAngle(), setPieStartAngle()
528 */
528 */
529 void QPieSeries::setPieEndAngle(qreal angle)
529 void QPieSeries::setPieEndAngle(qreal angle)
530 {
530 {
531 Q_D(QPieSeries);
531 Q_D(QPieSeries);
532
532
533 if (angle < 0 || angle > 360 || angle < d->m_pieStartAngle)
533 if (angle < 0 || angle > 360 || angle < d->m_pieStartAngle)
534 return;
534 return;
535
535
536 if (!qFuzzyIsNull(angle - d->m_pieEndAngle)) {
536 if (!qFuzzyIsNull(angle - d->m_pieEndAngle)) {
537 d->m_pieEndAngle = angle;
537 d->m_pieEndAngle = angle;
538 d->updateDerivativeData();
538 d->updateDerivativeData();
539 }
539 }
540 }
540 }
541
541
542 /*!
542 /*!
543 Returns the end angle of the pie.
543 Returns the end angle of the pie.
544
544
545 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
545 Full pie is 360 degrees where 0 degrees is at 12 a'clock.
546
546
547 \sa setPieEndAngle(), pieStartAngle(), setPieStartAngle()
547 \sa setPieEndAngle(), pieStartAngle(), setPieStartAngle()
548 */
548 */
549 qreal QPieSeries::pieEndAngle() const
549 qreal QPieSeries::pieEndAngle() const
550 {
550 {
551 Q_D(const QPieSeries);
551 Q_D(const QPieSeries);
552 return d->m_pieEndAngle;
552 return d->m_pieEndAngle;
553 }
553 }
554
554
555 /*!
555 /*!
556 Sets the all the slice labels \a visible or invisible.
556 Sets the all the slice labels \a visible or invisible.
557
557
558 \sa QPieSlice::isLabelVisible(), QPieSlice::setLabelVisible()
558 \sa QPieSlice::isLabelVisible(), QPieSlice::setLabelVisible()
559 */
559 */
560 void QPieSeries::setLabelsVisible(bool visible)
560 void QPieSeries::setLabelsVisible(bool visible)
561 {
561 {
562 Q_D(QPieSeries);
562 Q_D(QPieSeries);
563 foreach (QPieSlice* s, d->m_slices)
563 foreach (QPieSlice* s, d->m_slices)
564 s->setLabelVisible(visible);
564 s->setLabelVisible(visible);
565 }
565 }
566
566
567 /*!
567 /*!
568 Returns the sum of all slice values in this series.
568 Returns the sum of all slice values in this series.
569
569
570 \sa QPieSlice::value(), QPieSlice::setValue()
570 \sa QPieSlice::value(), QPieSlice::setValue()
571 */
571 */
572 qreal QPieSeries::total() const
572 qreal QPieSeries::total() const
573 {
573 {
574 Q_D(const QPieSeries);
574 Q_D(const QPieSeries);
575 return d->m_total;
575 return d->m_total;
576 }
576 }
577
577
578 /*!
578 /*!
579 \fn void QPieSeries::clicked(QPieSlice* slice, Qt::MouseButtons buttons)
579 \fn void QPieSeries::clicked(QPieSlice* slice, Qt::MouseButtons buttons)
580
580
581 This signal is emitted when a \a slice has been clicked with mouse \a buttons.
581 This signal is emitted when a \a slice has been clicked with mouse \a buttons.
582
582
583 \sa QPieSlice::clicked()
583 \sa QPieSlice::clicked()
584 */
584 */
585
585
586 /*!
586 /*!
587 \fn void QPieSeries::hoverEnter(QPieSlice* slice)
587 \fn void QPieSeries::hoverEnter(QPieSlice* slice)
588
588
589 This signal is emitted when user has hovered over a \a slice.
589 This signal is emitted when user has hovered over a \a slice.
590
590
591 \sa QPieSlice::hoverEnter()
591 \sa QPieSlice::hoverEnter()
592 */
592 */
593
593
594 /*!
594 /*!
595 \fn void QPieSeries::hoverLeave(QPieSlice* slice)
595 \fn void QPieSeries::hoverLeave(QPieSlice* slice)
596
596
597 This signal is emitted when user has hovered away from a \a slice.
597 This signal is emitted when user has hovered away from a \a slice.
598
598
599 \sa QPieSlice::hoverLeave()
599 \sa QPieSlice::hoverLeave()
600 */
600 */
601
601
602 /*!
602 /*!
603 \fn void QPieSeries::added(QList<QPieSlice*> slices)
603 \fn void QPieSeries::added(QList<QPieSlice*> slices)
604
604
605 This signal is emitted when \a slices has been added to the series.
605 This signal is emitted when \a slices has been added to the series.
606
606
607 \sa append(), insert()
607 \sa append(), insert()
608 */
608 */
609
609
610 /*!
610 /*!
611 \fn void QPieSeries::removed(QList<QPieSlice*> slices)
611 \fn void QPieSeries::removed(QList<QPieSlice*> slices)
612
612
613 This signal is emitted when \a slices has been removed from the series.
613 This signal is emitted when \a slices has been removed from the series.
614
614
615 \sa remove(), clear()
615 \sa remove(), clear()
616 */
616 */
617
617
618 /*!
618 /*!
619 \fn void QPieSeries::piePositionChanged()
619 \fn void QPieSeries::piePositionChanged()
620
620
621 This signal is emitted when pie position has changed.
621 This signal is emitted when pie position has changed.
622
622
623 \sa setPiePosition(), pieVerticalPosition(), pieHorizontalPosition()
623 \sa setPiePosition(), pieVerticalPosition(), pieHorizontalPosition()
624 */
624 */
625
625
626 /*!
626 /*!
627 \fn void QPieSeries::pieSizeChanged()
627 \fn void QPieSeries::pieSizeChanged()
628
628
629 This signal is emitted when pie size has changed.
629 This signal is emitted when pie size has changed.
630
630
631 \sa pieSize(), setPieSize()
631 \sa pieSize(), setPieSize()
632 */
632 */
633
633
634 bool QPieSeries::setModel(QAbstractItemModel* model)
634 bool QPieSeries::setModel(QAbstractItemModel* model)
635 {
635 {
636 Q_D(QPieSeries);
636 Q_D(QPieSeries);
637 // disconnect signals from old model
637 // disconnect signals from old model
638 if(m_model)
638 if(m_model)
639 {
639 {
640 disconnect(m_model, 0, this, 0);
640 disconnect(m_model, 0, this, 0);
641 d->m_mapValues = -1;
641 d->m_mapValues = -1;
642 d->m_mapLabels = -1;
642 d->m_mapLabels = -1;
643 d->m_mapOrientation = Qt::Vertical;
643 d->m_mapOrientation = Qt::Vertical;
644 }
644 }
645
645
646 // set new model
646 // set new model
647 if(model)
647 if(model)
648 {
648 {
649 m_model = model;
649 m_model = model;
650 return true;
650 return true;
651 }
651 }
652 else
652 else
653 {
653 {
654 m_model = NULL;
654 m_model = NULL;
655 return false;
655 return false;
656 }
656 }
657 }
657 }
658
658
659 void QPieSeries::setModelMapping(int modelValuesLine, int modelLabelsLine, Qt::Orientation orientation)
659 void QPieSeries::setModelMapping(int modelValuesLine, int modelLabelsLine, Qt::Orientation orientation)
660 {
660 {
661 Q_D(QPieSeries);
661 Q_D(QPieSeries);
662
662
663 if (m_model == NULL)
663 if (m_model == NULL)
664 return;
664 return;
665
665
666 d->m_mapValues = modelValuesLine;
666 d->m_mapValues = modelValuesLine;
667 d->m_mapLabels = modelLabelsLine;
667 d->m_mapLabels = modelLabelsLine;
668 d->m_mapOrientation = orientation;
668 d->m_mapOrientation = orientation;
669
669
670 // connect the signals
670 // connect the signals
671 if (d->m_mapOrientation == Qt::Vertical) {
671 if (d->m_mapOrientation == Qt::Vertical) {
672 connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex)));
672 connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex)));
673 connect(m_model, SIGNAL(rowsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int)));
673 connect(m_model, SIGNAL(rowsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int)));
674 connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int)));
674 connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int)));
675 } else {
675 } else {
676 connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex)));
676 connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex, QModelIndex)));
677 connect(m_model, SIGNAL(columnsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int)));
677 connect(m_model, SIGNAL(columnsInserted(QModelIndex, int, int)), d, SLOT(modelDataAdded(QModelIndex,int,int)));
678 connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int)));
678 connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), d, SLOT(modelDataRemoved(QModelIndex,int,int)));
679 }
679 }
680
680
681 // create the initial slices set
681 // create the initial slices set
682 if (d->m_mapOrientation == Qt::Vertical) {
682 if (d->m_mapOrientation == Qt::Vertical) {
683 for (int i = 0; i < m_model->rowCount(); i++)
683 for (int i = 0; i < m_model->rowCount(); i++)
684 append(m_model->data(m_model->index(i, d->m_mapValues), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(i, d->m_mapLabels), Qt::DisplayRole).toString());
684 append(m_model->data(m_model->index(i, d->m_mapValues), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(i, d->m_mapLabels), Qt::DisplayRole).toString());
685 } else {
685 } else {
686 for (int i = 0; i < m_model->columnCount(); i++)
686 for (int i = 0; i < m_model->columnCount(); i++)
687 append(m_model->data(m_model->index(d->m_mapValues, i), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(d->m_mapLabels, i), Qt::DisplayRole).toString());
687 append(m_model->data(m_model->index(d->m_mapValues, i), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(d->m_mapLabels, i), Qt::DisplayRole).toString());
688 }
688 }
689 }
689 }
690
690
691 #include "moc_qpieseries.cpp"
691 #include "moc_qpieseries.cpp"
692 #include "moc_qpieseriesprivate_p.cpp"
692 #include "moc_qpieseriesprivate_p.cpp"
693
693
694 QTCOMMERCIALCHART_END_NAMESPACE
694 QTCOMMERCIALCHART_END_NAMESPACE
General Comments 0
You need to be logged in to leave comments. Login now