1 #include "lrverticalbarchart.h"
2
3 namespace LimeReport{
4
paintChart(QPainter * painter,QRectF chartRect)5 void VerticalBarChart::paintChart(QPainter *painter, QRectF chartRect)
6 {
7 QRectF calcRect = horizontalLabelsRect(
8 painter,
9 chartRect.adjusted(
10 hPadding(chartRect) * 2 + valuesHMargin(painter),
11 chartRect.height() - (painter->fontMetrics().height() + vPadding(chartRect) * 2),
12 -(hPadding(chartRect) * 2),
13 -vPadding(chartRect)
14 )
15 );
16 qreal barsShift = calcRect.height();
17 paintVerticalGrid(
18 painter,
19 chartRect.adjusted(
20 hPadding(chartRect),
21 vPadding(chartRect) + valuesVMargin(painter),
22 -hPadding(chartRect),
23 -(vPadding(chartRect) + barsShift)
24 )
25 );
26 paintVerticalBars(
27 painter,
28 chartRect.adjusted(
29 hPadding(chartRect) * 2 + valuesHMargin(painter),
30 vPadding(chartRect) + valuesVMargin(painter),
31 -hPadding(chartRect) * 2,
32 -(vPadding(chartRect) + barsShift)
33 )
34 );
35 paintSerialLines(
36 painter,
37 chartRect.adjusted(
38 hPadding(chartRect) * 2 + valuesHMargin(painter),
39 vPadding(chartRect) + valuesVMargin(painter),
40 -hPadding(chartRect) * 2,
41 -(vPadding(chartRect) + barsShift)
42 )
43 );
44 paintHorizontalLabels(painter, calcRect);
45 }
46
paintVerticalBars(QPainter * painter,QRectF barsRect)47 void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect)
48 {
49
50 int delta = int(maxValue() - minValue());
51 delta = genNextValue(delta);
52
53 int barSeriesCount = 0;
54 foreach(SeriesItem* series, m_chartItem->series()){
55 if (series->preferredType() == SeriesItem::Bar) barSeriesCount++;
56 }
57
58 barSeriesCount = (m_chartItem->itemMode() == DesignMode) ? seriesCount() : barSeriesCount;
59 if (barSeriesCount < 1) return;
60 painter->save();
61 painter->setRenderHint(QPainter::Antialiasing,false);
62
63 qreal vStep = barsRect.height() / delta;
64 qreal hStep = (barsRect.width() / valuesCount()) / (barSeriesCount == 0 ? 1 : barSeriesCount);
65 qreal topShift = (delta - (maxValue() - minValue())) * vStep + barsRect.top();
66
67 if (!m_chartItem->series().isEmpty() && (m_chartItem->itemMode() != DesignMode)){
68 int curSeries = 0;
69 foreach (SeriesItem* series, m_chartItem->series()) {
70 if (series->preferredType() == SeriesItem::Bar){
71 qreal curHOffset = curSeries * hStep + barsRect.left();
72 painter->setBrush(series->color());
73 foreach (qreal value, series->data()->values()) {
74 painter->drawRect(QRectF(curHOffset, maxValue() * vStep + topShift, hStep, -value * vStep));
75 curHOffset += hStep * barSeriesCount;
76 }
77 curSeries++;
78 }
79 }
80 } else {
81 qreal curHOffset = barsRect.left();
82 int curColor = 0;
83 for (int i = 0; i < 9; ++i){
84 if (curColor == 3) curColor = 0;
85 painter->setBrush(color_map[curColor]);
86 painter->drawRect(QRectF(curHOffset, maxValue() * vStep + barsRect.top(), hStep, -designValues()[i] * vStep));
87 curHOffset += hStep;
88 curColor++;
89 }
90 }
91 painter->restore();
92 }
93
paintSerialLines(QPainter * painter,QRectF barsRect)94 void VerticalBarChart::paintSerialLines(QPainter* painter, QRectF barsRect)
95 {
96 painter->save();
97 painter->setRenderHint(QPainter::Antialiasing,true);
98 int delta = int(maxValue() - minValue());
99 delta = genNextValue(delta);
100
101 qreal vStep = barsRect.height() / delta;
102 qreal hStep = (barsRect.width() / valuesCount());
103 qreal topShift = (delta - (maxValue()-minValue())) * vStep + barsRect.top();
104
105 if (!m_chartItem->series().isEmpty()){
106 foreach (SeriesItem* series, m_chartItem->series()) {
107 if (series->preferredType() == SeriesItem::Line){
108 for (int i = 0; i < series->data()->values().count()-1; ++i ){
109 QPoint startPoint = QPoint((i+1)*hStep + barsRect.left()-hStep/2,
110 (maxValue() * vStep+topShift) - series->data()->values().at(i) * vStep
111 );
112 QPoint endPoint = QPoint((i+2)*hStep + barsRect.left()-hStep/2,
113 (maxValue() * vStep+topShift) - series->data()->values().at(i+1) * vStep
114 );
115 drawSegment(painter, startPoint, endPoint, series->color());
116 }
117 }
118 }
119 }
120 painter->restore();
121 }
122
123 } // namespace LimeReport
124