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

Added support for formating numbers and dates by pattern.

This commit is contained in:
Josef Rokos 2016-07-26 16:01:14 +02:00
parent 5001738d76
commit 88ef131148
4 changed files with 115 additions and 7 deletions

View File

@ -30,6 +30,7 @@
#include <QtGui> #include <QtGui>
#include <QTextLayout> #include <QTextLayout>
#include <QtScript/QScriptEngine> #include <QtScript/QScriptEngine>
#include <QLocale>
#include <math.h> #include <math.h>
#include "lrpagedesignintf.h" #include "lrpagedesignintf.h"
@ -186,6 +187,7 @@ void TextItem::Init()
// m_text->setDefaultFont(transformToSceneFont(font())); // m_text->setDefaultFont(transformToSceneFont(font()));
m_textSize=QSizeF(); m_textSize=QSizeF();
m_foregroundOpacity = 100; m_foregroundOpacity = 100;
m_valueType = Default;
} }
void TextItem::setContent(const QString &value) void TextItem::setContent(const QString &value)
@ -282,6 +284,86 @@ void TextItem::initText()
m_textSize=m_text->size(); m_textSize=m_text->size();
} }
QString TextItem::formatDateTime(const QDateTime &value)
{
if (m_format.isEmpty())
{
return value.toString();
}
return value.toString(m_format);
}
QString TextItem::formatNumber(const double value)
{
QString str = QString::number(value);
if (m_format.contains("%"))
{
str.sprintf(m_format.toStdString().c_str(), value);
str = str.replace(",", QLocale::system().groupSeparator());
str = str.replace(".", QLocale::system().decimalPoint());
}
return str;
}
QString TextItem::formatFieldValue()
{
if (m_format.isEmpty()) {
return m_varValue.toString();
}
QVariant value = m_varValue;
if (m_valueType != Default) {
switch (m_valueType) {
case DateTime:
{
QDateTime dt = QDateTime::fromString(value.toString(), Qt::ISODate);
value = (dt.isValid() ? QVariant(dt) : m_varValue);
break;
}
case Double:
{
bool bOk = false;
double dbl = value.toDouble(&bOk);
value = (bOk ? QVariant(dbl) : m_varValue);
}
}
}
switch (value.type()) {
case QVariant::Date:
case QVariant::DateTime:
return formatDateTime(value.toDateTime());
case QVariant::Double:
return formatNumber(value.toDouble());
default:
return value.toString();
}
}
TextItem::ValueType TextItem::valueType() const
{
return m_valueType;
}
void TextItem::setValueType(const ValueType valueType)
{
m_valueType = valueType;
}
QString TextItem::format() const
{
return m_format;
}
void TextItem::setFormat(const QString &format)
{
m_format = format;
}
bool TextItem::allowHTMLInFields() const bool TextItem::allowHTMLInFields() const
{ {
return m_allowHTMLInFields; return m_allowHTMLInFields;
@ -374,7 +456,12 @@ void TextItem::expandContent(DataSourceManager* dataManager, RenderPass pass)
context=expandUserVariables(context, pass, expandType, dataManager); context=expandUserVariables(context, pass, expandType, dataManager);
context=expandScripts(context, dataManager); context=expandScripts(context, dataManager);
} }
setContent(context);
if (expandType == NoEscapeSymbols) {
setContent(formatFieldValue());
} else {
setContent(context);
}
} }
void TextItem::setAutoHeight(bool value) void TextItem::setAutoHeight(bool value)

View File

@ -44,6 +44,7 @@ class TextItem : public LimeReport::ContentItemDesignIntf {
Q_OBJECT Q_OBJECT
Q_ENUMS(AutoWidth) Q_ENUMS(AutoWidth)
Q_ENUMS(AngleType) Q_ENUMS(AngleType)
Q_ENUMS(ValueType)
Q_PROPERTY(QString content READ content WRITE setContent) Q_PROPERTY(QString content READ content WRITE setContent)
Q_PROPERTY(int margin READ marginSize WRITE setMarginSize) Q_PROPERTY(int margin READ marginSize WRITE setMarginSize)
Q_PROPERTY(Qt::Alignment alignment READ alignment() WRITE setAlignment) Q_PROPERTY(Qt::Alignment alignment READ alignment() WRITE setAlignment)
@ -59,10 +60,13 @@ class TextItem : public LimeReport::ContentItemDesignIntf {
Q_PROPERTY(bool trimValue READ trimValue WRITE setTrimValue) Q_PROPERTY(bool trimValue READ trimValue WRITE setTrimValue)
Q_PROPERTY(bool allowHTML READ allowHTML WRITE setAllowHTML) Q_PROPERTY(bool allowHTML READ allowHTML WRITE setAllowHTML)
Q_PROPERTY(bool allowHTMLInFields READ allowHTMLInFields WRITE setAllowHTMLInFields) Q_PROPERTY(bool allowHTMLInFields READ allowHTMLInFields WRITE setAllowHTMLInFields)
Q_PROPERTY(QString format READ format WRITE setFormat)
Q_PROPERTY(ValueType valueType READ valueType WRITE setValueType)
public: public:
enum AutoWidth{NoneAutoWidth,MaxWordLength,MaxStringLength}; enum AutoWidth{NoneAutoWidth,MaxWordLength,MaxStringLength};
enum AngleType{Angle0,Angle90,Angle180,Angle270,Angle45,Angle315}; enum AngleType{Angle0,Angle90,Angle180,Angle270,Angle45,Angle315};
enum ValueType{Default,DateTime,Double};
void Init(); void Init();
TextItem(QObject* owner=0, QGraphicsItem* parent=0); TextItem(QObject* owner=0, QGraphicsItem* parent=0);
@ -118,6 +122,12 @@ public:
bool allowHTMLInFields() const; bool allowHTMLInFields() const;
void setAllowHTMLInFields(bool allowHTMLInFields); void setAllowHTMLInFields(bool allowHTMLInFields);
QString format() const;
void setFormat(const QString &format);
ValueType valueType() const;
void setValueType(const ValueType valueType);
protected: protected:
void updateLayout(); void updateLayout();
bool isNeedExpandContent() const; bool isNeedExpandContent() const;
@ -126,6 +136,9 @@ protected:
int fakeMarginSize(); int fakeMarginSize();
private: private:
void initText(); void initText();
QString formatDateTime(const QDateTime &value);
QString formatNumber(const double value);
QString formatFieldValue();
private: private:
QString m_strText; QString m_strText;
@ -140,6 +153,9 @@ private:
bool m_trimValue; bool m_trimValue;
bool m_allowHTML; bool m_allowHTML;
bool m_allowHTMLInFields; bool m_allowHTMLInFields;
QString m_format;
ValueType m_valueType;
}; };
} }

