#include "lrverticalbarchart.h" namespace LimeReport{ void VerticalBarChart::paintChart(QPainter *painter, QRectF chartRect) { QRectF calcRect = horizontalLabelsRect( painter, chartRect.adjusted( hPadding(chartRect) * 2 + valuesHMargin(painter), chartRect.height() - (painter->fontMetrics().height() + vPadding(chartRect) * 2), -(hPadding(chartRect) * 2), -vPadding(chartRect) ) ); qreal barsShift = calcRect.height(); paintVerticalGrid( painter, chartRect.adjusted( hPadding(chartRect), vPadding(chartRect) + valuesVMargin(painter), -hPadding(chartRect), -(vPadding(chartRect) + barsShift) ) ); paintVerticalBars( painter, chartRect.adjusted( hPadding(chartRect) * 2 + valuesHMargin(painter), vPadding(chartRect) + valuesVMargin(painter), -hPadding(chartRect) * 2, -(vPadding(chartRect) + barsShift) ) ); paintSerialLines( painter, chartRect.adjusted( hPadding(chartRect) * 2 + valuesHMargin(painter), vPadding(chartRect) + valuesVMargin(painter), -hPadding(chartRect) * 2, -(vPadding(chartRect) + barsShift) ) ); paintHorizontalLabels(painter, calcRect); } void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect) { if (valuesCount() == 0) return; int delta = int(maxValue() - minValue()); delta = genNextValue(delta); int barSeriesCount = 0; foreach(SeriesItem* series, m_chartItem->series()){ if (series->preferredType() == SeriesItem::Bar) barSeriesCount++; } barSeriesCount = (m_chartItem->itemMode() == DesignMode) ? seriesCount() : barSeriesCount; if (barSeriesCount < 1) return; painter->save(); painter->setRenderHint(QPainter::Antialiasing,false); qreal vStep = barsRect.height() / delta; qreal hStep = (barsRect.width() / valuesCount()) / (barSeriesCount == 0 ? 1 : barSeriesCount); qreal topShift = (delta - (maxValue() - minValue())) * vStep + barsRect.top(); qDebug() << "vStep" << vStep << "hStep" << hStep; if (!m_chartItem->series().isEmpty() && (m_chartItem->itemMode() != DesignMode)){ int curSeries = 0; foreach (SeriesItem* series, m_chartItem->series()) { if (series->preferredType() == SeriesItem::Bar){ qreal curHOffset = curSeries * hStep + barsRect.left(); painter->setBrush(series->color()); foreach (qreal value, series->data()->values()) { painter->drawRect(QRectF(curHOffset, maxValue() * vStep + topShift, hStep, -value * vStep)); curHOffset += hStep * barSeriesCount; } curSeries++; } } } else { qreal curHOffset = barsRect.left(); int curColor = 0; for (int i = 0; i < 9; ++i){ if (curColor == 3) curColor = 0; painter->setBrush(color_map[curColor]); painter->drawRect(QRectF(curHOffset, maxValue() * vStep + barsRect.top(), hStep, -designValues()[i] * vStep)); curHOffset += hStep; curColor++; } } painter->restore(); } void VerticalBarChart::paintSerialLines(QPainter* painter, QRectF barsRect) { if (valuesCount() == 0 ) return; painter->save(); painter->setRenderHint(QPainter::Antialiasing,true); int delta = int(maxValue() - minValue()); delta = genNextValue(delta); qreal vStep = barsRect.height() / delta; qreal hStep = (barsRect.width() / valuesCount()); qreal topShift = (delta - (maxValue()-minValue())) * vStep + barsRect.top(); if (!m_chartItem->series().isEmpty()){ foreach (SeriesItem* series, m_chartItem->series()) { if (series->preferredType() == SeriesItem::Line){ for (int i = 0; i < series->data()->values().count()-1; ++i ){ QPoint startPoint = QPoint((i+1)*hStep + barsRect.left()-hStep/2, (maxValue() * vStep+topShift) - series->data()->values().at(i) * vStep ); QPoint endPoint = QPoint((i+2)*hStep + barsRect.left()-hStep/2, (maxValue() * vStep+topShift) - series->data()->values().at(i+1) * vStep ); drawSegment(painter, startPoint, endPoint, series->color()); } } } } painter->restore(); } } // namespace LimeReport