2016-11-02 01:34:45 +03:00
|
|
|
#ifndef LRCHARTITEM_H
|
|
|
|
#define LRCHARTITEM_H
|
|
|
|
#include "lritemdesignintf.h"
|
2017-09-27 01:05:22 +03:00
|
|
|
#include "lrglobal.h"
|
2020-03-03 05:13:46 +03:00
|
|
|
#include <QtGlobal>
|
2016-11-02 01:34:45 +03:00
|
|
|
|
|
|
|
namespace LimeReport{
|
|
|
|
|
|
|
|
QColor generateColor();
|
|
|
|
extern QColor color_map[39];
|
|
|
|
|
|
|
|
class IDataSource;
|
|
|
|
|
|
|
|
class SeriesItemData : public QObject{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
QList<qreal>& values(){ return m_values;}
|
|
|
|
QList<QString>& labels(){ return m_labels;}
|
|
|
|
QList<QColor>& colors() { return m_colors;}
|
2019-12-18 23:13:33 +03:00
|
|
|
void clear(){ m_values.clear(); m_labels.clear(); m_colors.clear(); }
|
2016-11-02 01:34:45 +03:00
|
|
|
private:
|
|
|
|
QList<qreal> m_values;
|
|
|
|
QList<QString> m_labels;
|
|
|
|
QList<QColor> m_colors;
|
|
|
|
};
|
|
|
|
|
|
|
|
class SeriesItem : public QObject{
|
|
|
|
Q_OBJECT
|
|
|
|
Q_PROPERTY(QString name READ name WRITE setName)
|
2021-08-18 05:32:45 +03:00
|
|
|
Q_PROPERTY(QString valuesColumn READ valuesColumn WRITE setValuesColumn)
|
|
|
|
Q_PROPERTY(QString labelsColumn READ labelsColumn WRITE setLabelsColumn)
|
2016-11-02 01:34:45 +03:00
|
|
|
Q_PROPERTY(QColor color READ color WRITE setColor)
|
2017-09-27 01:05:22 +03:00
|
|
|
Q_PROPERTY(SeriesItemPreferredType preferredType READ preferredType WRITE setPreferredType)
|
2016-11-02 01:34:45 +03:00
|
|
|
public:
|
2017-09-27 01:05:22 +03:00
|
|
|
enum SeriesItemPreferredType {Bar, Line};
|
2021-08-24 10:22:30 +03:00
|
|
|
#if QT_VERSION >= 0x050500
|
2020-02-17 07:17:02 +03:00
|
|
|
Q_ENUM(SeriesItemPreferredType)
|
2020-03-03 05:13:46 +03:00
|
|
|
#else
|
2020-03-03 05:19:59 +03:00
|
|
|
Q_ENUMS(SeriesItemPreferredType)
|
2020-03-03 05:13:46 +03:00
|
|
|
#endif
|
2017-09-27 01:05:22 +03:00
|
|
|
SeriesItem(QObject* parent = 0) : QObject(parent), m_preferredType(Bar){}
|
2016-11-02 01:34:45 +03:00
|
|
|
QString name() const;
|
|
|
|
void setName(const QString &name);
|
|
|
|
QString valuesColumn() const;
|
|
|
|
void setValuesColumn(const QString &valuesColumn);
|
|
|
|
QString labelsColumn() const;
|
|
|
|
void setLabelsColumn(const QString &labelsColumn);
|
|
|
|
SeriesItem* clone();
|
|
|
|
void fillSeriesData(IDataSource* dataSource);
|
|
|
|
SeriesItemData* data(){ return &m_data;}
|
|
|
|
QColor color() const;
|
|
|
|
void setColor(const QColor &color);
|
2017-09-27 01:05:22 +03:00
|
|
|
SeriesItemPreferredType preferredType() const;
|
|
|
|
void setPreferredType(const SeriesItemPreferredType& preferredType);
|
2020-04-06 19:48:16 +03:00
|
|
|
bool isEmpty(){ return m_data.values().isEmpty();}
|
2016-11-02 01:34:45 +03:00
|
|
|
private:
|
|
|
|
QString m_name;
|
|
|
|
QString m_valuesColumn;
|
|
|
|
QString m_labelsColumn;
|
|
|
|
SeriesItemData m_data;
|
|
|
|
QColor m_color;
|
2017-09-27 01:05:22 +03:00
|
|
|
SeriesItemPreferredType m_preferredType;
|
2016-11-02 01:34:45 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ChartItem;
|
|
|
|
|
|
|
|
class AbstractChart {
|
|
|
|
public:
|
|
|
|
AbstractChart(ChartItem* chartItem);
|
|
|
|
virtual ~AbstractChart(){}
|
|
|
|
virtual void paintChart(QPainter *painter, QRectF rect) = 0;
|
|
|
|
virtual void paintChartLegend(QPainter *painter, QRectF legendRect) =0;
|
|
|
|
virtual QSizeF calcChartLegendSize(const QFont &font) = 0;
|
|
|
|
virtual QRectF calcChartLegendRect(const QFont& font, const QRectF& parentRect, bool takeAllRect, qreal borderMargin, qreal titleOffset);
|
|
|
|
protected:
|
|
|
|
virtual void prepareLegendToPaint(QRectF& legendRect, QPainter *painter);
|
|
|
|
protected:
|
|
|
|
ChartItem* m_chartItem;
|
|
|
|
QList<QString> m_designLabels;
|
|
|
|
};
|
|
|
|
|
|
|
|
class AbstractSeriesChart: public AbstractChart{
|
|
|
|
public:
|
|
|
|
AbstractSeriesChart(ChartItem* chartItem);
|
|
|
|
protected:
|
|
|
|
qreal maxValue();
|
|
|
|
qreal minValue();
|
|
|
|
int valuesCount();
|
|
|
|
int seriesCount();
|
2020-01-11 02:11:55 +03:00
|
|
|
bool verticalLabels(QPainter* painter, QRectF labelsRect);
|
2016-11-02 01:34:45 +03:00
|
|
|
QSizeF calcChartLegendSize(const QFont &font);
|
|
|
|
qreal* designValues(){ return m_designValues;}
|
2020-01-11 02:11:55 +03:00
|
|
|
virtual qreal hPadding(QRectF chartRect);
|
|
|
|
virtual qreal vPadding(QRectF chartRect);
|
|
|
|
virtual void paintHorizontalLabels(QPainter *painter, QRectF labelsRect);
|
|
|
|
virtual void paintVerticalLabels(QPainter *painter, QRectF labelsRect);
|
|
|
|
virtual void paintHorizontalGrid(QPainter *painter, QRectF gridRect);
|
|
|
|
virtual void paintVerticalGrid(QPainter *painter, QRectF gridRect);
|
|
|
|
virtual void drawSegment(QPainter *painter, QPoint startPoint, QPoint endPoint, QColor color);
|
|
|
|
virtual qreal valuesHMargin(QPainter *painter);
|
|
|
|
virtual qreal valuesVMargin(QPainter *painter);
|
|
|
|
virtual QFont adaptLabelsFont(QRectF rect, QFont font);
|
|
|
|
virtual QFont adaptValuesFont(qreal width, QFont font);
|
|
|
|
|
2016-11-02 01:34:45 +03:00
|
|
|
private:
|
|
|
|
qreal m_designValues [9];
|
|
|
|
};
|
|
|
|
|
2020-01-11 02:11:55 +03:00
|
|
|
int genNextValue(int value);
|
2016-11-02 01:34:45 +03:00
|
|
|
|
|
|
|
class AbstractBarChart: public AbstractSeriesChart{
|
|
|
|
public:
|
|
|
|
AbstractBarChart(ChartItem* chartItem):AbstractSeriesChart(chartItem){}
|
|
|
|
void paintChartLegend(QPainter *painter, QRectF legendRect);
|
|
|
|
protected:
|
2020-01-11 02:11:55 +03:00
|
|
|
QRectF verticalLabelsRect(QPainter* painter, QRectF horizontalLabelsRect);
|
|
|
|
virtual QRectF horizontalLabelsRect(QPainter* painter, QRectF horizontalLabelsRect);
|
2016-11-02 01:34:45 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ChartItem : public LimeReport::ItemDesignIntf
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
2020-01-31 20:00:28 +03:00
|
|
|
Q_PROPERTY(ACollectionProperty series READ fakeCollectionReader WRITE setSeries)
|
2016-11-02 01:34:45 +03:00
|
|
|
Q_PROPERTY(QString datasource READ datasource WRITE setDatasource)
|
|
|
|
Q_PROPERTY(QString chartTitle READ chartTitle WRITE setChartTitle)
|
|
|
|
Q_PROPERTY(bool drawLegendBorder READ drawLegendBorder WRITE setDrawLegendBorder)
|
|
|
|
Q_PROPERTY(LegendAlign legendAlign READ legendAlign WRITE setLegendAlign)
|
|
|
|
Q_PROPERTY(TitleAlign titleAlign READ titleAlign WRITE setTitleAlign)
|
|
|
|
Q_PROPERTY(ChartType chartType READ chartType WRITE setChartType)
|
|
|
|
Q_PROPERTY(QString labelsField READ labelsField WRITE setLabelsField)
|
2020-04-06 19:48:16 +03:00
|
|
|
Q_PROPERTY(bool showLegend READ showLegend WRITE setShowLegend)
|
2016-11-02 01:34:45 +03:00
|
|
|
friend class AbstractChart;
|
|
|
|
public:
|
|
|
|
|
|
|
|
enum LegendAlign{LegendAlignTop,LegendAlignCenter,LegendAlignBottom};
|
|
|
|
enum TitleAlign{TitleAlignLeft, TitleAlignCenter, TitleAlignRight};
|
2020-01-11 02:11:55 +03:00
|
|
|
enum ChartType{Pie, VerticalBar, HorizontalBar, Lines};
|
2021-08-24 10:22:30 +03:00
|
|
|
#if QT_VERSION >= 0x050500
|
2020-03-03 05:13:46 +03:00
|
|
|
Q_ENUM(LegendAlign)
|
|
|
|
Q_ENUM(TitleAlign)
|
2020-02-17 07:17:02 +03:00
|
|
|
Q_ENUM(ChartType)
|
2020-03-03 05:13:46 +03:00
|
|
|
#else
|
|
|
|
Q_ENUMS(LegendAlign)
|
|
|
|
Q_ENUMS(TitleAlign)
|
|
|
|
Q_ENUMS(ChartType)
|
|
|
|
#endif
|
2016-11-02 01:34:45 +03:00
|
|
|
|
|
|
|
ChartItem(QObject* owner, QGraphicsItem* parent);
|
|
|
|
~ChartItem();
|
|
|
|
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
|
|
|
|
|
|
|
|
QList<SeriesItem *> &series();
|
|
|
|
void setSeries(const QList<SeriesItem *> &series);
|
|
|
|
bool isSeriesExists(const QString& name);
|
|
|
|
|
|
|
|
QString datasource() const;
|
|
|
|
void setDatasource(const QString &datasource);
|
|
|
|
|
|
|
|
QString chartTitle() const;
|
|
|
|
void setChartTitle(const QString &chartTitle);
|
|
|
|
|
|
|
|
bool drawLegendBorder() const;
|
|
|
|
void setDrawLegendBorder(bool drawLegendBorder);
|
|
|
|
|
|
|
|
LegendAlign legendAlign() const;
|
|
|
|
void setLegendAlign(const LegendAlign &legendAlign);
|
|
|
|
|
|
|
|
TitleAlign titleAlign() const;
|
|
|
|
void setTitleAlign(const TitleAlign &titleAlign);
|
|
|
|
|
|
|
|
ChartType chartType() const;
|
|
|
|
void setChartType(const ChartType &chartType);
|
|
|
|
|
|
|
|
QString labelsField() const;
|
|
|
|
void setLabelsField(const QString &labelsField);
|
|
|
|
|
|
|
|
QList<QString> labels() const;
|
|
|
|
void setLabels(const QList<QString> &labels);
|
2020-01-31 20:00:28 +03:00
|
|
|
QWidget* defaultEditor();
|
2016-11-02 01:34:45 +03:00
|
|
|
|
2020-04-06 19:48:16 +03:00
|
|
|
bool showLegend() const;
|
|
|
|
void setShowLegend(bool showLegend);
|
|
|
|
|
2016-11-02 01:34:45 +03:00
|
|
|
protected:
|
|
|
|
void paintChartTitle(QPainter* painter, QRectF titleRect);
|
|
|
|
virtual BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent);
|
|
|
|
//ICollectionContainer
|
2019-12-18 23:13:33 +03:00
|
|
|
QObject* createElement(const QString& collectionName, const QString& elementType);
|
2016-11-02 01:34:45 +03:00
|
|
|
int elementsCount(const QString& collectionName);
|
|
|
|
QObject* elementAt(const QString& collectionName,int index);
|
|
|
|
void collectionLoadFinished(const QString& collectionName){Q_UNUSED(collectionName)}
|
|
|
|
void updateItemSize(DataSourceManager *dataManager, RenderPass, int);
|
2020-01-31 20:00:28 +03:00
|
|
|
void fillLabels(IDataSource* dataSource);
|
2019-11-26 23:40:36 +03:00
|
|
|
bool isNeedUpdateSize(RenderPass pass) const;
|
2020-01-31 20:00:28 +03:00
|
|
|
void setSeries(ACollectionProperty series){Q_UNUSED(series)}
|
2016-11-02 01:34:45 +03:00
|
|
|
private:
|
|
|
|
QList<SeriesItem*> m_series;
|
|
|
|
QString m_datasource;
|
|
|
|
QPixmap m_chartImage;
|
|
|
|
QString m_title;
|
|
|
|
AbstractChart* m_chart;
|
|
|
|
bool m_legendBorder;
|
|
|
|
LegendAlign m_legendAlign;
|
|
|
|
TitleAlign m_titleAlign;
|
|
|
|
ChartType m_chartType;
|
|
|
|
QString m_labelsField;
|
|
|
|
QList<QString> m_labels;
|
2020-04-06 19:48:16 +03:00
|
|
|
bool m_isEmpty;
|
|
|
|
bool m_showLegend;
|
2016-11-02 01:34:45 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
} //namespace LimeReport
|
|
|
|
#endif // LRCHARTITEM_H
|