0
0
mirror of https://github.com/fralx/LimeReport.git synced 2024-12-25 00:54:39 +03:00

ChartItem has been updated

This commit is contained in:
Arin Alexander 2017-09-27 01:05:22 +03:00
parent af589e31ba
commit cc0dad863e
6 changed files with 135 additions and 17 deletions

View File

@ -77,10 +77,9 @@ void SeriesItem::setLabelsColumn(const QString &labelsColumn)
SeriesItem *SeriesItem::clone() SeriesItem *SeriesItem::clone()
{ {
SeriesItem* result = new SeriesItem(); SeriesItem* result = new SeriesItem();
result->setName(name()); for (int i = 0; i < this->metaObject()->propertyCount(); ++i){
result->setLabelsColumn(labelsColumn()); result->setProperty(this->metaObject()->property(i).name(),property(this->metaObject()->property(i).name()));
result->setValuesColumn(valuesColumn()); }
result->setColor(color());
return result; return result;
} }
@ -110,6 +109,16 @@ void SeriesItem::setColor(const QColor &color)
m_color = color; m_color = color;
} }
SeriesItem::SeriesItemPreferredType SeriesItem::preferredType() const
{
return m_preferredType;
}
void SeriesItem::setPreferredType(const SeriesItemPreferredType& type)
{
m_preferredType = type;
}
ChartItem::ChartItem(QObject *owner, QGraphicsItem *parent) ChartItem::ChartItem(QObject *owner, QGraphicsItem *parent)
: ItemDesignIntf(xmlTag, owner, parent), m_legendBorder(true), : ItemDesignIntf(xmlTag, owner, parent), m_legendBorder(true),
m_legendAlign(LegendAlignCenter), m_titleAlign(TitleAlignCenter), m_legendAlign(LegendAlignCenter), m_titleAlign(TitleAlignCenter),
@ -665,6 +674,11 @@ void VerticalBarChart::paintChart(QPainter *painter, QRectF chartRect)
vPadding(chartRect)+valuesVMargin(painter), vPadding(chartRect)+valuesVMargin(painter),
-(hPadding(chartRect)*2), -(hPadding(chartRect)*2),
-(vPadding(chartRect)+barsShift) )); -(vPadding(chartRect)+barsShift) ));
paintSerialLines(painter, chartRect.adjusted(
hPadding(chartRect)*2+valuesHMargin(painter),
vPadding(chartRect)+valuesVMargin(painter),
-(hPadding(chartRect)*2),
-(vPadding(chartRect)+barsShift) ));
paintLabels(painter,calcRect); paintLabels(painter,calcRect);
} }
@ -692,25 +706,36 @@ void VerticalBarChart::paintVerticalGrid(QPainter *painter, QRectF gridRect)
void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect) void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect)
{ {
painter->save();
painter->setRenderHint(QPainter::Antialiasing,false);
int delta = int(maxValue()-minValue()); int delta = int(maxValue()-minValue());
delta = genNextValue(delta); 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;
painter->save();
painter->setRenderHint(QPainter::Antialiasing,false);
qreal vStep = barsRect.height() / delta; qreal vStep = barsRect.height() / delta;
qreal hStep = (barsRect.width() / valuesCount()) / seriesCount(); qreal hStep = (barsRect.width() / valuesCount()) / (barSeriesCount == 0 ? 1 : barSeriesCount);
qreal topShift = (delta - (maxValue()-minValue())) * vStep +barsRect.top(); qreal topShift = (delta - (maxValue()-minValue())) * vStep +barsRect.top();
if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){
int curSeries = 0; int curSeries = 0;
foreach (SeriesItem* series, m_chartItem->series()) { foreach (SeriesItem* series, m_chartItem->series()) {
qreal curHOffset = curSeries*hStep+barsRect.left(); if (series->preferredType() == SeriesItem::Bar){
painter->setBrush(series->color()); qreal curHOffset = curSeries*hStep+barsRect.left();
foreach (qreal value, series->data()->values()) { painter->setBrush(series->color());
painter->drawRect(QRectF(curHOffset, maxValue()*vStep+topShift, hStep, -value*vStep)); foreach (qreal value, series->data()->values()) {
curHOffset+=hStep*seriesCount(); painter->drawRect(QRectF(curHOffset, maxValue()*vStep+topShift, hStep, -value*vStep));
curHOffset+=hStep*barSeriesCount;
}
curSeries++;
} }
curSeries++;
} }
} else { } else {
qreal curHOffset = barsRect.left(); qreal curHOffset = barsRect.left();
@ -726,6 +751,47 @@ void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect)
painter->restore(); painter->restore();
} }
void VerticalBarChart::paintSerialLines(QPainter* painter, QRectF barsRect)
{
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() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){
int curSeries = 0;
foreach (SeriesItem* series, m_chartItem->series()) {
if (series->preferredType() == SeriesItem::Line){
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
);
painter->drawLine(startPoint, endPoint);
QRect startPointRect(startPoint,startPoint);
QRect endPointRect(endPoint,endPoint);
int radius = 4;
painter->setBrush(series->color());
painter->drawEllipse(startPointRect.adjusted(radius,radius,-radius,-radius));
painter->drawEllipse(endPointRect.adjusted(radius,radius,-radius,-radius));
}
}
curSeries++;
}
}
painter->restore();
}
void VerticalBarChart::paintLabels(QPainter *painter, QRectF labelsRect) void VerticalBarChart::paintLabels(QPainter *painter, QRectF labelsRect)

