##// END OF EJS Templates
Moved pie stuff to own .pri file and rename stuff
Jani Honkonen -
r146:6c3759bde1fd
parent child
Show More
@@ -0,0 +1,14
1 INCLUDEPATH += $$PWD
2 DEPENDPATH += $$PWD
3
4 SOURCES += \
5 $$PWD/qpieseries.cpp \
6 $$PWD/pieslice.cpp \
7 $$PWD/piepresenter.cpp
8
9 PRIVATE_HEADERS += \
10 $$PWD/piepresenter.h \
11 $$PWD/pieslice.h
12
13 PUBLIC_HEADERS += \
14 $$PWD/qpieseries.h
@@ -1,148 +1,147
1 1 #include "chartdataset_p.h"
2 2 //series
3 3 #include "qlinechartseries.h"
4 4 #include "barchartseries.h"
5 5 #include "stackedbarchartseries.h"
6 6 #include "percentbarchartseries.h"
7 #include "piechart/qpieseries.h"
8 #include "piechart/piepresentation.h"
7 #include "qpieseries.h"
9 8
10 9 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11 10
12 11 ChartDataSet::ChartDataSet(QObject *parent):QObject(parent)
13 12 {
14 13 Domain domain;
15 14 m_domains<<domain;
16 15 }
17 16
18 17 ChartDataSet::~ChartDataSet()
19 18 {
20 19 // TODO Auto-generated destructor stub
21 20 }
22 21
23 22 const Domain& ChartDataSet::domain() const
24 23 {
25 24 return m_domains[m_domainIndex];
26 25 }
27 26
28 27 void ChartDataSet::addSeries(QChartSeries* series)
29 28 {
30 29 // TODO: we should check the series not already added
31 30 m_chartSeries << series;
32 31 m_domainIndex = 0;
33 32 m_domains.resize(1);
34 33
35 34 Domain& domain = m_domains[m_domainIndex];
36 35
37 36 switch(series->type())
38 37 {
39 38 case QChartSeries::SeriesTypeLine: {
40 39
41 40 QLineChartSeries* xyseries = static_cast<QLineChartSeries*>(series);
42 41
43 42 for (int i = 0; i < xyseries->count(); i++)
44 43 {
45 44 qreal x = xyseries->x(i);
46 45 qreal y = xyseries->y(i);
47 46 domain.m_minX = qMin(domain.m_minX,x);
48 47 domain.m_minY = qMin(domain.m_minY,y);
49 48 domain.m_maxX = qMax(domain.m_maxX,x);
50 49 domain.m_maxY = qMax(domain.m_maxY,y);
51 50 }
52 51 break;
53 52 }
54 53 case QChartSeries::SeriesTypeBar: {
55 54
56 55 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
57 56 qreal x = barSeries->countColumns();
58 57 qreal y = barSeries->max();
59 58 domain.m_minX = qMin(domain.m_minX,x);
60 59 domain.m_minY = qMin(domain.m_minY,y);
61 60 domain.m_maxX = qMax(domain.m_maxX,x);
62 61 domain.m_maxY = qMax(domain.m_maxY,y);
63 62 }
64 63 break;
65 64 case QChartSeries::SeriesTypeStackedBar: {
66 65
67 66 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
68 67 qreal x = stackedBarSeries->countColumns();
69 68 qreal y = stackedBarSeries->maxColumnSum();
70 69 domain.m_minX = qMin(domain.m_minX,x);
71 70 domain.m_minY = qMin(domain.m_minY,y);
72 71 domain.m_maxX = qMax(domain.m_maxX,x);
73 72 domain.m_maxY = qMax(domain.m_maxY,y);
74 73 }
75 74 break;
76 75 case QChartSeries::SeriesTypePercentBar: {
77 76
78 77 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
79 78 qreal x = percentBarSeries->countColumns();
80 79 domain.m_minX = qMin(domain.m_minX,x);
81 80 domain.m_minY = 0;
82 81 domain.m_maxX = qMax(domain.m_maxX,x);
83 82 domain.m_maxY = 100;
84 83 }
85 84 break;
86 85
87 86 case QChartSeries::SeriesTypePie: {
88 87 QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
89 88 // TODO: domain stuff
90 89 break;
91 90 }
92 91
93 92 default: {
94 93 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
95 94 return;
96 95 break;
97 96 }
98 97
99 98 }
100 99
101 100 emit seriesAdded(series);
102 101 emit domainChanged(domain);
103 102 }
104 103
105 104 bool ChartDataSet::nextDomain()
106 105 {
107 106 if (m_domainIndex < m_domains.count() - 1) {
108 107 m_domainIndex++;
109 108 emit domainChanged(m_domains[m_domainIndex]);
110 109 return true;
111 110 }
112 111 else {
113 112 return false;
114 113 }
115 114 }
116 115
117 116 bool ChartDataSet::previousDomain()
118 117 {
119 118 if (m_domainIndex > 0) {
120 119 m_domainIndex--;
121 120 emit domainChanged(m_domains[m_domainIndex]);
122 121 return true;
123 122 }
124 123 else {
125 124 return false;
126 125 }
127 126 }
128 127
129 128 void ChartDataSet::clearDomains()
130 129 {
131 130 if (m_domainIndex > 0) {
132 131 m_domainIndex = 0;
133 132 emit domainChanged(m_domains[m_domainIndex]);
134 133 }
135 134 }
136 135
137 136 void ChartDataSet::addDomain(const Domain& domain)
138 137 {
139 138 m_domains.resize(m_domainIndex + 1);
140 139 m_domains << domain;
141 140 m_domainIndex++;
142 141
143 142 emit domainChanged(domain);
144 143 }
145 144
146 145 #include "moc_chartdataset_p.cpp"
147 146
148 147 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,248 +1,248
1 1 #include "qchart.h"
2 2 #include "qchartaxis.h"
3 3 #include "chartpresenter_p.h"
4 4 #include "chartdataset_p.h"
5 5 #include "charttheme_p.h"
6 6 //series
7 7 #include "barchartseries.h"
8 8 #include "stackedbarchartseries.h"
9 9 #include "percentbarchartseries.h"
10 10 #include "qlinechartseries.h"
11 11 #include "qpieseries.h"
12 12 //items
13 13 #include "axisitem_p.h"
14 14 #include "bargroup.h"
15 15 #include "stackedbargroup.h"
16 16 #include "linechartitem_p.h"
17 17 #include "percentbargroup.h"
18 18 #include "linechartanimationitem_p.h"
19 #include "piepresentation.h"
19 #include "piepresenter.h"
20 20
21 21 QTCOMMERCIALCHART_BEGIN_NAMESPACE
22 22
23 23 ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(chart),
24 24 m_chart(chart),
25 25 m_dataset(dataset),
26 26 m_chartTheme(0),
27 27 m_domainIndex(0),
28 28 m_marginSize(0),
29 29 m_rect(QRectF(QPoint(0,0),m_chart->size()))
30 30 {
31 31 setTheme(QChart::ChartThemeDefault);
32 32 createConnections();
33 33 createDeafultAxis();
34 34 }
35 35
36 36 ChartPresenter::~ChartPresenter()
37 37 {
38 38 }
39 39
40 40 void ChartPresenter::createDeafultAxis()
41 41 {
42 42 //default axis
43 43 QChartAxis* axisX = new QChartAxis(this);
44 44 QChartAxis* axisY = new QChartAxis(this);
45 45
46 46 m_axis << new AxisItem(axisX,AxisItem::X_AXIS,m_chart);
47 47 m_axis << new AxisItem(axisY,AxisItem::Y_AXIS,m_chart);
48 48
49 49 foreach(AxisItem* item, m_axis) {
50 50 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
51 51 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
52 52 }
53 53 }
54 54
55 55 void ChartPresenter::createConnections()
56 56 {
57 57 QObject::connect(m_chart,SIGNAL(geometryChanged()),this,SLOT(handleGeometryChanged()));
58 58 QObject::connect(m_dataset,SIGNAL(seriesAdded(QChartSeries*)),this,SLOT(handleSeriesAdded(QChartSeries*)));
59 59 }
60 60
61 61 void ChartPresenter::handleGeometryChanged()
62 62 {
63 63 m_rect = QRectF(QPoint(0,0),m_chart->size());
64 64 m_rect.adjust(m_marginSize,m_marginSize, -m_marginSize, -m_marginSize);
65 65 emit geometryChanged(m_rect);
66 66 }
67 67
68 68 int ChartPresenter::margin() const
69 69 {
70 70 return m_marginSize;
71 71 }
72 72
73 73 void ChartPresenter::setMargin(int margin)
74 74 {
75 75 m_marginSize = margin;
76 76 }
77 77
78 78 void ChartPresenter::handleSeriesAdded(QChartSeries* series)
79 79 {
80 80 switch(series->type())
81 81 {
82 82 case QChartSeries::SeriesTypeLine: {
83 83 QLineChartSeries* lineSeries = static_cast<QLineChartSeries*>(series);
84 84 LineChartItem* item = new LineChartAnimationItem(this,lineSeries,m_chart);
85 85 m_chartTheme->decorate(item,lineSeries,m_chartItems.count());
86 86 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
87 87 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
88 88 QObject::connect(lineSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
89 89 m_chartItems.insert(series,item);
90 90 break;
91 91 }
92 92
93 93 case QChartSeries::SeriesTypeBar: {
94 94 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
95 95 BarGroup* item = new BarGroup(*barSeries,m_chart);
96 96 m_chartTheme->decorate(item,barSeries,m_chartItems.count());
97 97 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
98 98 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
99 99 QObject::connect(barSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
100 100 m_chartItems.insert(series,item);
101 101 // m_axisXItem->setVisible(false);
102 102 break;
103 103 }
104 104
105 105 case QChartSeries::SeriesTypeStackedBar: {
106 106
107 107 StackedBarChartSeries* stackedBarSeries = static_cast<StackedBarChartSeries*>(series);
108 108 StackedBarGroup* item = new StackedBarGroup(*stackedBarSeries,m_chart);
109 109 m_chartTheme->decorate(item,stackedBarSeries,m_chartItems.count());
110 110 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
111 111 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
112 112 QObject::connect(stackedBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
113 113 m_chartItems.insert(series,item);
114 114 break;
115 115 }
116 116
117 117 case QChartSeries::SeriesTypePercentBar: {
118 118
119 119 PercentBarChartSeries* percentBarSeries = static_cast<PercentBarChartSeries*>(series);
120 120 PercentBarGroup* item = new PercentBarGroup(*percentBarSeries,m_chart);
121 121 m_chartTheme->decorate(item,percentBarSeries ,m_chartItems.count());
122 122 QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&)));
123 123 QObject::connect(m_dataset,SIGNAL(domainChanged(const Domain&)),item,SLOT(handleDomainChanged(const Domain&)));
124 124 QObject::connect(percentBarSeries,SIGNAL(changed(int)),item,SLOT(handleModelChanged(int)));
125 125 m_chartItems.insert(series,item);
126 126 break;
127 127 }
128 128 /*
129 129 case QChartSeries::SeriesTypeScatter: {
130 130 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
131 131 scatterSeries->d->m_theme = m_chartTheme->themeForSeries();
132 132 scatterSeries->d->setParentItem(this);
133 133 scatterSeries->d->m_boundingRect = m_rect.adjusted(margin(),margin(), -margin(), -margin());
134 134 m_chartItems << scatterSeries->d;
135 135 m_chartTheme->addObserver(scatterSeries->d);
136 136
137 137 foreach (qreal x, scatterSeries->d->m_x) {
138 138 domain.m_minX = qMin(domain.m_minX, x);
139 139 domain.m_maxX = qMax(domain.m_maxX, x);
140 140 }
141 141 foreach (qreal y, scatterSeries->d->m_y) {
142 142 domain.m_minY = qMin(domain.m_minY, y);
143 143 domain.m_maxY = qMax(domain.m_maxY, y);
144 144 }
145 145
146 146 break;
147 147 }
148 148 */
149 149
150 150 case QChartSeries::SeriesTypePie: {
151 151 QPieSeries *pieSeries = qobject_cast<QPieSeries *>(series);
152 PiePresentation* pieChart = new PiePresentation(m_chart, pieSeries);
153 pieSeries->m_piePresentation = pieChart; // TODO: remove this pointer passing use signals&slots
154 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), pieChart, SLOT(handleGeometryChanged(const QRectF&)));
155 QObject::connect(m_dataset, SIGNAL(domainChanged(const Domain&)), pieChart, SLOT(handleDomainChanged(const Domain&)));
156 m_chartItems.insert(series, pieChart);
152 PiePresenter* pie = new PiePresenter(m_chart, pieSeries);
153 pieSeries->m_piePresenter = pie; // TODO: remove this pointer passing use signals&slots
154 QObject::connect(this, SIGNAL(geometryChanged(const QRectF&)), pie, SLOT(handleGeometryChanged(const QRectF&)));
155 QObject::connect(m_dataset, SIGNAL(domainChanged(const Domain&)), pie, SLOT(handleDomainChanged(const Domain&)));
156 m_chartItems.insert(series, pie);
157 157 break;
158 158 }
159 159
160 160 default: {
161 161 qDebug()<< "Series type" << series->type() << "not implemented.";
162 162 break;
163 163 }
164 164 }
165 165 }
166 166
167 167 void ChartPresenter::handleSeriesChanged(QChartSeries* series)
168 168 {
169 169 //TODO:
170 170 }
171 171
172 172 void ChartPresenter::zoomInToRect(const QRectF& rect)
173 173 {
174 174 if(!rect.isValid()) return;
175 175 QRectF r = rect.normalized();
176 176 r.translate(-m_marginSize, -m_marginSize);
177 177 Domain domain (m_dataset->domain().subDomain(rect,m_rect.width(),m_rect.height()));
178 178 m_dataset->addDomain(domain);
179 179 }
180 180
181 181 void ChartPresenter::zoomIn()
182 182 {
183 183 if (!m_dataset->nextDomain()) {
184 184 QRectF rect = m_rect;
185 185 rect.setWidth(rect.width()/2);
186 186 rect.setHeight(rect.height()/2);
187 187 rect.moveCenter(m_rect.center());
188 188 Domain domain (m_dataset->domain().subDomain(rect,m_rect.width(),m_rect.height()));
189 189 m_dataset->addDomain(domain);
190 190 }
191 191 }
192 192
193 193 void ChartPresenter::zoomOut()
194 194 {
195 195 m_dataset->previousDomain();
196 196 }
197 197
198 198 void ChartPresenter::zoomReset()
199 199 {
200 200 m_dataset->clearDomains();
201 201 }
202 202
203 203 void ChartPresenter::setTheme(QChart::ChartThemeId theme)
204 204 {
205 205 delete m_chartTheme;
206 206
207 207 m_chartTheme = ChartTheme::createTheme(theme);
208 208
209 209 m_chartTheme->decorate(m_chart);
210 210 QMapIterator<QChartSeries*,ChartItem*> i(m_chartItems);
211 211
212 212 int index=0;
213 213 while (i.hasNext()) {
214 214 i.next();
215 215 index++;
216 216 m_chartTheme->decorate(i.value(),i.key(),index);
217 217 }
218 218 }
219 219
220 220
221 221 QChart::ChartThemeId ChartPresenter::theme()
222 222 {
223 223 return (QChart::ChartThemeId) 0;
224 224 }
225 225
226 226 /*
227 227 void ChartPresenter::setAxisX(const QChartAxis& axis)
228 228 {
229 229 setAxis(m_axisXItem,axis);
230 230 }
231 231 void ChartPresenter::setAxisY(const QChartAxis& axis)
232 232 {
233 233 setAxis(m_axisYItem.at(0),axis);
234 234 }
235 235
236 236 void ChartPresenter::setAxisY(const QList<QChartAxis>& axis)
237 237 {
238 238 //TODO not implemented
239 239 }
240 240
241 241 void ChartPresenter::setAxis(AxisItem *item, const QChartAxis& axis)
242 242 {
243 243 item->setVisible(axis.isAxisVisible());
244 244 }
245 245 */
246 246 #include "moc_chartpresenter_p.cpp"
247 247
248 248 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,122 +1,122
1 1
2 #include "piepresentation.h"
2 #include "piepresenter.h"
3 3 #include "pieslice.h"
4 4 #include <QDebug>
5 5
6 6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7 7
8 PiePresentation::PiePresentation(QGraphicsItem *parent, QPieSeries *series) :
8 PiePresenter::PiePresenter(QGraphicsItem *parent, QPieSeries *series) :
9 9 ChartItem(parent),
10 10 m_pieSeries(series)
11 11 {
12 12 Q_ASSERT(parent);
13 13 Q_ASSERT(series);
14 14 m_rect = parentItem()->boundingRect();
15 15 setAcceptHoverEvents(true);
16 16 }
17 17
18 PiePresentation::~PiePresentation()
18 PiePresenter::~PiePresenter()
19 19 {
20 20 while (m_slices.count())
21 21 delete m_slices.takeLast();
22 22 }
23 23
24 void PiePresentation::seriesChanged()
24 void PiePresenter::seriesChanged()
25 25 {
26 26 const qreal fullPie = 360;
27 27 qreal total = 0;
28 28
29 29 // calculate total
30 30 foreach (QPieSlice sliceData, m_pieSeries->slices())
31 31 total += sliceData.m_value;
32 32
33 33 // TODO: no need to create new slices in case size changed; we should re-use the existing ones
34 34 while (m_slices.count())
35 35 delete m_slices.takeLast();
36 36
37 37 // create slices
38 38 qreal angle = 0;
39 39 for (int i=0; i<m_pieSeries->count(); i++) {
40 40 QPieSlice sliceData = m_pieSeries->slice(i);
41 41 qreal span = sliceData.m_value / total * fullPie;
42 42 PieSlice *slice = new PieSlice(this, i, angle, span);
43 43 m_slices.append(slice);
44 44 angle += span;
45 45 }
46 46
47 47 resize();
48 48 }
49 49
50 void PiePresentation::setSize(const QSizeF &size)
50 void PiePresenter::setSize(const QSizeF &size)
51 51 {
52 52 // TODO: allow user setting the size?
53 53 // TODO: allow user defining the margins?
54 54 m_rect.setSize(size);
55 55 resize();
56 56 }
57 57
58 void PiePresentation::setPlotDomain(const PlotDomain& plotDomain)
58 void PiePresenter::setPlotDomain(const PlotDomain& plotDomain)
59 59 {
60 60 // TODO
61 61 }
62 62
63 void PiePresentation::resize()
63 void PiePresenter::resize()
64 64 {
65 65 m_pieRect = m_rect;
66 66
67 67 if (m_pieRect.width() < m_pieRect.height()) {
68 68 m_pieRect.setWidth(m_pieRect.width() * m_pieSeries->m_sizeFactor);
69 69 m_pieRect.setHeight(m_pieRect.width());
70 70 m_pieRect.moveCenter(m_rect.center());
71 71 } else {
72 72 m_pieRect.setHeight(m_pieRect.height() * m_pieSeries->m_sizeFactor);
73 73 m_pieRect.setWidth(m_pieRect.height());
74 74 m_pieRect.moveCenter(m_rect.center());
75 75 }
76 76
77 77 switch (m_pieSeries->m_position) {
78 78 case QPieSeries::PiePositionTopLeft: {
79 79 m_pieRect.setHeight(m_pieRect.height() / 2);
80 80 m_pieRect.setWidth(m_pieRect.height());
81 81 m_pieRect.moveCenter(QPointF(m_rect.center().x() / 2, m_rect.center().y() / 2));
82 82 break;
83 83 }
84 84 case QPieSeries::PiePositionTopRight: {
85 85 m_pieRect.setHeight(m_pieRect.height() / 2);
86 86 m_pieRect.setWidth(m_pieRect.height());
87 87 m_pieRect.moveCenter(QPointF((m_rect.center().x() / 2) * 3, m_rect.center().y() / 2));
88 88 break;
89 89 }
90 90 case QPieSeries::PiePositionBottomLeft: {
91 91 m_pieRect.setHeight(m_pieRect.height() / 2);
92 92 m_pieRect.setWidth(m_pieRect.height());
93 93 m_pieRect.moveCenter(QPointF(m_rect.center().x() / 2, (m_rect.center().y() / 2) * 3));
94 94 break;
95 95 }
96 96 case QPieSeries::PiePositionBottomRight: {
97 97 m_pieRect.setHeight(m_pieRect.height() / 2);
98 98 m_pieRect.setWidth(m_pieRect.height());
99 99 m_pieRect.moveCenter(QPointF((m_rect.center().x() / 2) * 3, (m_rect.center().y() / 2) * 3));
100 100 break;
101 101 }
102 102 default:
103 103 break;
104 104 }
105 105
106 106 qDebug() << "presentation rect:" << m_rect;
107 107 qDebug() << "pie rect:" << m_pieRect;
108 108 }
109 109
110 void PiePresentation::handleDomainChanged(const Domain& domain)
110 void PiePresenter::handleDomainChanged(const Domain& domain)
111 111 {
112 112 // TODO
113 113 }
114 114
115 void PiePresentation::handleGeometryChanged(const QRectF& rect)
115 void PiePresenter::handleGeometryChanged(const QRectF& rect)
116 116 {
117 117 setSize(rect.size());
118 118 }
119 119
120 #include "moc_piepresentation.cpp"
120 #include "moc_piepresenter.cpp"
121 121
122 122 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,45 +1,45
1 #ifndef PIEPRESENTATION_H
2 #define PIEPRESENTATION_H
1 #ifndef PIEPRESENTER_H
2 #define PIEPRESENTER_H
3 3
4 4 #include "chartitem_p.h"
5 5 #include "qpieseries.h"
6 6
7 7 class QGraphicsItem;
8 8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
9 9 class PieSlice;
10 10
11 class PiePresentation : public QObject, public ChartItem
11 class PiePresenter : public QObject, public ChartItem
12 12 {
13 13 Q_OBJECT
14 14
15 15 public:
16 16 // TODO: use a generic data class instead of x and y
17 PiePresentation(QGraphicsItem *parent, QPieSeries *series);
18 ~PiePresentation();
17 PiePresenter(QGraphicsItem *parent, QPieSeries *series);
18 ~PiePresenter();
19 19
20 20 public: // from ChartItem
21 21 void setSize(const QSizeF &size);
22 22 void setPlotDomain(const PlotDomain& data);
23 23 QRectF boundingRect() const { return m_rect; }
24 24 void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) {}
25 25
26 26 public:
27 27 void seriesChanged();
28 28 void resize();
29 29 QRectF pieRect() const { return m_pieRect; }
30 30
31 31 public Q_SLOTS:
32 32 void handleDomainChanged(const Domain& domain);
33 33 void handleGeometryChanged(const QRectF& rect);
34 34
35 35 private:
36 36 friend class PieSlice;
37 37 QList<PieSlice*> m_slices;
38 38 QPieSeries *m_pieSeries;
39 39 QRectF m_rect;
40 40 QRectF m_pieRect;
41 41 };
42 42
43 43 QTCOMMERCIALCHART_END_NAMESPACE
44 44
45 #endif // PIEPRESENTATION_H
45 #endif // PIEPRESENTER_H
@@ -1,91 +1,91
1 1 #include "pieslice.h"
2 #include "piepresentation.h"
2 #include "piepresenter.h"
3 3 #include <QPainter>
4 4 #include <QDebug>
5 5
6 6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7 7
8 PieSlice::PieSlice(PiePresentation *piePresentation, int seriesIndex, qreal startAngle, qreal span)
8 PieSlice::PieSlice(PiePresenter *piePresentation, int seriesIndex, qreal startAngle, qreal span)
9 9 :QGraphicsItem(piePresentation),
10 10 m_seriesIndex(seriesIndex),
11 11 m_startAngle(startAngle),
12 12 m_span(span)
13 13 {
14 14 Q_ASSERT(piePresentation);
15 15 setAcceptHoverEvents(true);
16 16 setAcceptedMouseButtons(Qt::LeftButton);
17 17 }
18 18
19 19 PieSlice::~PieSlice()
20 20 {
21 21 }
22 22
23 23 QRectF PieSlice::boundingRect() const
24 24 {
25 25 return shape().boundingRect();
26 26 }
27 27
28 28 QPainterPath PieSlice::shape() const
29 29 {
30 QRectF rect = (static_cast<PiePresentation*>(parentItem()))->pieRect();
30 QRectF rect = (static_cast<PiePresenter*>(parentItem()))->pieRect();
31 31 qreal angle = (-m_startAngle) + (90);
32 32 qreal span = -m_span;
33 33
34 34 QPainterPath path;
35 35 path.moveTo(rect.center());
36 36 path.arcTo(rect, angle, span);
37 37
38 38 // TODO: draw the shape so that it might have a hole in the center
39 39 // - Sin & Cos will be needed to find inner/outer arc endpoints
40 40
41 41 // dx, dy are offsets from the center
42 42 //qreal l = boundingRect().height();
43 43 //qreal dx = qSin(angle*(M_PI/180)) * l;
44 44 //qreal dy = qCos(angle*(M_PI/180)) * l;
45 45
46 46 // TODO: exploded slice?
47 47
48 48 return path;
49 49 }
50 50
51 51 void PieSlice::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/)
52 52 {
53 53 painter->setRenderHint(QPainter::Antialiasing);
54 54 // TODO: how to map theme settings to a pie slice? Now we
55 55 //painter->setPen(m_theme.linePen);
56 56 // TODO:
57 57
58 QPieSlice data = (static_cast<PiePresentation*>(parentItem()))->m_pieSeries->slice(m_seriesIndex);
58 QPieSlice data = (static_cast<PiePresenter*>(parentItem()))->m_pieSeries->slice(m_seriesIndex);
59 59 painter->setBrush(data.m_color);
60 60
61 61
62 62 //painter->setBrush(m_theme.linePen.color());
63 63
64 64 // From Qt docs:
65 65 // The startAngle and spanAngle must be specified in 1/16th of a degree, i.e. a full circle equals 5760 (16 * 360).
66 66 // Positive values for the angles mean counter-clockwise while negative values mean the clockwise direction.
67 67 // Zero degrees is at the 3 o'clock position.
68 68 //
69 69 // For sake of simplicity convert this so that zero degrees is at 12 o'clock and full circle is 360.
70 70 //qreal angle = (-m_startAngle*16) + (90*16);
71 71 //qreal span = -m_span*16;
72 72 //painter->drawPie(boundingRect(), angle, span);
73 73
74 74 painter->drawPath(shape());
75 75
76 76 // Draw the label
77 77 // TODO: do this better
78 78 painter->drawText(boundingRect().center(), data.m_label);
79 79 }
80 80
81 81 void PieSlice::hoverEnterEvent(QGraphicsSceneHoverEvent * event)
82 82 {
83 83 QGraphicsItem::hoverEnterEvent(event);
84 84 qDebug() << "hover" << m_seriesIndex << m_startAngle << m_span;
85 85 }
86 86
87 87 void PieSlice::mousePressEvent(QGraphicsSceneMouseEvent *event)
88 88 {
89 89 QGraphicsItem::mousePressEvent(event);
90 90 }
91 91 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,36 +1,36
1 1 #ifndef PIESLICE_H
2 2 #define PIESLICE_H
3 3
4 4 #include "qchartglobal.h"
5 5 #include "charttheme_p.h"
6 6 #include <QGraphicsItem>
7 7 #include <QRectF>
8 8 #include <QColor>
9 9
10 10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11 class PiePresentation;
11 class PiePresenter;
12 12
13 13 class PieSlice : public QGraphicsItem
14 14 {
15 15 public:
16 PieSlice(PiePresentation *piePresentation, int seriesIndex, qreal startAngle, qreal span);
16 PieSlice(PiePresenter *piePresentation, int seriesIndex, qreal startAngle, qreal span);
17 17 ~PieSlice();
18 18
19 19 public: // from QGraphicsItem
20 20 QRectF boundingRect() const;
21 21 QPainterPath shape() const;
22 22 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
23 23 void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
24 24 void mousePressEvent(QGraphicsSceneMouseEvent *event);
25 25
26 26 private:
27 27 int m_seriesIndex;
28 28 qreal m_startAngle;
29 29 qreal m_span;
30 30 QRectF m_rect;
31 31 //SeriesTheme m_theme;
32 32 };
33 33
34 34 QTCOMMERCIALCHART_END_NAMESPACE
35 35
36 36 #endif // PIESLICE_H
@@ -1,93 +1,93
1 1 #include "qpieseries.h"
2 #include "piepresentation.h"
2 #include "piepresenter.h"
3 3 #include "pieslice.h"
4 4 #include <QDebug>
5 5
6 6 QTCOMMERCIALCHART_BEGIN_NAMESPACE
7 7
8 8 QPieSeries::QPieSeries(QObject *parent) :
9 9 QChartSeries(parent),
10 m_piePresentation(0),
10 m_piePresenter(0),
11 11 m_sizeFactor(1.0),
12 12 m_position(PiePositionMaximized)
13 13 {
14 14 }
15 15
16 16 QPieSeries::~QPieSeries()
17 17 {
18 18
19 19 }
20 20
21 21 void QPieSeries::set(QList<QPieSlice> slices)
22 22 {
23 23 m_slices = slices;
24 if (m_piePresentation) {
25 m_piePresentation->seriesChanged();
26 m_piePresentation->update();
24 if (m_piePresenter) {
25 m_piePresenter->seriesChanged();
26 m_piePresenter->update();
27 27 }
28 28 }
29 29
30 30 void QPieSeries::add(QList<QPieSlice> slices)
31 31 {
32 32 m_slices += slices;
33 if (m_piePresentation) {
34 m_piePresentation->seriesChanged();
35 // TODO: m_piePresentation->seriesAppended()??
36 m_piePresentation->update();
33 if (m_piePresenter) {
34 m_piePresenter->seriesChanged();
35 // TODO: m_piePresenter->seriesAppended()??
36 m_piePresenter->update();
37 37 }
38 38 }
39 39
40 40 void QPieSeries::add(QPieSlice slice)
41 41 {
42 42 add(QList<QPieSlice>() << slice);
43 43 }
44 44
45 45 QPieSlice QPieSeries::slice(int index) const
46 46 {
47 47 if ((index >= 0) && (index < m_slices.count()))
48 48 return m_slices.at(index);
49 49 return QPieSlice();
50 50 }
51 51
52 52 bool QPieSeries::update(int index, QPieSlice slice)
53 53 {
54 54 if ((index >= 0) && (index < m_slices.count())) {
55 55 m_slices[index] = slice;
56 if (m_piePresentation) {
57 m_piePresentation->seriesChanged();
56 if (m_piePresenter) {
57 m_piePresenter->seriesChanged();
58 58 // TODO: for a nice animation we need something like
59 // m_piePresentation->sliceChanged(index, oldslice, newslice)
60 m_piePresentation->update();
59 // m_piePresenter->sliceChanged(index, oldslice, newslice)
60 m_piePresenter->update();
61 61 }
62 62 return true;
63 63 }
64 64 return false;
65 65 }
66 66
67 67 void QPieSeries::setSizeFactor(qreal factor)
68 68 {
69 69 if (factor > 0.0)
70 70 m_sizeFactor = factor;
71 71
72 if (m_piePresentation) {
73 m_piePresentation->resize();
74 m_piePresentation->update();
72 if (m_piePresenter) {
73 m_piePresenter->resize();
74 m_piePresenter->update();
75 75 // TODO: do we have to update the parent item also?
76 76 // - potential issue: what if this function is called from the parent context?
77 77 }
78 78 }
79 79
80 80 void QPieSeries::setPosition(PiePosition position)
81 81 {
82 82 m_position = position;
83 if (m_piePresentation) {
84 m_piePresentation->resize();
85 m_piePresentation->update();
83 if (m_piePresenter) {
84 m_piePresenter->resize();
85 m_piePresenter->update();
86 86 // TODO: do we have to update the parent item also?
87 87 // - potential issue: what if this function is called from the parent context?
88 88 }
89 89 }
90 90
91 91 #include "moc_qpieseries.cpp"
92 92
93 93 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,86 +1,86
1 1 #ifndef PIESERIES_H
2 2 #define PIESERIES_H
3 3
4 4 #include "qchartseries.h"
5 5 #include <QObject>
6 6 #include <QRectF>
7 7 #include <QColor>
8 8
9 9 class QGraphicsObject;
10 10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11 class PiePresentation;
11 class PiePresenter;
12 12 class PieSlice;
13 13
14 14 class QPieSlice
15 15 {
16 16 public:
17 17 QPieSlice()
18 18 :m_value(0), m_label("<empty>"), m_color(Qt::white), m_isExploded(false) {}
19 19
20 20 QPieSlice(qreal value, QString label, QColor color, bool exploded = false)
21 21 :m_value(value), m_label(label), m_color(color), m_isExploded(exploded) {}
22 22 public:
23 23 qreal m_value;
24 24 QString m_label;
25 25 QColor m_color;
26 26 bool m_isExploded;
27 27 };
28 28
29 29 class QTCOMMERCIALCHART_EXPORT QPieSeries : public QChartSeries
30 30 {
31 31 Q_OBJECT
32 32
33 33 public:
34 34 enum PiePosition {
35 35 PiePositionMaximized = 0,
36 36 PiePositionTopLeft,
37 37 PiePositionTopRight,
38 38 PiePositionBottomLeft,
39 39 PiePositionBottomRight
40 40 };
41 41
42 42 public:
43 43 QPieSeries(QObject *parent = 0);
44 44 ~QPieSeries();
45 45
46 46 public: // from QChartSeries
47 47 QChartSeriesType type() const { return QChartSeries::SeriesTypePie; }
48 48
49 49 public:
50 50 void set(QList<QPieSlice> slices);
51 51 void add(QList<QPieSlice> slices);
52 52 void add(QPieSlice slice);
53 53
54 54 int count() const { return m_slices.count(); }
55 55
56 56 QList<QPieSlice> slices() const { return m_slices; }
57 57 QPieSlice slice(int index) const;
58 58 bool update(int index, QPieSlice slice);
59 59
60 60 // TODO: convenience functions
61 61 //void updateValue(int sliceIndex, qreal value);
62 62 //void updateLabel(int sliceIndex, QString label);
63 63 //void updateColor(int sliceIndex, QColor color);
64 64 //void updateExploded(int slizeIndex, bool exploded);
65 65
66 66 void setSizeFactor(qreal sizeFactor);
67 67 qreal sizeFactor() const { return m_sizeFactor; }
68 68
69 69 void setPosition(PiePosition position);
70 70 PiePosition position() const { return m_position; }
71 71
72 72 private:
73 73 Q_DISABLE_COPY(QPieSeries)
74 74 // TODO: use PIML
75 75 friend class ChartPresenter;
76 76 friend class ChartDataSet;
77 friend class PiePresentation;
78 PiePresentation *m_piePresentation;
77 friend class PiePresenter;
78 PiePresenter *m_piePresenter;
79 79 QList<QPieSlice> m_slices;
80 80 qreal m_sizeFactor;
81 81 PiePosition m_position;
82 82 };
83 83
84 84 QTCOMMERCIALCHART_END_NAMESPACE
85 85
86 86 #endif // PIESERIES_H
@@ -1,114 +1,110
1 1 !include( ../common.pri ):error( Couldn't find the common.pri file! )
2 2 TARGET = QtCommercialChart
3 3 DESTDIR = $$CHART_BUILD_LIB_DIR
4 4 TEMPLATE = lib
5 5 QT += core \
6 6 gui
7 7 CONFIG += debug_and_release
8 8 CONFIG(debug, debug|release):TARGET = QtCommercialChartd
9 9 SOURCES += barchart/barchartseries.cpp \
10 10 barchart/bargroup.cpp \
11 11 barchart/bar.cpp \
12 12 barchart/stackedbarchartseries.cpp \
13 13 barchart/stackedbargroup.cpp \
14 14 barchart/percentbarchartseries.cpp \
15 15 barchart/percentbargroup.cpp \
16 16 barchart/barlabel.cpp \
17 17 linechart/linechartanimationitem.cpp \
18 18 linechart/linechartitem.cpp \
19 19 linechart/qlinechartseries.cpp \
20 piechart/qpieseries.cpp \
21 piechart/pieslice.cpp \
22 piechart/piepresentation.cpp \
23 20 barchart/separator.cpp \
24 21 barchart/bargroupbase.cpp \
25 22 barchart/barchartseriesbase.cpp \
26 23 plotdomain.cpp \
27 24 qscatterseries.cpp \
28 25 qchart.cpp \
29 26 axisitem.cpp \
30 27 qchartview.cpp \
31 28 qchartseries.cpp \
32 29 qchartaxis.cpp \
33 30 charttheme.cpp \
34 31 chartdataset.cpp \
35 32 chartpresenter.cpp \
36 33 domain.cpp
37 34 PRIVATE_HEADERS += linechart/linechartitem_p.h \
38 35 linechart/linechartanimationitem_p.h \
39 36 barchart/barlabel_p.h \
40 37 barchart/bar_p.h \
41 38 barchart/separator_p.h \
42 piechart/piepresentation.h \
43 piechart/pieslice.h \
44 39 plotdomain_p.h \
45 40 qscatterseries_p.h \
46 41 axisitem_p.h \
47 42 chartitem_p.h \
48 43 charttheme_p.h \
49 44 chartdataset_p.h \
50 45 chartpresenter_p.h \
51 46 domain_p.h
52 47 PUBLIC_HEADERS += linechart/qlinechartseries.h \
53 48 barchart/barchartseries.h \
54 49 barchart/bargroup.h \
55 50 barchart/stackedbarchartseries.h \
56 51 barchart/stackedbargroup.h \
57 52 barchart/percentbarchartseries.h \
58 53 barchart/percentbargroup.h \
59 54 barchart/barchartseriesbase.h \
60 55 barchart/bargroupbase.h \
61 piechart/qpieseries.h \
62 56 qchartseries.h \
63 57 qscatterseries.h \
64 58 qchart.h \
65 59 qchartglobal.h \
66 60 qchartview.h \
67 61 qchartaxis.h
62
63 include(piechart/piechart.pri)
64
68 65 THEMES += themes/chartthemeicy_p.h \
69 66 themes/chartthemegrayscale_p.h \
70 67 themes/chartthemescientific_p.h \
71 68 themes/chartthemevanilla_p.h
72 69 HEADERS += $$PUBLIC_HEADERS
73 70 HEADERS += $$PRIVATE_HEADERS
74 71 HEADERS += $$THEMES
75 72 INCLUDEPATH += linechart \
76 73 barchart \
77 piechart \
78 74 themes \
79 75 .
80 76 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
81 77 MOC_DIR = $$CHART_BUILD_DIR/lib
82 78 UI_DIR = $$CHART_BUILD_DIR/lib
83 79 RCC_DIR = $$CHART_BUILD_DIR/lib
84 80 DEFINES += QTCOMMERCIALCHART_LIBRARY
85 81 public_headers.path = $$[QT_INSTALL_HEADERS]/QtCommercialChart
86 82 public_headers.files = $$PUBLIC_HEADERS
87 83 target.path = $$[QT_INSTALL_LIBS]
88 84 INSTALLS += target \
89 85 public_headers
90 86 install_build_headers.name = bild_headers
91 87 install_build_headers.output = $$CHART_BUILD_HEADER_DIR/${QMAKE_FILE_BASE}.h
92 88 install_build_headers.input = PUBLIC_HEADERS
93 89 install_build_headers.commands = $$QMAKE_COPY \
94 90 ${QMAKE_FILE_NAME} \
95 91 $$CHART_BUILD_HEADER_DIR
96 92 install_build_headers.CONFIG += target_predeps \
97 93 no_link
98 94 QMAKE_EXTRA_COMPILERS += install_build_headers
99 95 chartversion.target = qchartversion_p.h
100 96 chartversion.commands = @echo \
101 97 "build_time" \
102 98 > \
103 99 $$chartversion.target;
104 100 chartversion.depends = $$HEADERS \
105 101 $$SOURCES
106 102 PRE_TARGETDEPS += qchartversion_p.h
107 103 QMAKE_CLEAN += qchartversion_p.h
108 104 QMAKE_EXTRA_TARGETS += chartversion
109 105 unix:QMAKE_DISTCLEAN += -r \
110 106 $$CHART_BUILD_HEADER_DIR \
111 107 $$CHART_BUILD_LIB_DIR
112 108 win32:QMAKE_DISTCLEAN += /Q \
113 109 $$CHART_BUILD_HEADER_DIR \
114 110 $$CHART_BUILD_LIB_DIR
General Comments 0
You need to be logged in to leave comments. Login now