From f33d64d30a1c4d61a96dc68ac73b20c230f1fd56 2012-03-29 11:11:52 From: sauimone Date: 2012-03-29 11:11:52 Subject: [PATCH] legend refactoring. --- diff --git a/demos/chartthemes/themewidget.cpp b/demos/chartthemes/themewidget.cpp index 702bfe1..dd995cc 100644 --- a/demos/chartthemes/themewidget.cpp +++ b/demos/chartthemes/themewidget.cpp @@ -185,14 +185,13 @@ QChart* ThemeWidget::createAreaChart() const for (int i(0); i < m_dataTable.count(); i++) { QLineSeries *series1 = new QLineSeries(chart); QLineSeries *series2 = new QLineSeries(chart); - series1->setName(name + QString::number(nameIndex) + QString(" lo")); - series2->setName(name + QString::number(nameIndex) + QString(" hi")); - nameIndex++; foreach (Data data, m_dataTable[i]) { series1->add(data.first); series2->add(QPointF(data.first.x(), 0.0)); } QAreaSeries *area = new QAreaSeries(series1, series2); + area->setName(name + QString::number(nameIndex)); + nameIndex++; chart->addSeries(area); } } diff --git a/src/chartpresenter.cpp b/src/chartpresenter.cpp index 611d33a..855ca8f 100644 --- a/src/chartpresenter.cpp +++ b/src/chartpresenter.cpp @@ -58,7 +58,6 @@ void ChartPresenter::createConnections() void ChartPresenter::handleGeometryChanged() { - qDebug() << "legend h:" << m_chart->legend()->size().height(); QRectF rect(QPoint(0,0),m_chart->size()); rect.adjust(m_padding, m_padding + m_chart->legend()->size().height(), diff --git a/src/legendmarker.cpp b/src/legendmarker.cpp index c80d696..8abcfff 100644 --- a/src/legendmarker.cpp +++ b/src/legendmarker.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -17,7 +18,6 @@ LegendMarker::LegendMarker(QSeries *series, QGraphicsItem *parent) : QGraphicsOb m_series(series), m_barset(0), m_pieslice(0), - m_type(LegendMarkerTypeSeries), m_textItem(new QGraphicsSimpleTextItem(this)) { setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); @@ -31,7 +31,6 @@ LegendMarker::LegendMarker(QSeries *series, QBarSet *barset, QGraphicsItem *pare m_series(series), m_barset(barset), m_pieslice(0), - m_type(LegendMarkerTypeBarset), m_textItem(new QGraphicsSimpleTextItem(this)) { setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); @@ -45,7 +44,6 @@ LegendMarker::LegendMarker(QSeries *series, QPieSlice *pieslice, QGraphicsItem * m_series(series), m_barset(0), m_pieslice(pieslice), - m_type(LegendMarkerTypePieslice), m_textItem(new QGraphicsSimpleTextItem(this)) { setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); @@ -125,17 +123,21 @@ void LegendMarker::layoutChanged() void LegendMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) { - switch (m_type) - { - case LegendMarkerTypeSeries: { + switch (m_series->type()) { + case QSeries::SeriesTypeLine: + case QSeries::SeriesTypeArea: + case QSeries::SeriesTypeScatter: + case QSeries::SeriesTypeSpline: { emit clicked(m_series,event->button()); break; } - case LegendMarkerTypeBarset: { + case QSeries::SeriesTypeBar: + case QSeries::SeriesTypeStackedBar: + case QSeries::SeriesTypePercentBar: { emit clicked(m_barset,event->button()); break; } - case LegendMarkerTypePieslice: { + case QSeries::SeriesTypePie: { emit clicked(m_pieslice,event->button()); break; } @@ -147,26 +149,39 @@ void LegendMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) void LegendMarker::changed() { - switch (m_type) - { - case LegendMarkerTypeSeries: { - QXYSeries* s = static_cast (m_series); + switch (m_series->type()) { + case QSeries::SeriesTypeArea: { + QAreaSeries* s = static_cast (m_series); setPen(s->pen()); setBrush(s->brush()); setName(s->name()); break; } - case LegendMarkerTypeBarset: { + case QSeries::SeriesTypeLine: + case QSeries::SeriesTypeScatter: + case QSeries::SeriesTypeSpline: { + QXYSeries* s = static_cast (m_series); + setPen(s->pen()); + setBrush(s->brush()); + setName(s->name()); + break; + } + case QSeries::SeriesTypeBar: + case QSeries::SeriesTypeStackedBar: + case QSeries::SeriesTypePercentBar: { setPen(m_barset->pen()); setBrush(m_barset->brush()); setName(m_barset->name()); break; - } - case LegendMarkerTypePieslice: { + } + case QSeries::SeriesTypePie: { setBrush(m_pieslice->brush()); setName(m_pieslice->label()); break; - } + } + default: { + break; + } } } diff --git a/src/legendmarker_p.h b/src/legendmarker_p.h index 5169e13..1f3878e 100644 --- a/src/legendmarker_p.h +++ b/src/legendmarker_p.h @@ -18,12 +18,6 @@ class LegendMarker : public QGraphicsObject { Q_OBJECT - enum LegendMarkerType { - LegendMarkerTypeSeries, - LegendMarkerTypeBarset, - LegendMarkerTypePieslice - }; - public: LegendMarker(QSeries *series, QGraphicsItem *parent = 0); LegendMarker(QSeries *series, QBarSet *barset, QGraphicsItem *parent = 0); @@ -72,7 +66,6 @@ private: QBarSet *m_barset; QPieSlice *m_pieslice; - LegendMarkerType m_type; QGraphicsSimpleTextItem *m_textItem; }; diff --git a/src/qlegend.cpp b/src/qlegend.cpp index b96283b..e9549f3 100644 --- a/src/qlegend.cpp +++ b/src/qlegend.cpp @@ -219,8 +219,55 @@ void QLegend::handleSeriesAdded(QSeries *series, Domain *domain) { Q_UNUSED(domain) - createMarkers(series); - connectSeries(series); + switch (series->type()) + { + case QSeries::SeriesTypeLine: { + QLineSeries *lineSeries = static_cast(series); + appendMarkers(lineSeries); + break; + } + case QSeries::SeriesTypeArea: { + QAreaSeries *areaSeries = static_cast(series); + appendMarkers(areaSeries); + break; + } + case QSeries::SeriesTypeBar: { + QBarSeries *barSeries = static_cast(series); + appendMarkers(barSeries); + break; + } + case QSeries::SeriesTypeStackedBar: { + QStackedBarSeries *stackedBarSeries = static_cast(series); + appendMarkers(stackedBarSeries); + break; + } + case QSeries::SeriesTypePercentBar: { + QPercentBarSeries *percentBarSeries = static_cast(series); + appendMarkers(percentBarSeries); + break; + } + case QSeries::SeriesTypeScatter: { + QScatterSeries *scatterSeries = static_cast(series); + appendMarkers(scatterSeries); + break; + } + case QSeries::SeriesTypePie: { + QPieSeries *pieSeries = static_cast(series); + appendMarkers(pieSeries); + connect(pieSeries,SIGNAL(added(QList)),this,SLOT(handleAdded(QList))); + break; + } + case QSeries::SeriesTypeSpline: { + QSplineSeries *splineSeries = static_cast(series); + appendMarkers(splineSeries); + break; + } + default: { + qWarning()<< "QLegend::handleSeriesAdded" << series->type() << "unknown series type."; + break; + } + } + updateLayout(); } @@ -229,15 +276,24 @@ void QLegend::handleSeriesAdded(QSeries *series, Domain *domain) */ 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 - QAreaSeries* s = static_cast (series); - deleteMarkers(s->upperSeries()); - deleteMarkers(s->lowerSeries()); - } else { + switch (series->type()) + { + case QSeries::SeriesTypeArea: { + QAreaSeries *areaSeries = static_cast(series); + deleteMarkers(areaSeries); + break; + } + case QSeries::SeriesTypePie: { + QPieSeries *pieSeries = static_cast(series); + disconnect(pieSeries, SIGNAL(added(QList)), this, SLOT(handleAdded(QList))); deleteMarkers(series); + break; + } + default: { + // All other types + deleteMarkers(series); + break; + } } updateLayout(); @@ -313,86 +369,19 @@ void QLegend::scrollButtonClicked(LegendScrollButton *scrollButton) } /*! - \internal Connects the \a series to legend. Legend listens changes in series, for example pie slices added / removed. - Not all series notify about events -*/ -void QLegend::connectSeries(QSeries *series) -{ - // Connect relevant signals from series. Currently only pie series has interesting signals - // TODO: bar chart may have - if (series->type() == QSeries::SeriesTypePie) { - QPieSeries *pieSeries = static_cast(series); - connect(pieSeries,SIGNAL(added(QList)),this,SLOT(handleAdded(QList))); - } -} - -/*! - \internal Disconnects \a series from legend. No more status updates from series to legend. -*/ -void QLegend::disconnectSeries(QSeries *series) -{ - if (series->type() == QSeries::SeriesTypePie) { - QPieSeries *pieSeries = static_cast(series); - disconnect(pieSeries, SIGNAL(added(QList)), this, SLOT(handleAdded(QList))); - } -} - -/*! - \internal Creates new markers for \a series. Marker contains the colored rectangle and series name. - With pie chart, created markers depend on pie slices. - With bar chart, created markers depend on bar sets. + \internal Helper function. Appends markers from \a series to legend. */ -void QLegend::createMarkers(QSeries *series) +void QLegend::appendMarkers(QAreaSeries* series) { - switch (series->type()) - { - case QSeries::SeriesTypeLine: { - QLineSeries *lineSeries = static_cast(series); - appendMarkers(lineSeries); - break; - } - case QSeries::SeriesTypeArea: { - QAreaSeries *areaSeries = static_cast(series); - appendMarkers(areaSeries->upperSeries()); - if(areaSeries->lowerSeries()) - appendMarkers(areaSeries->lowerSeries()); - break; - } - case QSeries::SeriesTypeBar: { - QBarSeries *barSeries = static_cast(series); - appendMarkers(barSeries); - break; - } - case QSeries::SeriesTypeStackedBar: { - QStackedBarSeries *stackedBarSeries = static_cast(series); - appendMarkers(stackedBarSeries); - break; - } - case QSeries::SeriesTypePercentBar: { - QPercentBarSeries *percentBarSeries = static_cast(series); - appendMarkers(percentBarSeries); - break; - } - case QSeries::SeriesTypeScatter: { - QScatterSeries *scatterSeries = static_cast(series); - appendMarkers(scatterSeries); - break; - } - case QSeries::SeriesTypePie: { - QPieSeries *pieSeries = static_cast(series); - appendMarkers(pieSeries); - break; - } - case QSeries::SeriesTypeSpline: { - QSplineSeries *splineSeries = static_cast(series); - appendMarkers(splineSeries); - break; - } - default: { - qWarning()<< "QLegend::createMarkers" << series->type() << "unknown series type."; - break; - } - } + LegendMarker* marker = new LegendMarker(series,this); + marker->setName(series->name()); + marker->setPen(series->pen()); + marker->setBrush(series->brush()); + connect(marker, SIGNAL(clicked(QSeries *, Qt::MouseButton)), this, SIGNAL(clicked(QSeries *, Qt::MouseButton))); + connect(marker, SIGNAL(destroyed()), this, SLOT(handleMarkerDestroyed())); + connect(series,SIGNAL(updated()),marker,SLOT(changed())); + m_markers.append(marker); + childItems().append(marker); } /*! @@ -406,12 +395,13 @@ void QLegend::appendMarkers(QXYSeries* series) marker->setBrush(series->brush()); connect(marker, SIGNAL(clicked(QSeries *, Qt::MouseButton)), this, SIGNAL(clicked(QSeries *, Qt::MouseButton))); connect(marker, SIGNAL(destroyed()), this, SLOT(handleMarkerDestroyed())); + connect(series,SIGNAL(updated()),marker,SLOT(changed())); m_markers.append(marker); childItems().append(marker); } /*! - \internal Helper function. Appends markers from \a series to legend. + \internal Helper function. Appends markers from \a series to legend. */ void QLegend::appendMarkers(QBarSeries *series) { @@ -430,7 +420,7 @@ void QLegend::appendMarkers(QBarSeries *series) } /*! - \internal Helper function. Appends markers from \a series to legend. + \internal Helper function. Appends markers from \a series to legend. */ void QLegend::appendMarkers(QPieSeries *series) { diff --git a/src/qlegend.h b/src/qlegend.h index 1610d7e..77e6dc1 100644 --- a/src/qlegend.h +++ b/src/qlegend.h @@ -15,6 +15,7 @@ class QXYSeries; class QBarSet; class QBarSeries; class QPieSeries; +class QAreaSeries; class LegendScrollButton; class QSeries; class QChart; @@ -75,10 +76,8 @@ public Q_SLOTS: 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(QAreaSeries *series); + void appendMarkers(QXYSeries *series); void appendMarkers(QBarSeries *series); void appendMarkers(QPieSeries *series); void deleteMarkers(QSeries *series);