View File

@ -1,6 +1,7 @@
#ifndef LRCHARTITEM_H #ifndef LRCHARTITEM_H
#define LRCHARTITEM_H #define LRCHARTITEM_H
#include "lritemdesignintf.h" #include "lritemdesignintf.h"
#include "lrglobal.h"
namespace LimeReport{ namespace LimeReport{
@ -27,8 +28,11 @@ class SeriesItem : public QObject{
Q_PROPERTY(QString valuesColumn READ valuesColumn WRITE setValuesColumn ) Q_PROPERTY(QString valuesColumn READ valuesColumn WRITE setValuesColumn )
Q_PROPERTY(QString labelsColumn READ labelsColumn WRITE setLabelsColumn ) Q_PROPERTY(QString labelsColumn READ labelsColumn WRITE setLabelsColumn )
Q_PROPERTY(QColor color READ color WRITE setColor) Q_PROPERTY(QColor color READ color WRITE setColor)
Q_PROPERTY(SeriesItemPreferredType preferredType READ preferredType WRITE setPreferredType)
Q_ENUMS(SeriesItemPreferredType)
public: public:
SeriesItem(QObject* parent = 0):QObject(parent){} enum SeriesItemPreferredType {Bar, Line};
SeriesItem(QObject* parent = 0) : QObject(parent), m_preferredType(Bar){}
QString name() const; QString name() const;
void setName(const QString &name); void setName(const QString &name);
QString valuesColumn() const; QString valuesColumn() const;
@ -40,12 +44,15 @@ public:
SeriesItemData* data(){ return &m_data;} SeriesItemData* data(){ return &m_data;}
QColor color() const; QColor color() const;
void setColor(const QColor &color); void setColor(const QColor &color);
SeriesItemPreferredType preferredType() const;
void setPreferredType(const SeriesItemPreferredType& preferredType);
private: private:
QString m_name; QString m_name;
QString m_valuesColumn; QString m_valuesColumn;
QString m_labelsColumn; QString m_labelsColumn;
SeriesItemData m_data; SeriesItemData m_data;
QColor m_color; QColor m_color;
SeriesItemPreferredType m_preferredType;
}; };
class ChartItem; class ChartItem;
@ -121,6 +128,7 @@ public:
void paintChart(QPainter *painter, QRectF chartRect); void paintChart(QPainter *painter, QRectF chartRect);
void paintVerticalGrid(QPainter *painter, QRectF gridRect); void paintVerticalGrid(QPainter *painter, QRectF gridRect);
void paintVerticalBars(QPainter *painter, QRectF barsRect); void paintVerticalBars(QPainter *painter, QRectF barsRect);
void paintSerialLines(QPainter *painter, QRectF barsRect);
void paintLabels(QPainter *painter, QRectF labelsRect); void paintLabels(QPainter *painter, QRectF labelsRect);
}; };

View File

