##// END OF EJS Templates
Added initial donut chart support to Pie series
Marek Rosa -
r1670:5a9ca9e911f7
parent child
Show More
@@ -214,6 +214,7 PieSliceData PieChartItem::updateSliceGeometry(QPieSlice *slice)
214 PieSliceData &sliceData = QPieSlicePrivate::fromSlice(slice)->m_data;
214 PieSliceData &sliceData = QPieSlicePrivate::fromSlice(slice)->m_data;
215 sliceData.m_center = PieSliceItem::sliceCenter(m_pieCenter, m_pieRadius, slice);
215 sliceData.m_center = PieSliceItem::sliceCenter(m_pieCenter, m_pieRadius, slice);
216 sliceData.m_radius = m_pieRadius;
216 sliceData.m_radius = m_pieRadius;
217 sliceData.m_donut = m_series->donut();
217 return sliceData;
218 return sliceData;
218 }
219 }
219
220
@@ -82,6 +82,7 public:
82 m_radius = 0;
82 m_radius = 0;
83 m_startAngle = 0;
83 m_startAngle = 0;
84 m_angleSpan = 0;
84 m_angleSpan = 0;
85 m_donut = false;
85 }
86 }
86
87
87 bool operator!=(const PieSliceData &other) const
88 bool operator!=(const PieSliceData &other) const
@@ -135,6 +136,7 public:
135 qreal m_radius;
136 qreal m_radius;
136 qreal m_startAngle;
137 qreal m_startAngle;
137 qreal m_angleSpan;
138 qreal m_angleSpan;
139 bool m_donut;
138 };
140 };
139
141
140 QTCOMMERCIALCHART_END_NAMESPACE
142 QTCOMMERCIALCHART_END_NAMESPACE
@@ -40,7 +40,7 QPointF offset(qreal angle, qreal length)
40
40
41 PieSliceItem::PieSliceItem(QGraphicsItem* parent)
41 PieSliceItem::PieSliceItem(QGraphicsItem* parent)
42 :QGraphicsObject(parent),
42 :QGraphicsObject(parent),
43 m_hovered(false)
43 m_hovered(false)
44 {
44 {
45 setAcceptHoverEvents(true);
45 setAcceptHoverEvents(true);
46 setAcceptedMouseButtons(Qt::MouseButtonMask);
46 setAcceptedMouseButtons(Qt::MouseButtonMask);
@@ -174,11 +174,19 QPainterPath PieSliceItem::slicePath(QPointF center, qreal radius, qreal startAn
174 QRectF rect(center.x()-radius, center.y()-radius, radius*2, radius*2);
174 QRectF rect(center.x()-radius, center.y()-radius, radius*2, radius*2);
175
175
176 // slice path
176 // slice path
177 // TODO: draw the shape so that it might have a hole in the center
178 QPainterPath path;
177 QPainterPath path;
179 path.moveTo(rect.center());
178 if (m_data.m_donut) {
180 path.arcTo(rect, -startAngle + 90, -angleSpan);
179 qreal donutFraction = 5.0;
181 path.closeSubpath();
180 QRectF insideRect = rect.adjusted(rect.width() / donutFraction, rect.height() / donutFraction, -rect.width() / donutFraction, -rect.height() / donutFraction);
181 path.arcMoveTo(rect, -startAngle + 90);
182 path.arcTo(rect, -startAngle + 90, -angleSpan);
183 path.arcTo(insideRect, -startAngle + 90 - angleSpan, angleSpan);
184 path.closeSubpath();
185 } else {
186 path.moveTo(rect.center());
187 path.arcTo(rect, -startAngle + 90, -angleSpan);
188 path.closeSubpath();
189 }
182
190
183 // calculate label arm start point
191 // calculate label arm start point
184 *armStart = center;
192 *armStart = center;
@@ -213,12 +221,12 QPainterPath PieSliceItem::labelArmPath(QPointF start, qreal angle, qreal length
213 // line to underline the label
221 // line to underline the label
214 QPointF parm2 = parm1;
222 QPointF parm2 = parm1;
215 if (angle < 180) { // arm swings the other way on the left side
223 if (angle < 180) { // arm swings the other way on the left side
216 parm2 += QPointF(textWidth, 0);
224 parm2 += QPointF(textWidth, 0);
217 *textStart = parm1;
225 *textStart = parm1;
218 }
226 }
219 else {
227 else {
220 parm2 += QPointF(-textWidth,0);
228 parm2 += QPointF(-textWidth,0);
221 *textStart = parm2;
229 *textStart = parm2;
222 }
230 }
223
231
224 QPainterPath path;
232 QPainterPath path;
@@ -523,6 +523,19 qreal QPieSeries::sum() const
523 return d->m_sum;
523 return d->m_sum;
524 }
524 }
525
525
526 void QPieSeries::setDonut(bool donut)
527 {
528 Q_D(QPieSeries);
529 d->m_donutChart = donut;
530 d->updateDerivativeData();
531 }
532
533 bool QPieSeries::donut() const
534 {
535 Q_D(const QPieSeries);
536 return d->m_donutChart;
537 }
538
526 void QPieSeries::setHorizontalPosition(qreal relativePosition)
539 void QPieSeries::setHorizontalPosition(qreal relativePosition)
527 {
540 {
528 Q_D(QPieSeries);
541 Q_D(QPieSeries);
@@ -660,7 +673,8 QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) :
660 m_pieRelativeSize(0.7),
673 m_pieRelativeSize(0.7),
661 m_pieStartAngle(0),
674 m_pieStartAngle(0),
662 m_pieEndAngle(360),
675 m_pieEndAngle(360),
663 m_sum(0)
676 m_sum(0),
677 m_donutChart(false)
664 {
678 {
665 }
679 }
666
680
@@ -693,6 +707,7 void QPieSeriesPrivate::updateDerivativeData()
693 d->setPercentage(s->value() / m_sum);
707 d->setPercentage(s->value() / m_sum);
694 d->setStartAngle(sliceAngle);
708 d->setStartAngle(sliceAngle);
695 d->setAngleSpan(pieSpan * s->percentage());
709 d->setAngleSpan(pieSpan * s->percentage());
710 d->m_data.m_donut = m_donutChart;
696 sliceAngle += s->angleSpan();
711 sliceAngle += s->angleSpan();
697 }
712 }
698
713
@@ -61,6 +61,9 public:
61
61
62 qreal sum() const;
62 qreal sum() const;
63
63
64 void setDonut(bool donut = true);
65 bool donut() const;
66
64 void setHorizontalPosition(qreal relativePosition);
67 void setHorizontalPosition(qreal relativePosition);
65 qreal horizontalPosition() const;
68 qreal horizontalPosition() const;
66
69
@@ -77,6 +77,7 private:
77 qreal m_pieStartAngle;
77 qreal m_pieStartAngle;
78 qreal m_pieEndAngle;
78 qreal m_pieEndAngle;
79 qreal m_sum;
79 qreal m_sum;
80 bool m_donutChart;
80
81
81 private:
82 private:
82 friend class QLegendPrivate;
83 friend class QLegendPrivate;
General Comments 0
You need to be logged in to leave comments. Login now