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