##// 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 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 54 qWarning() << "Can not add series. Series already on the chart";
53 55 return;
54 56 }
@@ -62,7 +64,8 void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY)
62 64 }
63 65
64 66 Domain* domain = m_axisDomainMap.value(axisY);
65 if (!domain) {
67
68 if(!domain) {
66 69 domain = new Domain(axisY);
67 70 QObject::connect(axisY,SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisYChanged(qreal,qreal,int,bool)));
68 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 76 emit axisAdded(axisY,domain);
74 77 }
75 78
76 if (!m_axisXInitialized) {
77 emit axisAdded(axisX(), domain);
78 m_axisXInitialized = true;
79 if(!m_axisXInitialized){
80 emit axisAdded(axisX(),domain);
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 105 void ChartDataSet::removeSeries(QSeries* series)
89 106 {
90 int index = seriesIndex(series);
91 if (index < 0) {
92 qWarning() << "Can not remove series. Series not found on the chart.";
107
108 QChartAxis* axis = m_seriesAxisMap.value(series);
109
110 if(!axis){
111 qWarning()<<"Can not remove series. Series not found on the chart.";
93 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
97 QChartAxis* axis = m_seriesAxisList.at(index).second;
98 m_seriesAxisList.removeAt(index);
119 m_indexSeriesMap.remove(key);
99 120
100 // Delete the series
101 emit seriesRemoved(series);
102 if (series->parent() == this) {
121 if(series->parent()==this){
103 122 delete series;
104 series = 0;
123 series=0;
105 124 }
106 125
107 // Check if the Y axis is still in use
108 bool yAxisInUse(false);
109 for (int i(0); i < m_seriesAxisList.count(); i++) {
110 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.at(i);
111 if (pair.second == axis)
112 yAxisInUse = true;
113 }
126 QList<QChartAxis*> axes = m_seriesAxisMap.values();
127
128 int i = axes.indexOf(axis);
114 129
115 // Remove the Y axis if not in use
116 if (!yAxisInUse) {
130 if(i==-1){
117 131 Domain* domain = m_axisDomainMap.take(axis);
118 132 emit axisRemoved(axis);
119 if (axis != axisY()) {
120 // Delete the Y axis unless it is the default one
121 if (axis->parent() == this) {
133 if(axis!=axisY()){
134 if(axis->parent()==this){
122 135 delete axis;
123 axis = 0;
136 axis=0;
124 137 }
125 138 }
126 139 delete domain;
127 140 }
128 141
129 // Remove the x axis in case there are no y-axes left
130 if (m_seriesAxisList.count() == 0) {
131 m_axisXInitialized = false;
142 if(m_seriesAxisMap.values().size()==0)
143 {
144 m_axisXInitialized=false;
132 145 emit axisRemoved(axisX());
133 146 }
134 147 }
135 148
136 149 void ChartDataSet::removeAllSeries()
137 150 {
138 while (m_seriesAxisList.count()) {
139 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.last();
140 removeSeries(pair.first);
151
152 QList<QSeries*> series = m_seriesAxisMap.keys();
153
154 foreach(QSeries* s , series) {
155 removeSeries(s);
141 156 }
142 157
143 Q_ASSERT(m_seriesAxisList.count() == 0);
144 Q_ASSERT(m_axisDomainMap.count() == 0);
158 Q_ASSERT(m_seriesAxisMap.count()==0);
159 Q_ASSERT(m_axisDomainMap.count()==0);
160
145 161 }
146 162
147 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++) {
291 QPair<QSeries *, QChartAxis *> pair = m_seriesAxisList.at(i);
292 if (pair.first == series)
293 return i;
317 QMapIterator<int, QSeries*> i(m_indexSeriesMap);
318 while (i.hasNext()) {
319 i.next();
320 if (i.value() == series)
321 return i.key();
294 322 }
295 323 return -1;
296 324 }
297 325
298 326 QChartAxis* ChartDataSet::axisY(QSeries* series) const
299 327 {
300 if (series == 0)
301 return m_axisY;
302
303 return m_seriesAxisList.at(seriesIndex(series)).second;
328 if(series == 0) return m_axisY;
329 return m_seriesAxisMap.value(series);
304 330 }
305 331
306 332 Domain* ChartDataSet::domain(QSeries* series) const
307 333 {
308 QChartAxis* axis = m_seriesAxisList.at(seriesIndex(series)).second;
309 if (axis)
334 QChartAxis* axis = m_seriesAxisMap.value(series);
335 if(axis){
310 336 return m_axisDomainMap.value(axis);
311 return 0;
337 }else
338 return 0;
312 339 }
313 340
314 341 Domain* ChartDataSet::domain(QChartAxis* axis) const
@@ -54,7 +54,8 public:
54 54 void zoomOutDomain(const QRectF& rect, const QSizeF& size);
55 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 60 Domain* domain(QSeries* series) const;
60 61 Domain* domain(QChartAxis* axis) const;
@@ -74,8 +75,9 private:
74 75 void setupCategories(QBarSeries* series);
75 76
76 77 private:
77 QList<QPair<QSeries*, QChartAxis*> > m_seriesAxisList;
78 QMap<QSeries*, QChartAxis*> m_seriesAxisMap;
78 79 QMap<QChartAxis*, Domain*> m_axisDomainMap;
80 QMap<int,QSeries*> m_indexSeriesMap;
79 81 QChartAxis* m_axisX;
80 82 QChartAxis* m_axisY;
81 83
@@ -52,6 +52,8 private Q_SLOTS:
52 52 void removeAllSeries();
53 53 void axisY_data();
54 54 void axisY();
55 void seriesCount_data();
56 void seriesCount();
55 57 void seriesIndex_data();
56 58 void seriesIndex();
57 59 void domain_data();
@@ -95,6 +97,8 void tst_ChartDataSet::chartdataset()
95 97 //check if not dangling pointer
96 98 dataSet.axisX()->objectName();
97 99 dataSet.axisY()->objectName();
100 QLineSeries* series = new QLineSeries(this);
101 QCOMPARE(dataSet.seriesIndex(series),-1);
98 102 }
99 103
100 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 300 void tst_ChartDataSet::seriesIndex_data()
263 301 {
264 302 addSeries_data();
@@ -266,6 +304,8 void tst_ChartDataSet::seriesIndex_data()
266 304
267 305 void tst_ChartDataSet::seriesIndex()
268 306 {
307 //TODO: rewrite this series_index_data to match better
308
269 309 QFETCH(QLineSeries*, series0);
270 310 QFETCH(QChartAxis*, axis0);
271 311 QFETCH(QLineSeries*, series1);
@@ -286,18 +326,62 void tst_ChartDataSet::seriesIndex()
286 326 QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*)));
287 327 QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*)));
288 328
289 int i0 = dataSet.seriesIndex(series0);
290 int i1 = dataSet.seriesIndex(series1);
291 int i2 = dataSet.seriesIndex(series2);
292
293 QVERIFY(i1!=i2);
294 QVERIFY(i0!=i2);
295 QVERIFY(i0!=i1);
329 QCOMPARE(dataSet.seriesIndex(series0),0);
330 QCOMPARE(dataSet.seriesIndex(series1),1);
331 QCOMPARE(dataSet.seriesIndex(series2),2);
296 332
297 333 QCOMPARE(spy0.count(), 0);
298 334 QCOMPARE(spy1.count(), 0);
299 335 QCOMPARE(spy2.count(), 0);
300 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 387 void tst_ChartDataSet::domain_data()
@@ -230,7 +230,6 void MainWidget::addSeries(QString seriesName, int columnCount, int rowCount, QS
230 230 for (int j(0); j < data.count(); j ++) {
231 231 QList<qreal> column = data.at(j);
232 232 QLineSeries *series = new QLineSeries();
233 series->setName("line" + QString::number(j));
234 233 for (int i(0); i < column.count(); i++)
235 234 series->append(i, column.at(i));
236 235 m_chart->addSeries(series);
@@ -243,14 +242,12 void MainWidget::addSeries(QString seriesName, int columnCount, int rowCount, QS
243 242 for (int i(0); i < column.count(); i++)
244 243 lineSeries->append(i, column.at(i));
245 244 QAreaSeries *areaSeries = new QAreaSeries(lineSeries);
246 areaSeries->setName("area" + QString::number(j));
247 245 m_chart->addSeries(areaSeries);
248 246 }
249 247 } else if (seriesName == "Scatter") {
250 248 for (int j(0); j < data.count(); j++) {
251 249 QList<qreal> column = data.at(j);
252 250 QScatterSeries *series = new QScatterSeries();
253 series->setName("scatter" + QString::number(j));
254 251 for (int i(0); i < column.count(); i++)
255 252 series->append(i, column.at(i));
256 253 m_chart->addSeries(series);
General Comments 0
You need to be logged in to leave comments. Login now