mirror of
https://github.com/fralx/LimeReport.git
synced 2025-10-01 11:31:10 +03:00
Add grid chart
This commit is contained in:
110
limereport/items/charts/lrgridlineschart.cpp
Normal file
110
limereport/items/charts/lrgridlineschart.cpp
Normal file
@@ -0,0 +1,110 @@
|
||||
#include "lrgridlineschart.h"
|
||||
|
||||
namespace LimeReport {
|
||||
void GridLinesChart::paintChart(QPainter *painter, QRectF chartRect)
|
||||
{
|
||||
updateMinAndMaxValues();
|
||||
|
||||
const qreal valuesHMargin = this->valuesHMargin(painter);
|
||||
const qreal valuesVMargin = this->valuesVMargin(painter);
|
||||
|
||||
const qreal hPadding = this->hPadding(chartRect);
|
||||
const qreal vPadding = this->vPadding(chartRect);
|
||||
|
||||
QRectF calcRect = horizontalLabelsRect(
|
||||
painter,
|
||||
chartRect.adjusted(
|
||||
hPadding * 2 + valuesHMargin,
|
||||
chartRect.height() - (painter->fontMetrics().height() + vPadding*2),
|
||||
-(hPadding * 2),
|
||||
-vPadding
|
||||
)
|
||||
);
|
||||
const qreal barsShift = calcRect.height();
|
||||
const qreal topOffset = painter->fontMetrics().height() * (m_chartItem->horizontalAxisOnTop() ? 1 : -1);
|
||||
const QRectF gridRect = chartRect.adjusted(
|
||||
hPadding,
|
||||
vPadding + valuesVMargin + topOffset,
|
||||
-hPadding * 3,
|
||||
-(vPadding + barsShift)
|
||||
);
|
||||
|
||||
paintGrid(painter, gridRect);
|
||||
|
||||
paintSerialLines(
|
||||
painter,
|
||||
gridRect.adjusted(hPadding + valuesHMargin, 0, 0, 0)
|
||||
);
|
||||
paintHorizontalLabels(painter, calcRect);
|
||||
}
|
||||
|
||||
void GridLinesChart::paintSerialLines(QPainter* painter, QRectF barsRect)
|
||||
{
|
||||
if (valuesCount() == 0) return;
|
||||
|
||||
painter->save();
|
||||
painter->setRenderHint(QPainter::Antialiasing,true);
|
||||
|
||||
const AxisData &yAxisData = this->yAxisData();
|
||||
const qreal delta = yAxisData.delta();
|
||||
|
||||
if (m_chartItem->itemMode() == DesignMode){
|
||||
const qreal hStep = barsRect.width() / valuesCount();
|
||||
const qreal vStep = barsRect.height() / delta;
|
||||
const qreal topShift = (delta - (maxValue() - minValue())) * vStep + barsRect.top();
|
||||
drawDesignMode(painter, hStep, vStep, topShift, barsRect);
|
||||
painter->restore();
|
||||
return;
|
||||
}
|
||||
|
||||
const AxisData &xAxisData = this->xAxisData();
|
||||
const qreal hStep = barsRect.width() / (xAxisData.rangeMax() - xAxisData.rangeMin());
|
||||
|
||||
qreal leftMargin = 0;
|
||||
const qreal topMargin = barsRect.top();
|
||||
|
||||
for (SeriesItem* series : m_chartItem->series()) {
|
||||
QPen pen(series->color());
|
||||
pen.setWidth(m_chartItem->seriesLineWidth());
|
||||
painter->setPen(pen);
|
||||
|
||||
const QList<qreal> &xAxisValues = series->data()->xAxisValues();
|
||||
const QList<qreal> &values = series->data()->values();
|
||||
const int xAxisValuesSize = xAxisValues.size();
|
||||
qreal lastXPos = 0;
|
||||
qreal lastYPos = 0;
|
||||
if (!values.isEmpty()) {
|
||||
// Calculate first point position on plot before loop
|
||||
lastYPos = calculatePos(yAxisData, values.first(), barsRect.height());
|
||||
}
|
||||
if (xAxisValues.isEmpty()) {
|
||||
leftMargin = barsRect.left();
|
||||
} else {
|
||||
leftMargin = barsRect.left();
|
||||
lastXPos = calculatePos(xAxisData, xAxisValues.first(), barsRect.width());
|
||||
}
|
||||
for (int i = 0; i < values.count() - 1; ++i ) {
|
||||
const qreal startY = lastYPos;
|
||||
const qreal endY = calculatePos(yAxisData, values.at(i+1), barsRect.height());
|
||||
// Record last used Y position to only calculate new one
|
||||
lastYPos = endY;
|
||||
|
||||
qreal startX = lastXPos;
|
||||
qreal endX = 0;
|
||||
if (i + 1 < xAxisValuesSize) {
|
||||
endX = calculatePos(xAxisData, xAxisValues.at(i+1), barsRect.width());
|
||||
} else {
|
||||
endX = startX + hStep;
|
||||
}
|
||||
// Record last used X position to only calculate new one
|
||||
lastXPos = endX;
|
||||
|
||||
QPoint startPoint = QPoint(startX + leftMargin, startY + topMargin);
|
||||
QPoint endPoint = QPoint(endX + leftMargin, endY + topMargin);
|
||||
drawSegment(painter, startPoint, endPoint, series->color());
|
||||
}
|
||||
}
|
||||
|
||||
painter->restore();
|
||||
}
|
||||
}
|
17
limereport/items/charts/lrgridlineschart.h
Normal file
17
limereport/items/charts/lrgridlineschart.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef GRIDLINESCHART_H
|
||||
#define GRIDLINESCHART_H
|
||||
|
||||
#include "lrlineschart.h"
|
||||
|
||||
namespace LimeReport {
|
||||
class GridLinesChart : public LinesChart{
|
||||
public:
|
||||
GridLinesChart(ChartItem* chartItem):LinesChart(chartItem){}
|
||||
void paintChart(QPainter *painter, QRectF chartRect);
|
||||
|
||||
private:
|
||||
void paintSerialLines(QPainter *painter, QRectF barsRect);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // GRIDLINESCHART_H
|
Reference in New Issue
Block a user