mirror of
https://github.com/fralx/LimeReport.git
synced 2025-09-23 08:29:07 +03:00
Refactor axis data. Remove duplicate paint code
This commit is contained in:
@@ -36,8 +36,8 @@ void HorizontalBarChart::paintHorizontalBars(QPainter *painter, QRectF barsRect)
|
||||
|
||||
painter->save();
|
||||
painter->setRenderHint(QPainter::Antialiasing,false);
|
||||
int delta = int(maxValue()-minValue());
|
||||
delta = genNextValue(delta);
|
||||
const AxisData &yAxisData = this->yAxisData();
|
||||
const qreal delta = yAxisData.delta();
|
||||
|
||||
qreal vStep = (barsRect.height()-painter->fontMetrics().height()) / valuesCount() / seriesCount();
|
||||
qreal hStep = (barsRect.width()-painter->fontMetrics().boundingRect(QString::number(maxValue())).width()) / delta;
|
||||
|
@@ -68,35 +68,70 @@ void LinesChart::drawDesignMode(QPainter* painter, qreal hStep, qreal vStep, qre
|
||||
}
|
||||
}
|
||||
|
||||
qreal LinesChart::calculateValueYPos(qreal, qreal max, qreal value, qreal delta, qreal height)
|
||||
{
|
||||
return (max - value) / delta * height;
|
||||
}
|
||||
|
||||
void LinesChart::paintSeries(QPainter *painter, SeriesItem *series, QRectF barsRect)
|
||||
{
|
||||
const AxisData &yAxisData = this->yAxisData();
|
||||
const qreal delta = yAxisData.delta();
|
||||
|
||||
const qreal hStep = barsRect.width() / valuesCount();
|
||||
const qreal topMargin = barsRect.top();
|
||||
|
||||
QPen pen(series->color());
|
||||
pen.setWidth(4);
|
||||
painter->setPen(pen);
|
||||
|
||||
const QList<qreal> &values = series->data()->values();
|
||||
|
||||
qreal lastYValue = 0;
|
||||
qreal lastXValue = barsRect.left() + hStep/2;
|
||||
if (!values.isEmpty()) {
|
||||
// Calculate first point position on plot before loop
|
||||
lastYValue = calculateValueYPos(yAxisData.rangeMin(), yAxisData.rangeMax(), values.first(), delta, barsRect.height());
|
||||
}
|
||||
for (int i = 0; i < values.count()-1; ++i ){
|
||||
const qreal startY = lastYValue;
|
||||
const qreal endY = calculateValueYPos(yAxisData.rangeMin(), yAxisData.rangeMax(), values.at(i+1), delta, barsRect.height());
|
||||
// Record last used Y position to only calculate new one
|
||||
lastYValue = endY;
|
||||
|
||||
const qreal startX = lastXValue;
|
||||
const qreal endX = startX + hStep;
|
||||
// Record last used X position to only calculate new one
|
||||
lastXValue = endX;
|
||||
|
||||
QPoint startPoint = QPoint(startX, startY + topMargin);
|
||||
QPoint endPoint = QPoint(endX, endY + topMargin);
|
||||
drawSegment(painter, startPoint, endPoint, series->color());
|
||||
}
|
||||
}
|
||||
|
||||
void LinesChart::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->itemMode() != DesignMode){
|
||||
foreach (SeriesItem* series, m_chartItem->series()) {
|
||||
QPen pen(series->color());
|
||||
pen.setWidth(4);
|
||||
painter->setPen(pen);
|
||||
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());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (m_chartItem->itemMode() == DesignMode){
|
||||
const AxisData &yAxisData = this->yAxisData();
|
||||
const qreal delta = yAxisData.delta();
|
||||
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;
|
||||
}
|
||||
|
||||
for (SeriesItem *series : m_chartItem->series()) {
|
||||
paintSeries(painter, series, barsRect);
|
||||
}
|
||||
|
||||
painter->restore();
|
||||
}
|
||||
|
||||
|
@@ -8,9 +8,13 @@ class LinesChart: public AbstractBarChart{
|
||||
public:
|
||||
LinesChart(ChartItem* chartItem):AbstractBarChart(chartItem){}
|
||||
void paintChart(QPainter *painter, QRectF chartRect);
|
||||
protected:
|
||||
void drawDesignMode(QPainter *painter, qreal hStep, qreal vStep, qreal topShift, QRectF barsRect);
|
||||
qreal calculateValueYPos(qreal min, qreal max, qreal value, qreal delta, qreal height);
|
||||
void paintSeries(QPainter *painter, SeriesItem *series, QRectF barsRect);
|
||||
|
||||
private:
|
||||
void paintSerialLines(QPainter *painter, QRectF barsRect);
|
||||
void drawDesignMode(QPainter *painter, qreal hStep, qreal vStep, qreal topShift, QRectF barsRect);
|
||||
};
|
||||
}
|
||||
|
||||
|
@@ -54,8 +54,8 @@ void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect)
|
||||
|
||||
if (valuesCount() == 0) return;
|
||||
|
||||
int delta = int(maxValue() - minValue());
|
||||
delta = genNextValue(delta);
|
||||
const AxisData &yAxisData = this->yAxisData();
|
||||
const qreal delta = yAxisData.delta();
|
||||
|
||||
int barSeriesCount = 0;
|
||||
foreach(SeriesItem* series, m_chartItem->series()){
|
||||
@@ -102,30 +102,14 @@ void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect)
|
||||
|
||||
void VerticalBarChart::paintSerialLines(QPainter* painter, QRectF barsRect)
|
||||
{
|
||||
if (valuesCount() == 0 ) return;
|
||||
if (valuesCount() == 0 || m_chartItem->series().isEmpty() ) 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());
|
||||
}
|
||||
}
|
||||
for (SeriesItem *series : m_chartItem->series()) {
|
||||
if (series->preferredType() == SeriesItem::Line){
|
||||
paintSeries(painter, series, barsRect);
|
||||
}
|
||||
}
|
||||
painter->restore();
|
||||
|
@@ -1,13 +1,13 @@
|
||||
#ifndef VERTICALBARCHART_H
|
||||
#define VERTICALBARCHART_H
|
||||
|
||||
#include "lrchartitem.h"
|
||||
#include "lrlineschart.h"
|
||||
|
||||
namespace LimeReport{
|
||||
|
||||
class VerticalBarChart: public AbstractBarChart{
|
||||
class VerticalBarChart: public LinesChart{
|
||||
public:
|
||||
VerticalBarChart(ChartItem* chartItem):AbstractBarChart(chartItem){}
|
||||
VerticalBarChart(ChartItem* chartItem):LinesChart(chartItem){}
|
||||
void paintChart(QPainter *painter, QRectF chartRect);
|
||||
// void paintVerticalGrid(QPainter *painter, QRectF gridRect);
|
||||
void paintVerticalBars(QPainter *painter, QRectF barsRect);
|
||||
|
Reference in New Issue
Block a user