View File

@ -123,11 +123,12 @@ QString ContentItemDesignIntf::expandDataFields(QString context, ExpandType expa
if (dataManager->containsField(field)) { if (dataManager->containsField(field)) {
QString fieldValue; QString fieldValue;
m_varValue = dataManager->fieldData(field);
if (expandType == EscapeSymbols) { if (expandType == EscapeSymbols) {
if (dataManager->fieldData(field).isNull()) { if (dataManager->fieldData(field).isNull()) {
fieldValue="\"\""; fieldValue="\"\"";
} else { } else {
fieldValue = escapeSimbols(dataManager->fieldData(field).toString()); fieldValue = escapeSimbols(m_varValue.toString());
switch (dataManager->fieldData(field).type()) { switch (dataManager->fieldData(field).type()) {
case QVariant::Char: case QVariant::Char:
case QVariant::String: case QVariant::String:
@ -142,8 +143,8 @@ QString ContentItemDesignIntf::expandDataFields(QString context, ExpandType expa
} }
} else { } else {
if (expandType == ReplaceHTMLSymbols) if (expandType == ReplaceHTMLSymbols)
fieldValue = replaceHTMLSymbols(dataManager->fieldData(field).toString()); fieldValue = replaceHTMLSymbols(m_varValue.toString());
else fieldValue = dataManager->fieldData(field).toString(); else fieldValue = m_varValue.toString();
} }
context.replace(rx.cap(0),fieldValue); context.replace(rx.cap(0),fieldValue);
@ -172,15 +173,16 @@ QString ContentItemDesignIntf::expandUserVariables(QString context, RenderPass p
pos += rx.matchedLength(); pos += rx.matchedLength();
if (dataManager->containsVariable(variable) ){ if (dataManager->containsVariable(variable) ){
if (pass==dataManager->variablePass(variable)){ if (pass==dataManager->variablePass(variable)){
m_varValue = dataManager->variable(variable);
switch (expandType){ switch (expandType){
case EscapeSymbols: case EscapeSymbols:
context.replace(rx.cap(0),escapeSimbols(dataManager->variable(variable).toString())); context.replace(rx.cap(0),escapeSimbols(m_varValue.toString()));
break; break;
case NoEscapeSymbols: case NoEscapeSymbols:
context.replace(rx.cap(0),dataManager->variable(variable).toString()); context.replace(rx.cap(0),m_varValue.toString());
break; break;
case ReplaceHTMLSymbols: case ReplaceHTMLSymbols:
context.replace(rx.cap(0),replaceHTMLSymbols(dataManager->variable(variable).toString())); context.replace(rx.cap(0),replaceHTMLSymbols(m_varValue.toString()));
break; break;
} }
pos=0; pos=0;
@ -222,6 +224,7 @@ QString ContentItemDesignIntf::expandScripts(QString context, DataSourceManager*
scriptBody = expandUserVariables(scriptBody, FirstPass, EscapeSymbols, dataManager); scriptBody = expandUserVariables(scriptBody, FirstPass, EscapeSymbols, dataManager);
QScriptValue value = se->evaluate(scriptBody); QScriptValue value = se->evaluate(scriptBody);
if (!se->hasUncaughtException()) { if (!se->hasUncaughtException()) {
m_varValue = value.toVariant();
context.replace(scriptExtractor.scriptAt(i),value.toString()); context.replace(scriptExtractor.scriptAt(i),value.toString());
} else { } else {
context.replace(scriptExtractor.scriptAt(i),se->uncaughtException().toString()); context.replace(scriptExtractor.scriptAt(i),se->uncaughtException().toString());

View File

@ -82,6 +82,8 @@ protected:
virtual QString expandUserVariables(QString context, RenderPass pass, ExpandType expandType, DataSourceManager *dataManager); virtual QString expandUserVariables(QString context, RenderPass pass, ExpandType expandType, DataSourceManager *dataManager);
virtual QString expandDataFields(QString context, ExpandType expandType, DataSourceManager *dataManager); virtual QString expandDataFields(QString context, ExpandType expandType, DataSourceManager *dataManager);
virtual QString expandScripts(QString context, DataSourceManager *dataManager); virtual QString expandScripts(QString context, DataSourceManager *dataManager);
QVariant m_varValue;
}; };
class LayoutDesignIntf : public ItemDesignIntf{ class LayoutDesignIntf : public ItemDesignIntf{