qlegend.cpp
202 lines
| 5.1 KiB
| text/x-c
|
CppLexer
/ src / qlegend.cpp
sauimone
|
r524 | #include "qchartglobal.h" | ||
#include "qlegend.h" | ||||
#include "qseries.h" | ||||
sauimone
|
r547 | #include "legendmarker_p.h" | ||
sauimone
|
r565 | #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" | ||||
sauimone
|
r529 | #include <QPainter> | ||
#include <QPen> | ||||
sauimone
|
r524 | |||
sauimone
|
r547 | #include <QGraphicsSceneEvent> | ||
sauimone
|
r529 | |||
sauimone
|
r547 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
sauimone
|
r529 | |||
sauimone
|
r524 | QLegend::QLegend(QGraphicsItem *parent) | ||
: QGraphicsObject(parent) | ||||
sauimone
|
r529 | ,mBoundingRect(0,0,1,1) | ||
sauimone
|
r540 | ,mBackgroundBrush(Qt::darkGray) // TODO: from theme? | ||
sauimone
|
r524 | { | ||
} | ||||
void QLegend::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | ||||
{ | ||||
sauimone
|
r540 | painter->setBrush(mBackgroundBrush); | ||
painter->drawRect(mBoundingRect); | ||||
sauimone
|
r529 | foreach(LegendMarker* m, mMarkers) { | ||
QRectF r = m->boundingRect(); | ||||
sauimone
|
r565 | painter->setBrush(m->brush()); | ||
sauimone
|
r547 | painter->drawText(r.x() + r.width()*2, r.y() + r.height(), m->name()); | ||
sauimone
|
r524 | } | ||
} | ||||
QRectF QLegend::boundingRect() const | ||||
{ | ||||
return mBoundingRect; | ||||
} | ||||
sauimone
|
r540 | void QLegend::setBackgroundBrush(const QBrush& brush) | ||
{ | ||||
mBackgroundBrush = brush; | ||||
} | ||||
QBrush QLegend::backgroundBrush() const | ||||
{ | ||||
return mBackgroundBrush; | ||||
} | ||||
sauimone
|
r524 | void QLegend::handleSeriesAdded(QSeries* series,Domain* domain) | ||
{ | ||||
mSeriesList.append(series); | ||||
sauimone
|
r565 | |||
switch (series->type()) | ||||
{ | ||||
case QSeries::SeriesTypeLine: { | ||||
QLineSeries* lineSeries = static_cast<QLineSeries*>(series); | ||||
createMarker(lineSeries); | ||||
break; | ||||
} | ||||
case QSeries::SeriesTypeArea: { | ||||
QAreaSeries* areaSeries = static_cast<QAreaSeries*>(series); | ||||
createMarker(areaSeries->upperSeries()); | ||||
Michal Klocek
|
r572 | if(areaSeries->lowerSeries()) | ||
sauimone
|
r565 | createMarker(areaSeries->lowerSeries()); | ||
break; | ||||
} | ||||
case QSeries::SeriesTypeBar: { | ||||
QBarSeries* barSeries = static_cast<QBarSeries*>(series); | ||||
createMarkers(barSeries); | ||||
break; | ||||
} | ||||
case QSeries::SeriesTypeStackedBar: { | ||||
QStackedBarSeries* stackedBarSeries = static_cast<QStackedBarSeries*>(series); | ||||
createMarkers(stackedBarSeries); | ||||
break; | ||||
} | ||||
case QSeries::SeriesTypePercentBar: { | ||||
QPercentBarSeries* percentBarSeries = static_cast<QPercentBarSeries*>(series); | ||||
createMarkers(percentBarSeries); | ||||
break; | ||||
} | ||||
case QSeries::SeriesTypeScatter: { | ||||
QScatterSeries *scatterSeries = static_cast<QScatterSeries *>(series); | ||||
createMarker(scatterSeries); | ||||
break; | ||||
} | ||||
case QSeries::SeriesTypePie: { | ||||
QPieSeries *pieSeries = static_cast<QPieSeries *>(series); | ||||
createMarkers(pieSeries); | ||||
break; | ||||
} | ||||
case QSeries::SeriesTypeSpline: { | ||||
QSplineSeries* splineSeries = static_cast<QSplineSeries*>(series); | ||||
break; | ||||
} | ||||
default: { | ||||
qDebug()<< "QLegend::handleSeriesAdded" << series->type() << "not implemented."; | ||||
break; | ||||
} | ||||
} | ||||
sauimone
|
r529 | layoutChanged(); | ||
sauimone
|
r524 | } | ||
void QLegend::handleSeriesRemoved(QSeries* series) | ||||
{ | ||||
sauimone
|
r565 | // TODO: delete markers, disconnect. | ||
sauimone
|
r524 | mSeriesList.removeOne(series); | ||
sauimone
|
r529 | layoutChanged(); | ||
} | ||||
void QLegend::handleGeometryChanged(const QRectF& size) | ||||
{ | ||||
mBoundingRect = size; | ||||
layoutChanged(); | ||||
sauimone
|
r524 | } | ||
sauimone
|
r565 | void QLegend::createMarker(QXYSeries* series) | ||
sauimone
|
r529 | { | ||
sauimone
|
r565 | LegendMarker* marker = new LegendMarker(series,this); | ||
marker->setName(series->name()); | ||||
marker->setBrush(series->brush()); | ||||
sauimone
|
r567 | connect(marker,SIGNAL(clicked(QSeries*,Qt::MouseButton)),this,SIGNAL(clicked(QSeries*,Qt::MouseButton))); | ||
sauimone
|
r565 | mMarkers.append(marker); | ||
childItems().append(marker); | ||||
} | ||||
void QLegend::createMarkers(QBarSeries *series) | ||||
{ | ||||
foreach(QBarSet* s, series->barSets()) { | ||||
sauimone
|
r569 | LegendMarker* marker = new LegendMarker(s,this); | ||
sauimone
|
r565 | marker->setName(s->name()); | ||
marker->setBrush(s->brush()); | ||||
sauimone
|
r567 | connect(marker,SIGNAL(clicked(QBarSet*,Qt::MouseButton)),this,SIGNAL(clicked(QBarSet*,Qt::MouseButton))); | ||
sauimone
|
r565 | mMarkers.append(marker); | ||
childItems().append(marker); | ||||
sauimone
|
r529 | } | ||
sauimone
|
r565 | } | ||
sauimone
|
r529 | |||
sauimone
|
r565 | void QLegend::createMarkers(QPieSeries *series) | ||
{ | ||||
foreach(QPieSlice* s, series->slices()) { | ||||
sauimone
|
r569 | LegendMarker* marker = new LegendMarker(s,this); | ||
sauimone
|
r565 | marker->setName(s->label()); | ||
marker->setBrush(s->sliceBrush()); | ||||
sauimone
|
r567 | connect(marker,SIGNAL(clicked(QPieSlice*,Qt::MouseButton)),this,SIGNAL(clicked(QPieSlice*,Qt::MouseButton))); | ||
sauimone
|
r565 | mMarkers.append(marker); | ||
childItems().append(marker); | ||||
sauimone
|
r529 | } | ||
} | ||||
void QLegend::layoutChanged() | ||||
{ | ||||
// Calculate layout for markers and text | ||||
if (mMarkers.count() <= 0) { | ||||
// Nothing to do | ||||
return; | ||||
} | ||||
// TODO: marker defined by series. | ||||
QSizeF markerSize(10,10); | ||||
// TODO: better layout, this is just concept. | ||||
// Leave some space around markers like this: | x x x x | | ||||
sauimone
|
r540 | qreal steps = mMarkers.count(); | ||
sauimone
|
r529 | |||
sauimone
|
r540 | qreal xStep = mBoundingRect.width() / steps; | ||
sauimone
|
r529 | qreal yStep = mBoundingRect.height() / steps; | ||
sauimone
|
r540 | qreal x = mBoundingRect.x() + 5; | ||
qreal y = mBoundingRect.y() + (mBoundingRect.height() - markerSize.height())/2; | ||||
sauimone
|
r529 | foreach (LegendMarker* m, mMarkers) { | ||
m->setBoundingRect(QRectF(x,y,markerSize.width(),markerSize.height())); | ||||
sauimone
|
r540 | x += xStep; | ||
sauimone
|
r529 | } | ||
} | ||||
sauimone
|
r524 | |||
#include "moc_qlegend.cpp" | ||||
QTCOMMERCIALCHART_END_NAMESPACE | ||||