@@ -48,7 +48,9 void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY) | |||||
48 | { |
|
48 | { | |
49 | if(axisY==0) axisY = m_axisY; |
|
49 | if(axisY==0) axisY = m_axisY; | |
50 |
|
50 | |||
51 | if (seriesIndex(series) > -1) { |
|
51 | QChartAxis* axis = m_seriesAxisMap.value(series); | |
|
52 | ||||
|
53 | if(axis) { | |||
52 | qWarning() << "Can not add series. Series already on the chart"; |
|
54 | qWarning() << "Can not add series. Series already on the chart"; | |
53 | return; |
|
55 | return; | |
54 | } |
|
56 | } | |
@@ -62,7 +64,8 void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY) | |||||
62 | } |
|
64 | } | |
63 |
|
65 | |||
64 | Domain* domain = m_axisDomainMap.value(axisY); |
|
66 | Domain* domain = m_axisDomainMap.value(axisY); | |
65 | if (!domain) { |
|
67 | ||
|
68 | if(!domain) { | |||
66 | domain = new Domain(axisY); |
|
69 | domain = new Domain(axisY); | |
67 | QObject::connect(axisY,SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisYChanged(qreal,qreal,int,bool))); |
|
70 | QObject::connect(axisY,SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisYChanged(qreal,qreal,int,bool))); | |
68 | QObject::connect(axisX(),SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisXChanged(qreal,qreal,int,bool))); |
|
71 | QObject::connect(axisX(),SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisXChanged(qreal,qreal,int,bool))); | |
@@ -73,75 +76,88 void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY) | |||||
73 | emit axisAdded(axisY,domain); |
|
76 | emit axisAdded(axisY,domain); | |
74 | } |
|
77 | } | |
75 |
|
78 | |||
76 |
if |
|
79 | if(!m_axisXInitialized){ | |
77 |
emit axisAdded(axisX(), |
|
80 | emit axisAdded(axisX(),domain); | |
78 |
m_axisXInitialized |
|
81 | m_axisXInitialized=true; | |
79 | } |
|
82 | } | |
80 |
|
83 | |||
81 |
calculateDomain(series, |
|
84 | calculateDomain(series,domain); | |
82 |
|
85 | |||
83 |
m_seriesAxis |
|
86 | m_seriesAxisMap.insert(series,axisY); | |
|
87 | ||||
|
88 | QMapIterator<int, QSeries*> i(m_indexSeriesMap); | |||
|
89 | ||||
|
90 | int key=0; | |||
|
91 | while (i.hasNext()) { | |||
|
92 | i.next(); | |||
|
93 | if(i.key()!=key) { | |||
|
94 | break; | |||
|
95 | } | |||
|
96 | key++; | |||
|
97 | } | |||
|
98 | ||||
|
99 | m_indexSeriesMap.insert(key,series); | |||
|
100 | ||||
|
101 | emit seriesAdded(series,domain); | |||
84 |
|
102 | |||
85 | emit seriesAdded(series, domain); |
|
|||
86 | } |
|
103 | } | |
87 |
|
104 | |||
88 | void ChartDataSet::removeSeries(QSeries* series) |
|
105 | void ChartDataSet::removeSeries(QSeries* series) | |
89 | { |
|
106 | { | |
90 | int index = seriesIndex(series); |
|
107 | ||
91 | if (index < 0) { |
|
108 | QChartAxis* axis = m_seriesAxisMap.value(series); | |
92 | qWarning() << "Can not remove series. Series not found on the chart."; |
|
109 | ||
|
110 | if(!axis){ | |||
|
111 | qWarning()<<"Can not remove series. Series not found on the chart."; | |||
93 | return; |
|
112 | return; | |
94 | } |
|
113 | } | |
|
114 | emit seriesRemoved(series); | |||
|
115 | m_seriesAxisMap.remove(series); | |||
|
116 | int key = seriesIndex(series); | |||
|
117 | Q_ASSERT(key!=-1); | |||
95 |
|
118 | |||
96 | // Remove the series and the axis from the container |
|
119 | m_indexSeriesMap.remove(key); | |
97 | QChartAxis* axis = m_seriesAxisList.at(index).second; |
|
|||
98 | m_seriesAxisList.removeAt(index); |
|
|||
99 |
|
120 | |||
100 | // Delete the series |
|
121 | if(series->parent()==this){ | |
101 | emit seriesRemoved(series); |
|
|||
102 | if (series->parent() == this) { |
|
|||
103 | delete series; |
|
122 | delete series; | |
104 |
series |
|
123 | series=0; | |
105 | } |
|
124 | } | |
106 |
|
125 | |||
107 | // Check if the Y axis is still in use |
|
126 | QList<QChartAxis*> axes = m_seriesAxisMap.values(); | |
108 | bool yAxisInUse(false); |
|
127 | ||
109 | for (int i(0); i < m_seriesAxisList.count(); i++) { |
|
128 | int i = axes.indexOf(axis); | |
110 | QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.at(i); |
|
|||
111 | if (pair.second == axis) |
|
|||
112 | yAxisInUse = true; |
|
|||
113 | } |
|
|||
114 |
|
129 | |||
115 | // Remove the Y axis if not in use |
|
130 | if(i==-1){ | |
116 | if (!yAxisInUse) { |
|
|||
117 | Domain* domain = m_axisDomainMap.take(axis); |
|
131 | Domain* domain = m_axisDomainMap.take(axis); | |
118 | emit axisRemoved(axis); |
|
132 | emit axisRemoved(axis); | |
119 |
if |
|
133 | if(axis!=axisY()){ | |
120 | // Delete the Y axis unless it is the default one |
|
134 | if(axis->parent()==this){ | |
121 | if (axis->parent() == this) { |
|
|||
122 | delete axis; |
|
135 | delete axis; | |
123 |
axis |
|
136 | axis=0; | |
124 | } |
|
137 | } | |
125 | } |
|
138 | } | |
126 | delete domain; |
|
139 | delete domain; | |
127 | } |
|
140 | } | |
128 |
|
141 | |||
129 | // Remove the x axis in case there are no y-axes left |
|
142 | if(m_seriesAxisMap.values().size()==0) | |
130 | if (m_seriesAxisList.count() == 0) { |
|
143 | { | |
131 |
m_axisXInitialized |
|
144 | m_axisXInitialized=false; | |
132 | emit axisRemoved(axisX()); |
|
145 | emit axisRemoved(axisX()); | |
133 | } |
|
146 | } | |
134 | } |
|
147 | } | |
135 |
|
148 | |||
136 | void ChartDataSet::removeAllSeries() |
|
149 | void ChartDataSet::removeAllSeries() | |
137 | { |
|
150 | { | |
138 | while (m_seriesAxisList.count()) { |
|
151 | ||
139 |
|
|
152 | QList<QSeries*> series = m_seriesAxisMap.keys(); | |
140 | removeSeries(pair.first); |
|
153 | ||
|
154 | foreach(QSeries* s , series) { | |||
|
155 | removeSeries(s); | |||
141 | } |
|
156 | } | |
142 |
|
157 | |||
143 |
Q_ASSERT(m_seriesAxis |
|
158 | Q_ASSERT(m_seriesAxisMap.count()==0); | |
144 |
Q_ASSERT(m_axisDomainMap.count() |
|
159 | Q_ASSERT(m_axisDomainMap.count()==0); | |
|
160 | ||||
145 | } |
|
161 | } | |
146 |
|
162 | |||
147 | //to be removed with PIMPL |
|
163 | //to be removed with PIMPL | |
@@ -285,30 +301,41 void ChartDataSet::zoomOutDomain(const QRectF& rect, const QSizeF& size) | |||||
285 | } |
|
301 | } | |
286 | } |
|
302 | } | |
287 |
|
303 | |||
288 |
int ChartDataSet::series |
|
304 | int ChartDataSet::seriesCount(QSeries::QSeriesType type) | |
|
305 | { | |||
|
306 | int count=0; | |||
|
307 | QMapIterator<QSeries*, QChartAxis*> i(m_seriesAxisMap); | |||
|
308 | while (i.hasNext()) { | |||
|
309 | i.next(); | |||
|
310 | if(i.key()->type()==type) count++; | |||
|
311 | } | |||
|
312 | return count; | |||
|
313 | } | |||
|
314 | ||||
|
315 | int ChartDataSet::seriesIndex(QSeries *series) | |||
289 | { |
|
316 | { | |
290 | for (int i(0); i < m_seriesAxisList.count(); i++) { |
|
317 | QMapIterator<int, QSeries*> i(m_indexSeriesMap); | |
291 | QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.at(i); |
|
318 | while (i.hasNext()) { | |
292 | if (pair.first == series) |
|
319 | i.next(); | |
293 | return i; |
|
320 | if (i.value() == series) | |
|
321 | return i.key(); | |||
294 | } |
|
322 | } | |
295 | return -1; |
|
323 | return -1; | |
296 | } |
|
324 | } | |
297 |
|
325 | |||
298 | QChartAxis* ChartDataSet::axisY(QSeries* series) const |
|
326 | QChartAxis* ChartDataSet::axisY(QSeries* series) const | |
299 | { |
|
327 | { | |
300 |
if |
|
328 | if(series == 0) return m_axisY; | |
301 | return m_axisY; |
|
329 | return m_seriesAxisMap.value(series); | |
302 |
|
||||
303 | return m_seriesAxisList.at(seriesIndex(series)).second; |
|
|||
304 | } |
|
330 | } | |
305 |
|
331 | |||
306 | Domain* ChartDataSet::domain(QSeries* series) const |
|
332 | Domain* ChartDataSet::domain(QSeries* series) const | |
307 | { |
|
333 | { | |
308 |
|
|
334 | QChartAxis* axis = m_seriesAxisMap.value(series); | |
309 |
|
|
335 | if(axis){ | |
310 | return m_axisDomainMap.value(axis); |
|
336 | return m_axisDomainMap.value(axis); | |
311 | return 0; |
|
337 | }else | |
|
338 | return 0; | |||
312 | } |
|
339 | } | |
313 |
|
340 | |||
314 | Domain* ChartDataSet::domain(QChartAxis* axis) const |
|
341 | Domain* ChartDataSet::domain(QChartAxis* axis) const |
@@ -54,7 +54,8 public: | |||||
54 | void zoomOutDomain(const QRectF& rect, const QSizeF& size); |
|
54 | void zoomOutDomain(const QRectF& rect, const QSizeF& size); | |
55 | void scrollDomain(int dx,int dy,const QSizeF& size); |
|
55 | void scrollDomain(int dx,int dy,const QSizeF& size); | |
56 |
|
56 | |||
57 |
int series |
|
57 | int seriesCount(QSeries::QSeriesType type); | |
|
58 | int seriesIndex(QSeries *series); | |||
58 |
|
59 | |||
59 | Domain* domain(QSeries* series) const; |
|
60 | Domain* domain(QSeries* series) const; | |
60 | Domain* domain(QChartAxis* axis) const; |
|
61 | Domain* domain(QChartAxis* axis) const; | |
@@ -74,8 +75,9 private: | |||||
74 | void setupCategories(QBarSeries* series); |
|
75 | void setupCategories(QBarSeries* series); | |
75 |
|
76 | |||
76 | private: |
|
77 | private: | |
77 |
Q |
|
78 | QMap<QSeries*, QChartAxis*> m_seriesAxisMap; | |
78 | QMap<QChartAxis*, Domain*> m_axisDomainMap; |
|
79 | QMap<QChartAxis*, Domain*> m_axisDomainMap; | |
|
80 | QMap<int,QSeries*> m_indexSeriesMap; | |||
79 | QChartAxis* m_axisX; |
|
81 | QChartAxis* m_axisX; | |
80 | QChartAxis* m_axisY; |
|
82 | QChartAxis* m_axisY; | |
81 |
|
83 |
@@ -52,6 +52,8 private Q_SLOTS: | |||||
52 | void removeAllSeries(); |
|
52 | void removeAllSeries(); | |
53 | void axisY_data(); |
|
53 | void axisY_data(); | |
54 | void axisY(); |
|
54 | void axisY(); | |
|
55 | void seriesCount_data(); | |||
|
56 | void seriesCount(); | |||
55 | void seriesIndex_data(); |
|
57 | void seriesIndex_data(); | |
56 | void seriesIndex(); |
|
58 | void seriesIndex(); | |
57 | void domain_data(); |
|
59 | void domain_data(); | |
@@ -95,6 +97,8 void tst_ChartDataSet::chartdataset() | |||||
95 | //check if not dangling pointer |
|
97 | //check if not dangling pointer | |
96 | dataSet.axisX()->objectName(); |
|
98 | dataSet.axisX()->objectName(); | |
97 | dataSet.axisY()->objectName(); |
|
99 | dataSet.axisY()->objectName(); | |
|
100 | QLineSeries* series = new QLineSeries(this); | |||
|
101 | QCOMPARE(dataSet.seriesIndex(series),-1); | |||
98 | } |
|
102 | } | |
99 |
|
103 | |||
100 | void tst_ChartDataSet::addSeries_data() |
|
104 | void tst_ChartDataSet::addSeries_data() | |
@@ -259,6 +263,40 void tst_ChartDataSet::axisY() | |||||
259 |
|
263 | |||
260 | } |
|
264 | } | |
261 |
|
265 | |||
|
266 | void tst_ChartDataSet::seriesCount_data() | |||
|
267 | { | |||
|
268 | addSeries_data(); | |||
|
269 | } | |||
|
270 | ||||
|
271 | void tst_ChartDataSet::seriesCount() | |||
|
272 | { | |||
|
273 | QFETCH(QLineSeries*, series0); | |||
|
274 | QFETCH(QChartAxis*, axis0); | |||
|
275 | QFETCH(QLineSeries*, series1); | |||
|
276 | QFETCH(QChartAxis*, axis1); | |||
|
277 | QFETCH(QLineSeries*, series2); | |||
|
278 | QFETCH(QChartAxis*, axis2); | |||
|
279 | QFETCH(int, axisCount); | |||
|
280 | Q_UNUSED(axisCount); | |||
|
281 | ||||
|
282 | ChartDataSet dataSet; | |||
|
283 | ||||
|
284 | dataSet.addSeries(series0, axis0); | |||
|
285 | dataSet.addSeries(series1, axis1); | |||
|
286 | dataSet.addSeries(series2, axis2); | |||
|
287 | ||||
|
288 | QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*,Domain*))); | |||
|
289 | QSignalSpy spy1(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); | |||
|
290 | QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*))); | |||
|
291 | QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*))); | |||
|
292 | ||||
|
293 | QCOMPARE(dataSet.seriesCount(series0->type()),3); | |||
|
294 | QCOMPARE(spy0.count(), 0); | |||
|
295 | QCOMPARE(spy1.count(), 0); | |||
|
296 | QCOMPARE(spy2.count(), 0); | |||
|
297 | QCOMPARE(spy3.count(), 0); | |||
|
298 | } | |||
|
299 | ||||
262 | void tst_ChartDataSet::seriesIndex_data() |
|
300 | void tst_ChartDataSet::seriesIndex_data() | |
263 | { |
|
301 | { | |
264 | addSeries_data(); |
|
302 | addSeries_data(); | |
@@ -266,6 +304,8 void tst_ChartDataSet::seriesIndex_data() | |||||
266 |
|
304 | |||
267 | void tst_ChartDataSet::seriesIndex() |
|
305 | void tst_ChartDataSet::seriesIndex() | |
268 | { |
|
306 | { | |
|
307 | //TODO: rewrite this series_index_data to match better | |||
|
308 | ||||
269 | QFETCH(QLineSeries*, series0); |
|
309 | QFETCH(QLineSeries*, series0); | |
270 | QFETCH(QChartAxis*, axis0); |
|
310 | QFETCH(QChartAxis*, axis0); | |
271 | QFETCH(QLineSeries*, series1); |
|
311 | QFETCH(QLineSeries*, series1); | |
@@ -286,18 +326,62 void tst_ChartDataSet::seriesIndex() | |||||
286 | QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*))); |
|
326 | QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*))); | |
287 | QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*))); |
|
327 | QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*))); | |
288 |
|
328 | |||
289 |
|
|
329 | QCOMPARE(dataSet.seriesIndex(series0),0); | |
290 |
|
|
330 | QCOMPARE(dataSet.seriesIndex(series1),1); | |
291 |
|
|
331 | QCOMPARE(dataSet.seriesIndex(series2),2); | |
292 |
|
||||
293 | QVERIFY(i1!=i2); |
|
|||
294 | QVERIFY(i0!=i2); |
|
|||
295 | QVERIFY(i0!=i1); |
|
|||
296 |
|
332 | |||
297 | QCOMPARE(spy0.count(), 0); |
|
333 | QCOMPARE(spy0.count(), 0); | |
298 | QCOMPARE(spy1.count(), 0); |
|
334 | QCOMPARE(spy1.count(), 0); | |
299 | QCOMPARE(spy2.count(), 0); |
|
335 | QCOMPARE(spy2.count(), 0); | |
300 | QCOMPARE(spy3.count(), 0); |
|
336 | QCOMPARE(spy3.count(), 0); | |
|
337 | ||||
|
338 | dataSet.removeSeries(series0); | |||
|
339 | dataSet.removeSeries(series1); | |||
|
340 | dataSet.removeSeries(series2); | |||
|
341 | ||||
|
342 | QCOMPARE(dataSet.seriesIndex(series0),-1); | |||
|
343 | QCOMPARE(dataSet.seriesIndex(series1),-1); | |||
|
344 | QCOMPARE(dataSet.seriesIndex(series2),-1); | |||
|
345 | ||||
|
346 | dataSet.addSeries(series0, axis0); | |||
|
347 | dataSet.addSeries(series1, axis1); | |||
|
348 | dataSet.addSeries(series2, axis2); | |||
|
349 | ||||
|
350 | QCOMPARE(dataSet.seriesIndex(series0),0); | |||
|
351 | QCOMPARE(dataSet.seriesIndex(series1),1); | |||
|
352 | QCOMPARE(dataSet.seriesIndex(series2),2); | |||
|
353 | ||||
|
354 | dataSet.removeSeries(series1); | |||
|
355 | ||||
|
356 | QCOMPARE(dataSet.seriesIndex(series0),0); | |||
|
357 | QCOMPARE(dataSet.seriesIndex(series1),-1); | |||
|
358 | QCOMPARE(dataSet.seriesIndex(series2),2); | |||
|
359 | ||||
|
360 | dataSet.addSeries(series1, axis1); | |||
|
361 | QCOMPARE(dataSet.seriesIndex(series0),0); | |||
|
362 | QCOMPARE(dataSet.seriesIndex(series1),1); | |||
|
363 | QCOMPARE(dataSet.seriesIndex(series2),2); | |||
|
364 | ||||
|
365 | dataSet.removeSeries(series2); | |||
|
366 | QCOMPARE(dataSet.seriesIndex(series0),0); | |||
|
367 | QCOMPARE(dataSet.seriesIndex(series1),1); | |||
|
368 | QCOMPARE(dataSet.seriesIndex(series2),-1); | |||
|
369 | ||||
|
370 | dataSet.removeSeries(series0); | |||
|
371 | QCOMPARE(dataSet.seriesIndex(series0),-1); | |||
|
372 | QCOMPARE(dataSet.seriesIndex(series1),1); | |||
|
373 | QCOMPARE(dataSet.seriesIndex(series2),-1); | |||
|
374 | ||||
|
375 | dataSet.addSeries(series2); | |||
|
376 | QCOMPARE(dataSet.seriesIndex(series0),-1); | |||
|
377 | QCOMPARE(dataSet.seriesIndex(series1),1); | |||
|
378 | QCOMPARE(dataSet.seriesIndex(series2),0); | |||
|
379 | ||||
|
380 | dataSet.addSeries(series0); | |||
|
381 | QCOMPARE(dataSet.seriesIndex(series0),2); | |||
|
382 | QCOMPARE(dataSet.seriesIndex(series1),1); | |||
|
383 | QCOMPARE(dataSet.seriesIndex(series2),0); | |||
|
384 | ||||
301 | } |
|
385 | } | |
302 |
|
386 | |||
303 | void tst_ChartDataSet::domain_data() |
|
387 | void tst_ChartDataSet::domain_data() |
@@ -230,7 +230,6 void MainWidget::addSeries(QString seriesName, int columnCount, int rowCount, QS | |||||
230 | for (int j(0); j < data.count(); j ++) { |
|
230 | for (int j(0); j < data.count(); j ++) { | |
231 | QList<qreal> column = data.at(j); |
|
231 | QList<qreal> column = data.at(j); | |
232 | QLineSeries *series = new QLineSeries(); |
|
232 | QLineSeries *series = new QLineSeries(); | |
233 | series->setName("line" + QString::number(j)); |
|
|||
234 | for (int i(0); i < column.count(); i++) |
|
233 | for (int i(0); i < column.count(); i++) | |
235 | series->append(i, column.at(i)); |
|
234 | series->append(i, column.at(i)); | |
236 | m_chart->addSeries(series); |
|
235 | m_chart->addSeries(series); | |
@@ -243,14 +242,12 void MainWidget::addSeries(QString seriesName, int columnCount, int rowCount, QS | |||||
243 | for (int i(0); i < column.count(); i++) |
|
242 | for (int i(0); i < column.count(); i++) | |
244 | lineSeries->append(i, column.at(i)); |
|
243 | lineSeries->append(i, column.at(i)); | |
245 | QAreaSeries *areaSeries = new QAreaSeries(lineSeries); |
|
244 | QAreaSeries *areaSeries = new QAreaSeries(lineSeries); | |
246 | areaSeries->setName("area" + QString::number(j)); |
|
|||
247 | m_chart->addSeries(areaSeries); |
|
245 | m_chart->addSeries(areaSeries); | |
248 | } |
|
246 | } | |
249 | } else if (seriesName == "Scatter") { |
|
247 | } else if (seriesName == "Scatter") { | |
250 | for (int j(0); j < data.count(); j++) { |
|
248 | for (int j(0); j < data.count(); j++) { | |
251 | QList<qreal> column = data.at(j); |
|
249 | QList<qreal> column = data.at(j); | |
252 | QScatterSeries *series = new QScatterSeries(); |
|
250 | QScatterSeries *series = new QScatterSeries(); | |
253 | series->setName("scatter" + QString::number(j)); |
|
|||
254 | for (int i(0); i < column.count(); i++) |
|
251 | for (int i(0); i < column.count(); i++) | |
255 | series->append(i, column.at(i)); |
|
252 | series->append(i, column.at(i)); | |
256 | m_chart->addSeries(series); |
|
253 | m_chart->addSeries(series); |
General Comments 0
You need to be logged in to leave comments.
Login now