##// END OF EJS Templates
Fix indexing issue of series
Michal Klocek -
r910:f9205f6fdebb
parent child
Show More
@@ -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 (!m_axisXInitialized) {
79 if(!m_axisXInitialized){
77 emit axisAdded(axisX(), domain);
80 emit axisAdded(axisX(),domain);
78 m_axisXInitialized = true;
81 m_axisXInitialized=true;
79 }
82 }
80
83
81 calculateDomain(series, domain);
84 calculateDomain(series,domain);
82
85
83 m_seriesAxisList.append(QPair<QSeries*, QChartAxis*>(series, axisY));
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 = 0;
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 (axis != axisY()) {
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 = 0;
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 = false;
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 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.last();
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_seriesAxisList.count() == 0);
158 Q_ASSERT(m_seriesAxisMap.count()==0);
144 Q_ASSERT(m_axisDomainMap.count() == 0);
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::seriesIndex(QSeries *series) const
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 (series == 0)
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 QChartAxis* axis = m_seriesAxisList.at(seriesIndex(series)).second;
334 QChartAxis* axis = m_seriesAxisMap.value(series);
309 if (axis)
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 seriesIndex(QSeries *series) const;
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 QList<QPair<QSeries*, QChartAxis*> > m_seriesAxisList;
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 int i0 = dataSet.seriesIndex(series0);
329 QCOMPARE(dataSet.seriesIndex(series0),0);
290 int i1 = dataSet.seriesIndex(series1);
330 QCOMPARE(dataSet.seriesIndex(series1),1);
291 int i2 = dataSet.seriesIndex(series2);
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