qlegend.cpp
140 lines
| 3.4 KiB
| text/x-c
|
CppLexer
/ src / qlegend.cpp
sauimone
|
r524 | #include "qchartglobal.h" | ||
#include "qlegend.h" | ||||
#include "qseries.h" | ||||
sauimone
|
r529 | #include <QPainter> | ||
#include <QPen> | ||||
sauimone
|
r524 | |||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
sauimone
|
r529 | |||
// TODO: this to legendmarker_p.h header | ||||
class LegendMarker : public QGraphicsItem | ||||
{ | ||||
public: | ||||
LegendMarker(QGraphicsItem *parent = 0) : QGraphicsItem(parent) | ||||
,mBoundingRect(0,0,1,1) | ||||
{} | ||||
void setBoundingRect(const QRectF rect) { mBoundingRect = rect; } | ||||
void setBrush(const QBrush brush) { mBrush = brush; } | ||||
void setName(const QString name) { mName = name; } | ||||
QString name() const { return mName; } | ||||
QColor color() const { return mBrush.color(); } | ||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) | ||||
{ | ||||
painter->setBrush(mBrush); | ||||
painter->drawRect(mBoundingRect); | ||||
} | ||||
QRectF boundingRect() const { return mBoundingRect; } | ||||
private: | ||||
QRectF mBoundingRect; | ||||
QBrush mBrush; | ||||
QString mName; | ||||
}; | ||||
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(); | ||||
painter->setPen(m->color()); | ||||
sauimone
|
r540 | painter->drawText(r.x() + 20, 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
|
r529 | dataChanged(); | ||
layoutChanged(); | ||||
sauimone
|
r524 | } | ||
void QLegend::handleSeriesRemoved(QSeries* series) | ||||
{ | ||||
mSeriesList.removeOne(series); | ||||
sauimone
|
r529 | dataChanged(); | ||
layoutChanged(); | ||||
} | ||||
void QLegend::handleGeometryChanged(const QRectF& size) | ||||
{ | ||||
mBoundingRect = size; | ||||
layoutChanged(); | ||||
sauimone
|
r524 | } | ||
sauimone
|
r529 | void QLegend::dataChanged() | ||
{ | ||||
foreach (QGraphicsItem* i, childItems()) { | ||||
delete i; | ||||
} | ||||
mMarkers.clear(); | ||||
foreach (QSeries* s, mSeriesList) { | ||||
for (int i=0; i<s->legendEntries().count(); i++) { | ||||
LegendMarker *marker = new LegendMarker(this); | ||||
marker->setBrush(s->legendEntries().at(i).mBrush); | ||||
marker->setName(s->legendEntries().at(i).mName); | ||||
mMarkers.append(marker); | ||||
sauimone
|
r540 | // 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) { | ||
sauimone
|
r540 | qDebug() << "marker x:" << x; | ||
qDebug() << "marker y:" << y; | ||||
sauimone
|
r529 | m->setBoundingRect(QRectF(x,y,markerSize.width(),markerSize.height())); | ||
sauimone
|
r540 | x += xStep; | ||
sauimone
|
r529 | } | ||
} | ||||
sauimone
|
r524 | |||
#include "moc_qlegend.cpp" | ||||
QTCOMMERCIALCHART_END_NAMESPACE | ||||