stackedbargroup.cpp
134 lines
| 3.2 KiB
| text/x-c
|
CppLexer
|
r105 | #include "stackedbargroup.h" | ||
|
r96 | #include "bar.h" | ||
#include <QDebug> | ||||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
|
r105 | StackedBarGroup::StackedBarGroup(StackedBarChartSeries& series, QGraphicsItem *parent) : | ||
ChartItem(parent) | ||||
,mSeries(series) | ||||
,mLayoutSet(false) | ||||
,mLayoutDirty(true) | ||||
,mBarDefaultWidth(20) // TODO: remove hard coding, when we have layout code ready | ||||
|
r96 | { | ||
dataChanged(); | ||||
} | ||||
|
r105 | |||
void StackedBarGroup::setSize(const QSize& size) | ||||
|
r103 | { | ||
|
r105 | // qDebug() << "StackedBarGroup::setSize"; | ||
|
r96 | mWidth = size.width(); | ||
mHeight = size.height(); | ||||
layoutChanged(); | ||||
mLayoutSet = true; | ||||
} | ||||
|
r105 | void StackedBarGroup::setPlotDomain(const PlotDomain& data) | ||
|
r103 | { | ||
|
r105 | qDebug() << "StackedBarGroup::setPlotDomain"; | ||
|
r103 | // TODO: | ||
} | ||||
|
r105 | void StackedBarGroup::setBarWidth( int w ) | ||
|
r96 | { | ||
mBarDefaultWidth = w; | ||||
} | ||||
|
r105 | int StackedBarGroup::addColor( QColor color ) | ||
|
r96 | { | ||
int colorIndex = mColors.count(); | ||||
mColors.append(color); | ||||
return colorIndex; | ||||
} | ||||
|
r105 | void StackedBarGroup::resetColors() | ||
|
r96 | { | ||
mColors.clear(); | ||||
} | ||||
|
r105 | void StackedBarGroup::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | ||
|
r96 | { | ||
if (!mLayoutSet) { | ||||
qDebug() << "QBarChart::paint called without layout set. Aborting."; | ||||
return; | ||||
} | ||||
if (mLayoutDirty) { | ||||
// Layout or data has changed. Need to redraw. | ||||
foreach(QGraphicsItem* i, childItems()) { | ||||
i->paint(painter,option,widget); | ||||
} | ||||
} | ||||
} | ||||
|
r105 | QRectF StackedBarGroup::boundingRect() const | ||
|
r96 | { | ||
return QRectF(0,0,mWidth,mHeight); | ||||
} | ||||
|
r105 | void StackedBarGroup::dataChanged() | ||
|
r96 | { | ||
qDebug() << "QBarChart::dataChanged mSeries"; | ||||
// Find out maximum and minimum of all series | ||||
mMax = mSeries.max(); | ||||
mMin = mSeries.min(); | ||||
// Delete old bars | ||||
// Is this correct way to delete childItems? | ||||
foreach (QGraphicsItem* item, childItems()) { | ||||
delete item; | ||||
} | ||||
// Create new graphic items for bars | ||||
int totalItems = mSeries.countTotalItems(); | ||||
for (int i=0; i<totalItems; i++) { | ||||
Bar *bar = new Bar(this); | ||||
childItems().append(bar); | ||||
} | ||||
mLayoutDirty = true; | ||||
} | ||||
|
r105 | void StackedBarGroup::layoutChanged() | ||
|
r96 | { | ||
// Scale bars to new layout | ||||
// Layout for bars: | ||||
if (mSeries.countRows() <= 0) { | ||||
// Nothing to do. | ||||
return; | ||||
} | ||||
// TODO: better way to auto-layout | ||||
|
r99 | // Use reals for accurancy (we might get some compiler warnings... :) | ||
|
r105 | qreal maxSum = mSeries.maxColumnSum(); | ||
qreal h = mHeight; | ||||
qreal scale = (h / maxSum); | ||||
|
r96 | int count = mSeries.countColumns(); | ||
int itemIndex(0); | ||||
|
r98 | qreal tW = mWidth; | ||
qreal tC = count+1; | ||||
qreal xStep = (tW/tC); | ||||
qreal xPos = ((tW/tC) + mBarDefaultWidth / 2); | ||||
|
r96 | for (int column = 0; column < mSeries.countColumns(); column++) { | ||
|
r98 | qreal yPos = h; | ||
|
r96 | for (int row=0; row < mSeries.countRows(); row++) { | ||
|
r98 | qreal barHeight = mSeries.valueAt(row, column) * scale; | ||
|
r96 | Bar* bar = reinterpret_cast<Bar*> (childItems().at(itemIndex)); | ||
// TODO: width settable per bar? | ||||
bar->resize(mBarDefaultWidth, barHeight); | ||||
bar->setColor(mColors.at(row)); | ||||
bar->setPos(xPos, yPos); | ||||
itemIndex++; | ||||
|
r97 | yPos -= barHeight; | ||
|
r96 | } | ||
|
r98 | xPos += xStep; | ||
|
r96 | } | ||
mLayoutDirty = true; | ||||
} | ||||
QTCOMMERCIALCHART_END_NAMESPACE | ||||