##// END OF EJS Templates
Refactored themes; now enabled for line, scatter and pies...
Refactored themes; now enabled for line, scatter and pies Draft themes implemented for most of the series types. The themes are still missing most of the features, only the line color and line width can be defined.

File last commit:

r103:399cbfcd557c
r103:399cbfcd557c
Show More
stackedbargroup.cpp
144 lines | 3.4 KiB | text/x-c | CppLexer
#include "percentbargroup.h"
#include "bar.h"
#include <QDebug>
QTCOMMERCIALCHART_BEGIN_NAMESPACE
PercentBarGroup::PercentBarGroup(PercentBarChartSeries& series, QGraphicsItem *parent) :
QGraphicsItem(parent)
,mSeries(series)
,mLayoutSet(false)
,mLayoutDirty(true)
,mBarDefaultWidth(20) // TODO: remove hard coding, when we have layout code ready
{
dataChanged();
}
void PercentBarGroup::setPos(const QPointF & pos)
{
qDebug() << "PercentBarGroup::setPos";
// TODO:
}
void PercentBarGroup::resize(const QSize& size)
{
qDebug() << "PercentBarGroup::resize";
mWidth = size.width();
mHeight = size.height();
layoutChanged();
mLayoutSet = true;
}
void PercentBarGroup::setPlotDomain(const PlotDomain& data)
{
qDebug() << "PercentBarGroup::setPlotDomain";
// TODO:
}
void PercentBarGroup::setTheme(ChartTheme *theme)
{
qDebug() << "PercentBarGroup::setTheme";
// TODO:
}
void PercentBarGroup::setBarWidth( int w )
{
mBarDefaultWidth = w;
}
int PercentBarGroup::addColor( QColor color )
{
int colorIndex = mColors.count();
mColors.append(color);
return colorIndex;
}
void PercentBarGroup::resetColors()
{
mColors.clear();
}
void PercentBarGroup::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
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);
}
}
}
QRectF PercentBarGroup::boundingRect() const
{
return QRectF(0,0,mWidth,mHeight);
}
void PercentBarGroup::dataChanged()
{
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;
}
void PercentBarGroup::layoutChanged()
{
// Scale bars to new layout
// Layout for bars:
if (mSeries.countRows() <= 0) {
// Nothing to do.
return;
}
// TODO: better way to auto-layout
// Use reals for accurancy (we might get some compiler warnings... :)
int count = mSeries.countColumns();
int itemIndex(0);
qreal tW = mWidth;
qreal tC = count+1;
qreal xStep = (tW/tC);
qreal xPos = ((tW/tC) + mBarDefaultWidth / 2);
for (int column = 0; column < mSeries.countColumns(); column++) {
qreal colSum = mSeries.columnSum(column);
qreal h = mHeight;
qreal scale = (h / colSum);
qreal yPos = h;
for (int row=0; row < mSeries.countRows(); row++) {
qreal barHeight = mSeries.valueAt(row, column) * scale;
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++;
yPos -= barHeight;
}
xPos += xStep;
}
mLayoutDirty = true;
}
QTCOMMERCIALCHART_END_NAMESPACE