diff --git a/src/qlegend.cpp b/src/qlegend.cpp index 764192c..cc07ef1 100644 --- a/src/qlegend.cpp +++ b/src/qlegend.cpp @@ -97,11 +97,14 @@ void QLegend::handleSeriesAdded(QSeries* series, Domain* domain) mSeriesList.append(series); createMarkers(series); + connectSeries(series); layoutChanged(); } void QLegend::handleSeriesRemoved(QSeries* series) { + disconnectSeries(series); + if (series->type() == QSeries::SeriesTypeArea) { // This is special case. Area series has upper and lower series, which each have markers @@ -116,6 +119,122 @@ void QLegend::handleSeriesRemoved(QSeries* series) layoutChanged(); } +void QLegend::handleAdded(QList slices) +{ + QPieSeries* series = static_cast (sender()); + foreach(QPieSlice* s, slices) { + LegendMarker* marker = new LegendMarker(series,s,this); + marker->setName(s->label()); + marker->setBrush(s->sliceBrush()); + connect(marker,SIGNAL(clicked(QPieSlice*,Qt::MouseButton)),this,SIGNAL(clicked(QPieSlice*,Qt::MouseButton))); + connect(s,SIGNAL(changed()),marker,SLOT(changed())); + connect(s,SIGNAL(destroyed()),marker,SLOT(deleteLater())); + mMarkers.append(marker); + childItems().append(marker); + } + layoutChanged(); +} + +void QLegend::handleMarkerDestroyed() +{ + // TODO: what if more than one markers are destroyed and we update layout after first one? + LegendMarker* m = static_cast (sender()); + mMarkers.removeOne(m); + layoutChanged(); +} + +void QLegend::connectSeries(QSeries *series) +{ + // Connect relevant signals from series + switch (series->type()) + { + case QSeries::SeriesTypeLine: { +// QLineSeries* lineSeries = static_cast(series); + break; + } + case QSeries::SeriesTypeArea: { +// QAreaSeries* areaSeries = static_cast(series); + break; + } + case QSeries::SeriesTypeBar: { +// QBarSeries* barSeries = static_cast(series); + break; + } + case QSeries::SeriesTypeStackedBar: { +// QStackedBarSeries* stackedBarSeries = static_cast(series); + break; + } + case QSeries::SeriesTypePercentBar: { +// QPercentBarSeries* percentBarSeries = static_cast(series); + break; + } + case QSeries::SeriesTypeScatter: { +// QScatterSeries *scatterSeries = static_cast(series); + break; + } + case QSeries::SeriesTypePie: { + QPieSeries *pieSeries = static_cast(series); + connect(pieSeries,SIGNAL(added(QList)),this,SLOT(handleAdded(QList))); +// connect(pieSeries,SIGNAL(removed(QList)),this,SLOT(handleRemoved(QList))); + break; + } + case QSeries::SeriesTypeSpline: { +// QSplineSeries* splineSeries = static_cast(series); + break; + } + default: { + qDebug()<< "QLegend::connectSeries" << series->type() << "not implemented."; + break; + } + } +} + +void QLegend::disconnectSeries(QSeries *series) +{ + // Connect relevant signals from series + switch (series->type()) + { + case QSeries::SeriesTypeLine: { +// QLineSeries* lineSeries = static_cast(series); + break; + } + case QSeries::SeriesTypeArea: { +// QAreaSeries* areaSeries = static_cast(series); + break; + } + case QSeries::SeriesTypeBar: { +// QBarSeries* barSeries = static_cast(series); + break; + } + case QSeries::SeriesTypeStackedBar: { +// QStackedBarSeries* stackedBarSeries = static_cast(series); + break; + } + case QSeries::SeriesTypePercentBar: { +// QPercentBarSeries* percentBarSeries = static_cast(series); + break; + } + case QSeries::SeriesTypeScatter: { +// QScatterSeries *scatterSeries = static_cast(series); + break; + } + case QSeries::SeriesTypePie: { + QPieSeries *pieSeries = static_cast(series); + disconnect(pieSeries,SIGNAL(added(QList)),this,SLOT(handleAdded(QList))); +// disconnect(pieSeries,SIGNAL(removed(QList)),this,SLOT(handleRemoved(QList))); + break; + } + case QSeries::SeriesTypeSpline: { +// QSplineSeries* splineSeries = static_cast(series); + break; + } + default: { + qDebug()<< "QLegend::disconnectSeries" << series->type() << "not implemented."; + break; + } + } +} + void QLegend::createMarkers(QSeries *series) { switch (series->type()) @@ -181,6 +300,7 @@ void QLegend::appendMarkers(QXYSeries* series) marker->setName(series->name()); marker->setBrush(series->brush()); connect(marker,SIGNAL(clicked(QSeries*,Qt::MouseButton)),this,SIGNAL(clicked(QSeries*,Qt::MouseButton))); + connect(marker,SIGNAL(destroyed()),this,SLOT(handleMarkerDestroyed())); mMarkers.append(marker); childItems().append(marker); } @@ -193,6 +313,7 @@ void QLegend::appendMarkers(QBarSeries *series) marker->setBrush(s->brush()); connect(marker,SIGNAL(clicked(QBarSet*,Qt::MouseButton)),this,SIGNAL(clicked(QBarSet*,Qt::MouseButton))); connect(s,SIGNAL(changed()),marker,SLOT(changed())); + connect(marker,SIGNAL(destroyed()),this,SLOT(handleMarkerDestroyed())); mMarkers.append(marker); childItems().append(marker); } @@ -206,6 +327,8 @@ void QLegend::appendMarkers(QPieSeries *series) marker->setBrush(s->sliceBrush()); connect(marker,SIGNAL(clicked(QPieSlice*,Qt::MouseButton)),this,SIGNAL(clicked(QPieSlice*,Qt::MouseButton))); connect(s,SIGNAL(changed()),marker,SLOT(changed())); + connect(s,SIGNAL(destroyed()),marker,SLOT(deleteLater())); + connect(marker,SIGNAL(destroyed()),this,SLOT(handleMarkerDestroyed())); mMarkers.append(marker); childItems().append(marker); } diff --git a/src/qlegend.h b/src/qlegend.h index 0753dec..74c0cb6 100644 --- a/src/qlegend.h +++ b/src/qlegend.h @@ -50,15 +50,20 @@ signals: public slots: void handleSeriesAdded(QSeries* series,Domain* domain); void handleSeriesRemoved(QSeries* series); + void handleAdded(QList slices); +// void handleRemoved(QList slices); + void handleMarkerDestroyed(); private: // PIMPL ---> + void connectSeries(QSeries* series); + void disconnectSeries(QSeries* series); void createMarkers(QSeries* series); void appendMarkers(QXYSeries* series); // All line series are derived from QXYSeries, so this works for now void appendMarkers(QBarSeries* series); void appendMarkers(QPieSeries* series); void deleteMarkers(QSeries* series); - void layoutChanged(); // TODO: rename this to layoutChanged and remove original layoutChanged, when ready + void layoutChanged(); // <--- PIMPL