diff --git a/src/barchart/bar_p.h b/src/barchart/bar_p.h index 827dde4..c9f2c47 100644 --- a/src/barchart/bar_p.h +++ b/src/barchart/bar_p.h @@ -40,10 +40,10 @@ Q_SIGNALS: private: - qreal mHeight; - qreal mWidth; qreal mXpos; qreal mYpos; + qreal mWidth; + qreal mHeight; QBrush mBrush; QPen mPen; diff --git a/src/legendmarker.cpp b/src/legendmarker.cpp index e51abee..f1fb086 100644 --- a/src/legendmarker.cpp +++ b/src/legendmarker.cpp @@ -7,8 +7,36 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE LegendMarker::LegendMarker(QSeries* series, QGraphicsItem *parent) : QGraphicsObject(parent) + ,mBoundingRect(0,0,1,1) + ,mName("") ,mSeries(series) + ,mBarset(0) + ,mPieslice(0) + ,mType(LegendMarkerTypeSeries) + { + setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); + } + +LegendMarker::LegendMarker(QBarSet* barset, QGraphicsItem *parent) + : QGraphicsObject(parent) + ,mBoundingRect(0,0,1,1) + ,mName("") + ,mSeries(0) + ,mBarset(barset) + ,mPieslice(0) + ,mType(LegendMarkerTypeBarset) + { + setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); + } + +LegendMarker::LegendMarker(QPieSlice* pieslice, QGraphicsItem *parent) + : QGraphicsObject(parent) ,mBoundingRect(0,0,1,1) + ,mName("") + ,mSeries(0) + ,mBarset(0) + ,mPieslice(pieslice) + ,mType(LegendMarkerTypePieslice) { setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); } @@ -23,6 +51,11 @@ void LegendMarker::setBrush(const QBrush brush) mBrush = brush; } +QBrush LegendMarker::brush() const +{ + return mBrush; +} + void LegendMarker::setName(const QString name) { mName = name; @@ -33,11 +66,6 @@ QString LegendMarker::name() const return mName; } -QColor LegendMarker::color() const -{ - return mBrush.color(); -} - void LegendMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { painter->setBrush(mBrush); @@ -51,11 +79,41 @@ QRectF LegendMarker::boundingRect() const void LegendMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) { - if (event->button() == Qt::LeftButton) { - emit clicked(mSeries, mName); - } else if (event->button() == Qt::RightButton) { - emit rightClicked(mSeries, mName); + switch (mType) + { + case LegendMarkerTypeSeries: { + + if (event->button() == Qt::LeftButton) { + emit clicked(mSeries); + } else if (event->button() == Qt::RightButton) { + emit rightClicked(mSeries); + } + break; } + case LegendMarkerTypeBarset: { + + if (event->button() == Qt::LeftButton) { + emit clicked(mBarset); + } else if (event->button() == Qt::RightButton) { + emit rightClicked(mBarset); + } + break; + } + + case LegendMarkerTypePieslice: { + + if (event->button() == Qt::LeftButton) { + emit clicked(mPieslice); + } else if (event->button() == Qt::RightButton) { + emit rightClicked(mPieslice); + } + break; + } + default: { + break; + } + } + } #include "moc_legendmarker_p.cpp" diff --git a/src/legendmarker_p.h b/src/legendmarker_p.h index c3d82e8..79ebd24 100644 --- a/src/legendmarker_p.h +++ b/src/legendmarker_p.h @@ -8,18 +8,31 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class QSeries; +class QBarSet; +class QPieSlice; - +// TODO: split this to 3 different markers for series, barset and pieslice. Current implementation is easier to misuse... class LegendMarker : public QGraphicsObject { Q_OBJECT + + enum LegendMarkerType { + LegendMarkerTypeSeries, + LegendMarkerTypeBarset, + LegendMarkerTypePieslice + }; + public: LegendMarker(QSeries* series, QGraphicsItem *parent = 0); + LegendMarker(QBarSet* barset, QGraphicsItem *parent = 0); + LegendMarker(QPieSlice* pieslice, QGraphicsItem *parent = 0); void setBoundingRect(const QRectF rect); + void setBrush(const QBrush brush); + QBrush brush() const; + void setName(const QString name); QString name() const; - QColor color() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); @@ -30,14 +43,22 @@ public: void mousePressEvent(QGraphicsSceneMouseEvent *event); Q_SIGNALS: - void clicked(QSeries* series, QString name); - void rightClicked(QSeries* series, QString name); + void clicked(QSeries* series); + void rightClicked(QSeries* series); + void clicked(QBarSet* barset); + void rightClicked(QBarSet* barset); + void clicked(QPieSlice* pieslice); + void rightClicked(QPieSlice* pieslice); private: QRectF mBoundingRect; QBrush mBrush; QString mName; QSeries* mSeries; + QBarSet* mBarset; + QPieSlice* mPieslice; + + LegendMarkerType mType; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/qlegend.cpp b/src/qlegend.cpp index eea8c83..32e631e 100644 --- a/src/qlegend.cpp +++ b/src/qlegend.cpp @@ -2,6 +2,17 @@ #include "qlegend.h" #include "qseries.h" #include "legendmarker_p.h" +#include "qxyseries.h" +#include "qlineseries.h" +#include "qareaseries.h" +#include "qscatterseries.h" +#include "qsplineseries.h" +#include "qbarseries.h" +#include "qstackedbarseries.h" +#include "qpercentbarseries.h" +#include "qbarset.h" +#include "qpieseries.h" +#include "qpieslice.h" #include #include @@ -23,7 +34,7 @@ void QLegend::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q foreach(LegendMarker* m, mMarkers) { QRectF r = m->boundingRect(); - painter->setPen(m->color()); + painter->setBrush(m->brush()); painter->drawText(r.x() + r.width()*2, r.y() + r.height(), m->name()); } } @@ -46,14 +57,76 @@ QBrush QLegend::backgroundBrush() const void QLegend::handleSeriesAdded(QSeries* series,Domain* domain) { mSeriesList.append(series); - dataChanged(); + + switch (series->type()) + { + case QSeries::SeriesTypeLine: { + + QLineSeries* lineSeries = static_cast(series); + createMarker(lineSeries); + break; + } + case QSeries::SeriesTypeArea: { + + QAreaSeries* areaSeries = static_cast(series); + createMarker(areaSeries->upperSeries()); + createMarker(areaSeries->lowerSeries()); + break; + } + + case QSeries::SeriesTypeBar: { + + QBarSeries* barSeries = static_cast(series); + createMarkers(barSeries); + break; + } + + case QSeries::SeriesTypeStackedBar: { + + QStackedBarSeries* stackedBarSeries = static_cast(series); + createMarkers(stackedBarSeries); + break; + } + + case QSeries::SeriesTypePercentBar: { + + QPercentBarSeries* percentBarSeries = static_cast(series); + createMarkers(percentBarSeries); + break; + } + + case QSeries::SeriesTypeScatter: { + + QScatterSeries *scatterSeries = static_cast(series); + createMarker(scatterSeries); + break; + } + + case QSeries::SeriesTypePie: { + + QPieSeries *pieSeries = static_cast(series); + createMarkers(pieSeries); + break; + } + + case QSeries::SeriesTypeSpline: { + + QSplineSeries* splineSeries = static_cast(series); + break; + } + default: { + qDebug()<< "QLegend::handleSeriesAdded" << series->type() << "not implemented."; + break; + } + } + layoutChanged(); } void QLegend::handleSeriesRemoved(QSeries* series) { + // TODO: delete markers, disconnect. mSeriesList.removeOne(series); - dataChanged(); layoutChanged(); } @@ -63,26 +136,40 @@ void QLegend::handleGeometryChanged(const QRectF& size) layoutChanged(); } -void QLegend::dataChanged() +void QLegend::createMarker(QXYSeries* series) { - foreach (LegendMarker* marker, mMarkers) { - disconnect(marker,SIGNAL(clicked(QSeries*,QString)),this,SIGNAL(clicked(QSeries*,QString))); - disconnect(marker,SIGNAL(rightClicked(QSeries*,QString)),this,SIGNAL(rightClicked(QSeries*,QString))); - delete marker; + LegendMarker* marker = new LegendMarker(series,this); + marker->setName(series->name()); + marker->setBrush(series->brush()); + connect(marker,SIGNAL(clicked(QSeries*)),this,SIGNAL(markerClicked(QSeries*))); + connect(marker,SIGNAL(rightClicked(QSeries*)),this,SIGNAL(markerRightClicked(QSeries*))); + mMarkers.append(marker); + childItems().append(marker); +} + +void QLegend::createMarkers(QBarSeries *series) +{ + foreach(QBarSet* s, series->barSets()) { + LegendMarker* marker = new LegendMarker(series,this); + marker->setName(s->name()); + marker->setBrush(s->brush()); + connect(marker,SIGNAL(clicked(QBarSet*)),this,SIGNAL(markerClicked(QBarSet*))); + connect(marker,SIGNAL(rightClicked(QBarSet*)),this,SIGNAL(markerRightClicked(QBarSet*))); + mMarkers.append(marker); + childItems().append(marker); } +} - mMarkers.clear(); - - foreach (QSeries* s, mSeriesList) { - for (int i=0; ilegendEntries().count(); i++) { - LegendMarker *marker = new LegendMarker(s, this); - marker->setBrush(s->legendEntries().at(i).mBrush); - marker->setName(s->legendEntries().at(i).mName); - mMarkers.append(marker); - childItems().append(marker); - connect(marker,SIGNAL(clicked(QSeries*,QString)),this,SIGNAL(clicked(QSeries*,QString))); - connect(marker,SIGNAL(rightClicked(QSeries*,QString)),this,SIGNAL(rightClicked(QSeries*,QString))); - } +void QLegend::createMarkers(QPieSeries *series) +{ + foreach(QPieSlice* s, series->slices()) { + LegendMarker* marker = new LegendMarker(series,this); + marker->setName(s->label()); + marker->setBrush(s->sliceBrush()); + connect(marker,SIGNAL(clicked(QPieSlice*)),this,SIGNAL(markerClicked(QPieSlice*))); + connect(marker,SIGNAL(rightClicked(QPieSlice*)),this,SIGNAL(markerRightClicked(QPieSlice*))); + mMarkers.append(marker); + childItems().append(marker); } } diff --git a/src/qlegend.h b/src/qlegend.h index b8935e0..af39c53 100644 --- a/src/qlegend.h +++ b/src/qlegend.h @@ -9,6 +9,11 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class Domain; class LegendMarker; +class QPieSlice; +class QXYSeries; +class QBarSet; +class QBarSeries; +class QPieSeries; class QTCOMMERCIALCHART_EXPORT QLegend : public QGraphicsObject { @@ -25,8 +30,12 @@ public: signals: // for interactions. - void clicked(QSeries* series, QString name); - void rightClicked(QSeries* series, QString name); + void clicked(QSeries* series); + void rightClicked(QSeries* series); + void clicked(QBarSet* barset); + void rightClicked(QBarSet* series); + void clicked(QPieSlice* slice); + void rightClicked(QPieSlice* series); public slots: void handleSeriesAdded(QSeries* series,Domain* domain); @@ -34,8 +43,13 @@ public slots: void handleGeometryChanged(const QRectF& size); private: - void dataChanged(); + // PIMPL ---> + void createMarker(QXYSeries* series); + void createMarkers(QBarSeries* series); + void createMarkers(QPieSeries* series); void layoutChanged(); + // <--- PIMPL + QRectF mBoundingRect; QList mSeriesList; diff --git a/src/qseries.h b/src/qseries.h index 6fbf9d5..30da188 100644 --- a/src/qseries.h +++ b/src/qseries.h @@ -37,6 +37,7 @@ protected: public: virtual ~QSeries() {} virtual QSeriesType type() const = 0; + QString name() { return QString("TODO: Name QSeries"); } // TODO virtual bool setModel(QAbstractItemModel* /*model*/) { return false; }