diff --git a/src/chartdataset.cpp b/src/chartdataset.cpp index 816c673..77bce9b 100644 --- a/src/chartdataset.cpp +++ b/src/chartdataset.cpp @@ -48,7 +48,9 @@ void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY) { if(axisY==0) axisY = m_axisY; - if (seriesIndex(series) > -1) { + QChartAxis* axis = m_seriesAxisMap.value(series); + + if(axis) { qWarning() << "Can not add series. Series already on the chart"; return; } @@ -62,7 +64,8 @@ void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY) } Domain* domain = m_axisDomainMap.value(axisY); - if (!domain) { + + if(!domain) { domain = new Domain(axisY); QObject::connect(axisY,SIGNAL(changed(qreal,qreal,int,bool)),domain,SLOT(handleAxisYChanged(qreal,qreal,int,bool))); 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) emit axisAdded(axisY,domain); } - if (!m_axisXInitialized) { - emit axisAdded(axisX(), domain); - m_axisXInitialized = true; + if(!m_axisXInitialized){ + emit axisAdded(axisX(),domain); + m_axisXInitialized=true; } - calculateDomain(series, domain); + calculateDomain(series,domain); - m_seriesAxisList.append(QPair(series, axisY)); + m_seriesAxisMap.insert(series,axisY); + + QMapIterator i(m_indexSeriesMap); + + int key=0; + while (i.hasNext()) { + i.next(); + if(i.key()!=key) { + break; + } + key++; + } + + m_indexSeriesMap.insert(key,series); + + emit seriesAdded(series,domain); - emit seriesAdded(series, domain); } void ChartDataSet::removeSeries(QSeries* series) { - int index = seriesIndex(series); - if (index < 0) { - qWarning() << "Can not remove series. Series not found on the chart."; + + QChartAxis* axis = m_seriesAxisMap.value(series); + + if(!axis){ + qWarning()<<"Can not remove series. Series not found on the chart."; return; } + emit seriesRemoved(series); + m_seriesAxisMap.remove(series); + int key = seriesIndex(series); + Q_ASSERT(key!=-1); - // Remove the series and the axis from the container - QChartAxis* axis = m_seriesAxisList.at(index).second; - m_seriesAxisList.removeAt(index); + m_indexSeriesMap.remove(key); - // Delete the series - emit seriesRemoved(series); - if (series->parent() == this) { + if(series->parent()==this){ delete series; - series = 0; + series=0; } - // Check if the Y axis is still in use - bool yAxisInUse(false); - for (int i(0); i < m_seriesAxisList.count(); i++) { - QPair pair = m_seriesAxisList.at(i); - if (pair.second == axis) - yAxisInUse = true; - } + QList axes = m_seriesAxisMap.values(); + + int i = axes.indexOf(axis); - // Remove the Y axis if not in use - if (!yAxisInUse) { + if(i==-1){ Domain* domain = m_axisDomainMap.take(axis); emit axisRemoved(axis); - if (axis != axisY()) { - // Delete the Y axis unless it is the default one - if (axis->parent() == this) { + if(axis!=axisY()){ + if(axis->parent()==this){ delete axis; - axis = 0; + axis=0; } } delete domain; } - // Remove the x axis in case there are no y-axes left - if (m_seriesAxisList.count() == 0) { - m_axisXInitialized = false; + if(m_seriesAxisMap.values().size()==0) + { + m_axisXInitialized=false; emit axisRemoved(axisX()); } } void ChartDataSet::removeAllSeries() { - while (m_seriesAxisList.count()) { - QPair pair = m_seriesAxisList.last(); - removeSeries(pair.first); + + QList series = m_seriesAxisMap.keys(); + + foreach(QSeries* s , series) { + removeSeries(s); } - Q_ASSERT(m_seriesAxisList.count() == 0); - Q_ASSERT(m_axisDomainMap.count() == 0); + Q_ASSERT(m_seriesAxisMap.count()==0); + Q_ASSERT(m_axisDomainMap.count()==0); + } //to be removed with PIMPL @@ -285,30 +301,41 @@ void ChartDataSet::zoomOutDomain(const QRectF& rect, const QSizeF& size) } } -int ChartDataSet::seriesIndex(QSeries *series) const +int ChartDataSet::seriesCount(QSeries::QSeriesType type) +{ + int count=0; + QMapIterator i(m_seriesAxisMap); + while (i.hasNext()) { + i.next(); + if(i.key()->type()==type) count++; + } + return count; +} + +int ChartDataSet::seriesIndex(QSeries *series) { - for (int i(0); i < m_seriesAxisList.count(); i++) { - QPair pair = m_seriesAxisList.at(i); - if (pair.first == series) - return i; + QMapIterator i(m_indexSeriesMap); + while (i.hasNext()) { + i.next(); + if (i.value() == series) + return i.key(); } return -1; } QChartAxis* ChartDataSet::axisY(QSeries* series) const { - if (series == 0) - return m_axisY; - - return m_seriesAxisList.at(seriesIndex(series)).second; + if(series == 0) return m_axisY; + return m_seriesAxisMap.value(series); } Domain* ChartDataSet::domain(QSeries* series) const { - QChartAxis* axis = m_seriesAxisList.at(seriesIndex(series)).second; - if (axis) + QChartAxis* axis = m_seriesAxisMap.value(series); + if(axis){ return m_axisDomainMap.value(axis); - return 0; + }else + return 0; } Domain* ChartDataSet::domain(QChartAxis* axis) const diff --git a/src/chartdataset_p.h b/src/chartdataset_p.h index 7ef2f3d..0a105c6 100644 --- a/src/chartdataset_p.h +++ b/src/chartdataset_p.h @@ -54,7 +54,8 @@ public: void zoomOutDomain(const QRectF& rect, const QSizeF& size); void scrollDomain(int dx,int dy,const QSizeF& size); - int seriesIndex(QSeries *series) const; + int seriesCount(QSeries::QSeriesType type); + int seriesIndex(QSeries *series); Domain* domain(QSeries* series) const; Domain* domain(QChartAxis* axis) const; @@ -74,8 +75,9 @@ private: void setupCategories(QBarSeries* series); private: - QList > m_seriesAxisList; + QMap m_seriesAxisMap; QMap m_axisDomainMap; + QMap m_indexSeriesMap; QChartAxis* m_axisX; QChartAxis* m_axisY; diff --git a/test/auto/chartdataset/tst_chartdataset.cpp b/test/auto/chartdataset/tst_chartdataset.cpp index 3857379..c78cff3 100644 --- a/test/auto/chartdataset/tst_chartdataset.cpp +++ b/test/auto/chartdataset/tst_chartdataset.cpp @@ -52,6 +52,8 @@ private Q_SLOTS: void removeAllSeries(); void axisY_data(); void axisY(); + void seriesCount_data(); + void seriesCount(); void seriesIndex_data(); void seriesIndex(); void domain_data(); @@ -95,6 +97,8 @@ void tst_ChartDataSet::chartdataset() //check if not dangling pointer dataSet.axisX()->objectName(); dataSet.axisY()->objectName(); + QLineSeries* series = new QLineSeries(this); + QCOMPARE(dataSet.seriesIndex(series),-1); } void tst_ChartDataSet::addSeries_data() @@ -259,6 +263,40 @@ void tst_ChartDataSet::axisY() } +void tst_ChartDataSet::seriesCount_data() +{ + addSeries_data(); +} + +void tst_ChartDataSet::seriesCount() +{ + QFETCH(QLineSeries*, series0); + QFETCH(QChartAxis*, axis0); + QFETCH(QLineSeries*, series1); + QFETCH(QChartAxis*, axis1); + QFETCH(QLineSeries*, series2); + QFETCH(QChartAxis*, axis2); + QFETCH(int, axisCount); + Q_UNUSED(axisCount); + + ChartDataSet dataSet; + + dataSet.addSeries(series0, axis0); + dataSet.addSeries(series1, axis1); + dataSet.addSeries(series2, axis2); + + QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*,Domain*))); + QSignalSpy spy1(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); + QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*))); + QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*))); + + QCOMPARE(dataSet.seriesCount(series0->type()),3); + QCOMPARE(spy0.count(), 0); + QCOMPARE(spy1.count(), 0); + QCOMPARE(spy2.count(), 0); + QCOMPARE(spy3.count(), 0); +} + void tst_ChartDataSet::seriesIndex_data() { addSeries_data(); @@ -266,6 +304,8 @@ void tst_ChartDataSet::seriesIndex_data() void tst_ChartDataSet::seriesIndex() { + //TODO: rewrite this series_index_data to match better + QFETCH(QLineSeries*, series0); QFETCH(QChartAxis*, axis0); QFETCH(QLineSeries*, series1); @@ -286,18 +326,62 @@ void tst_ChartDataSet::seriesIndex() QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*))); QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - int i0 = dataSet.seriesIndex(series0); - int i1 = dataSet.seriesIndex(series1); - int i2 = dataSet.seriesIndex(series2); - - QVERIFY(i1!=i2); - QVERIFY(i0!=i2); - QVERIFY(i0!=i1); + QCOMPARE(dataSet.seriesIndex(series0),0); + QCOMPARE(dataSet.seriesIndex(series1),1); + QCOMPARE(dataSet.seriesIndex(series2),2); QCOMPARE(spy0.count(), 0); QCOMPARE(spy1.count(), 0); QCOMPARE(spy2.count(), 0); QCOMPARE(spy3.count(), 0); + + dataSet.removeSeries(series0); + dataSet.removeSeries(series1); + dataSet.removeSeries(series2); + + QCOMPARE(dataSet.seriesIndex(series0),-1); + QCOMPARE(dataSet.seriesIndex(series1),-1); + QCOMPARE(dataSet.seriesIndex(series2),-1); + + dataSet.addSeries(series0, axis0); + dataSet.addSeries(series1, axis1); + dataSet.addSeries(series2, axis2); + + QCOMPARE(dataSet.seriesIndex(series0),0); + QCOMPARE(dataSet.seriesIndex(series1),1); + QCOMPARE(dataSet.seriesIndex(series2),2); + + dataSet.removeSeries(series1); + + QCOMPARE(dataSet.seriesIndex(series0),0); + QCOMPARE(dataSet.seriesIndex(series1),-1); + QCOMPARE(dataSet.seriesIndex(series2),2); + + dataSet.addSeries(series1, axis1); + QCOMPARE(dataSet.seriesIndex(series0),0); + QCOMPARE(dataSet.seriesIndex(series1),1); + QCOMPARE(dataSet.seriesIndex(series2),2); + + dataSet.removeSeries(series2); + QCOMPARE(dataSet.seriesIndex(series0),0); + QCOMPARE(dataSet.seriesIndex(series1),1); + QCOMPARE(dataSet.seriesIndex(series2),-1); + + dataSet.removeSeries(series0); + QCOMPARE(dataSet.seriesIndex(series0),-1); + QCOMPARE(dataSet.seriesIndex(series1),1); + QCOMPARE(dataSet.seriesIndex(series2),-1); + + dataSet.addSeries(series2); + QCOMPARE(dataSet.seriesIndex(series0),-1); + QCOMPARE(dataSet.seriesIndex(series1),1); + QCOMPARE(dataSet.seriesIndex(series2),0); + + dataSet.addSeries(series0); + QCOMPARE(dataSet.seriesIndex(series0),2); + QCOMPARE(dataSet.seriesIndex(series1),1); + QCOMPARE(dataSet.seriesIndex(series2),0); + } void tst_ChartDataSet::domain_data() diff --git a/test/chartwidgettest/mainwidget.cpp b/test/chartwidgettest/mainwidget.cpp index e783bf2..30e2515 100644 --- a/test/chartwidgettest/mainwidget.cpp +++ b/test/chartwidgettest/mainwidget.cpp @@ -230,7 +230,6 @@ void MainWidget::addSeries(QString seriesName, int columnCount, int rowCount, QS for (int j(0); j < data.count(); j ++) { QList column = data.at(j); QLineSeries *series = new QLineSeries(); - series->setName("line" + QString::number(j)); for (int i(0); i < column.count(); i++) series->append(i, column.at(i)); m_chart->addSeries(series); @@ -243,14 +242,12 @@ void MainWidget::addSeries(QString seriesName, int columnCount, int rowCount, QS for (int i(0); i < column.count(); i++) lineSeries->append(i, column.at(i)); QAreaSeries *areaSeries = new QAreaSeries(lineSeries); - areaSeries->setName("area" + QString::number(j)); m_chart->addSeries(areaSeries); } } else if (seriesName == "Scatter") { for (int j(0); j < data.count(); j++) { QList column = data.at(j); QScatterSeries *series = new QScatterSeries(); - series->setName("scatter" + QString::number(j)); for (int i(0); i < column.count(); i++) series->append(i, column.at(i)); m_chart->addSeries(series);