@ -22,7 +22,6 @@ ChartItemEditor::ChartItemEditor(LimeReport::ChartItem *item, LimeReport::PageDe
colorLayout->insertStretch(0); colorLayout->insertStretch(0);
readSetting(); readSetting();
init(); init();
connect(m_colorButton, SIGNAL(clicked(bool)), this, SLOT(slotChangeSeriesColor())); connect(m_colorButton, SIGNAL(clicked(bool)), this, SLOT(slotChangeSeriesColor()));
} }
@ -112,6 +111,13 @@ void ChartItemEditor::init()
} }
} }
static int enumIndex = LimeReport::SeriesItem::staticMetaObject.indexOfEnumerator("SeriesItemPreferredType");
QMetaEnum enumerator = LimeReport::SeriesItem::staticMetaObject.enumerator(enumIndex);
for (int i = 0; i<enumerator.keyCount(); ++i){
ui->seriesTypeComboBox->addItem(enumerator.key(i));
}
ui->labelsFieldComboBox->setCurrentText(m_charItem->labelsField()); ui->labelsFieldComboBox->setCurrentText(m_charItem->labelsField());
if (!m_charItem->series().isEmpty()){ if (!m_charItem->series().isEmpty()){
enableSeriesEditor(); enableSeriesEditor();
@ -127,6 +133,7 @@ void ChartItemEditor::enableSeriesEditor()
{ {
ui->seriesNameLineEdit->setEnabled(true); ui->seriesNameLineEdit->setEnabled(true);
ui->valuesFieldComboBox->setEnabled(true); ui->valuesFieldComboBox->setEnabled(true);
ui->seriesTypeComboBox->setEnabled(true);
m_colorButton->setEnabled(true); m_colorButton->setEnabled(true);
m_colorIndicator->setEnabled(true); m_colorIndicator->setEnabled(true);
} }
@ -139,6 +146,7 @@ void ChartItemEditor::disableSeriesEditor()
m_colorButton->setDisabled(true); m_colorButton->setDisabled(true);
m_colorIndicator->setDisabled(true); m_colorIndicator->setDisabled(true);
ui->valuesFieldComboBox->setCurrentText(""); ui->valuesFieldComboBox->setCurrentText("");
ui->seriesTypeComboBox->setDisabled(true);
} }
LimeReport::SeriesItem *ChartItemEditor::currentSeries() LimeReport::SeriesItem *ChartItemEditor::currentSeries()
@ -214,6 +222,9 @@ void ChartItemEditor::on_tableWidget_itemSelectionChanged()
ui->seriesNameLineEdit->setText(series->name()); ui->seriesNameLineEdit->setText(series->name());
ui->valuesFieldComboBox->setCurrentText(series->valuesColumn()); ui->valuesFieldComboBox->setCurrentText(series->valuesColumn());
m_colorIndicator->setColor(series->color()); m_colorIndicator->setColor(series->color());
static int enumIndex = LimeReport::SeriesItem::staticMetaObject.indexOfEnumerator("SeriesItemPreferredType");
QMetaEnum enumerator = LimeReport::SeriesItem::staticMetaObject.enumerator(enumIndex);
ui->seriesTypeComboBox->setCurrentText(enumerator.valueToKey(series->preferredType()));
enableSeriesEditor(); enableSeriesEditor();
} }
} }
@ -247,3 +258,12 @@ void ChartItemEditor::slotChangeSeriesColor()
m_colorIndicator->setColor(colorDialog.selectedColor()); m_colorIndicator->setColor(colorDialog.selectedColor());
} }
} }
void ChartItemEditor::on_seriesTypeComboBox_currentIndexChanged(const QString &arg1)
{
static int enumIndex = LimeReport::SeriesItem::staticMetaObject.indexOfEnumerator("SeriesItemPreferredType");
QMetaEnum enumerator = LimeReport::SeriesItem::staticMetaObject.enumerator(enumIndex);
if (currentSeries()){
currentSeries()->setPreferredType(static_cast<LimeReport::SeriesItem::SeriesItemPreferredType>(enumerator.keysToValue(arg1.toLatin1())));
}
}

View File

@ -35,6 +35,8 @@ private slots:
void on_valuesFieldComboBox_currentTextChanged(const QString &arg1); void on_valuesFieldComboBox_currentTextChanged(const QString &arg1);
void on_labelsFieldComboBox_currentTextChanged(const QString &arg1); void on_labelsFieldComboBox_currentTextChanged(const QString &arg1);
void slotChangeSeriesColor(); void slotChangeSeriesColor();
void on_seriesTypeComboBox_currentIndexChanged(const QString &arg1);
private: private:
void readSetting(); void readSetting();
void writeSetting(); void writeSetting();

View File

@ -110,6 +110,16 @@
<item row="2" column="1"> <item row="2" column="1">
<widget class="QWidget" name="colorWidget" native="true"/> <widget class="QWidget" name="colorWidget" native="true"/>
</item> </item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Type</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="seriesTypeComboBox"/>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>

View File

@ -1,5 +1,6 @@
#include "lrcolorindicator.h" #include "lrcolorindicator.h"
#include <QPainter> #include <QPainter>
#include <QDebug>
void ColorIndicator::paintEvent(QPaintEvent* event) void ColorIndicator::paintEvent(QPaintEvent* event)
{ {
@ -7,8 +8,19 @@ void ColorIndicator::paintEvent(QPaintEvent* event)
painter.save(); painter.save();
painter.setBrush(m_color); painter.setBrush(m_color);
painter.setPen(Qt::gray); painter.setPen(Qt::gray);
QRect rect = event->rect().adjusted(3,3,-4,-4);
rect.setWidth(rect.height()); QRect rect = event->rect().adjusted(3,3,-3,-3);
if (rect.height() < rect.width()){
qreal offset = (rect.width()-rect.height()) / 2;
rect.setWidth(rect.height());
rect.adjust(offset,0,offset,0);
} else {
qreal offset = (rect.height()-rect.width()) / 2;
rect.setHeight(rect.width());
rect.adjust(0,offset,0,offset);
}
painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::Antialiasing);
painter.drawEllipse(rect); painter.drawEllipse(rect);
painter.restore(); painter.restore();