Skip to content

Commit

Permalink
Added several functions to get extended information from the model
Browse files Browse the repository at this point in the history
- getFieldByRowIndexEx2(fieldName, rowIndex, roleName), default:
Qt::DisplayRole

- getHeaderData(fieldName, roleName), default: Qt::DisplayRole

- getHeaderColumnNameByIndex(datasourceName, columnIndex), default:
Qt::UserRole or Qt::DisplayRole

- getColumnCount(datasourceName), default: -1
  • Loading branch information
Dmitry Zagorodnev committed Oct 26, 2023
1 parent a90244c commit d3c05ee
Show file tree
Hide file tree
Showing 7 changed files with 205 additions and 1 deletion.
30 changes: 30 additions & 0 deletions limereport/lrdatadesignintf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,18 @@ QVariant ModelToDataSource::dataByRowIndex(const QString &columnName, int rowInd
return QVariant();
}

QVariant ModelToDataSource::dataByRowIndex(const QString &columnName,
int rowIndex,
const QString &roleName) {
if(m_model->rowCount() > rowIndex) {
int roleCode{roleName.isEmpty() ? Qt::DisplayRole
: m_model->roleNames().key(roleName.toUtf8(), Qt::DisplayRole)};
return m_model->data(m_model->index(rowIndex, columnIndexByName(columnName)), roleCode);
}

return QVariant();
}

QVariant ModelToDataSource::dataByKeyField(const QString &columnName,
const QString &keyColumnName,
QVariant keyData) {
Expand Down Expand Up @@ -309,6 +321,12 @@ int ModelToDataSource::columnIndexByName(QString name) {
return -1;
}

QVariant ModelToDataSource::headerData(const QString &columnName, const QString &roleName) {
int roleCode{roleName.isEmpty() ? Qt::DisplayRole
: m_model->roleNames().key(roleName.toUtf8(), Qt::DisplayRole)};
return m_model->headerData(columnIndexByName(columnName), Qt::Horizontal, roleCode);
}

QString ModelToDataSource::lastError() {
return m_lastError;
}
Expand Down Expand Up @@ -705,6 +723,13 @@ QVariant CallbackDatasource::dataByRowIndex(const QString &columnName, int rowIn
return dataByRowIndex(columnName, rowIndex);
}

QVariant CallbackDatasource::dataByRowIndex(const QString &columnName,
int rowIndex,
const QString &roleName) {
Q_UNUSED(roleName)
return dataByRowIndex(columnName, rowIndex);
}

QVariant CallbackDatasource::dataByKeyField(const QString &columnName,
const QString &keyColumnName,
QVariant keyData) {
Expand Down Expand Up @@ -802,6 +827,11 @@ int CallbackDatasource::columnIndexByName(QString name) {
return -1;
}

QVariant CallbackDatasource::headerData(const QString &columnName, const QString &roleName) {
Q_UNUSED(roleName)
return columnName; // STUB
}

bool CallbackDatasource::checkNextRecord(int recordNum) {
if(bof())
checkIfEmpty();
Expand Down
4 changes: 4 additions & 0 deletions limereport/lrdatadesignintf.h
Original file line number Diff line number Diff line change
Expand Up @@ -417,10 +417,12 @@ class ModelToDataSource : public QObject, public IDataSource {
QVariant data(const QString &columnName);
QVariant dataByRowIndex(const QString &columnName, int rowIndex);
QVariant dataByRowIndex(const QString &columnName, int rowIndex, int roleName);
QVariant dataByRowIndex(const QString &columnName, int rowIndex, const QString &roleName);
QVariant dataByKeyField(const QString &columnName, const QString &keyColumnName, QVariant keyData);
int columnCount();
QString columnNameByIndex(int columnIndex);
int columnIndexByName(QString name);
QVariant headerData(const QString &columnName, const QString &roleName);
QString lastError();
virtual QAbstractItemModel *model();
int currentRow();
Expand Down Expand Up @@ -458,13 +460,15 @@ class CallbackDatasource : public ICallbackDatasource, public IDataSource {
QVariant data(const QString &columnName);
QVariant dataByRowIndex(const QString &columnName, int rowIndex);
QVariant dataByRowIndex(const QString &columnName, int rowIndex, int roleName);
QVariant dataByRowIndex(const QString &columnName, int rowIndex, const QString &roleName);
QVariant dataByKeyField(const QString &columnName, const QString &keyColumnName, QVariant keyData);
int columnCount();
QString columnNameByIndex(int columnIndex);
int columnIndexByName(QString name);
bool isInvalid() const { return false; }
QString lastError() { return ""; }
QAbstractItemModel *model() { return 0; }
QVariant headerData(const QString &columnName, const QString &roleName);

private:
bool checkNextRecord(int recordNum);
Expand Down
3 changes: 3 additions & 0 deletions limereport/lrdatasourceintf.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,15 @@ class IDataSource {
virtual QVariant data(const QString &columnName) = 0;
virtual QVariant dataByRowIndex(const QString &columnName, int rowIndex) = 0;
virtual QVariant dataByRowIndex(const QString &columnName, int rowIndex, int roleName) = 0;
virtual QVariant dataByRowIndex(const QString &columnName, int rowIndex, const QString &roleName)
= 0;
virtual QVariant dataByKeyField(const QString &columnName,
const QString &keyColumnName,
QVariant keyData)
= 0;
virtual int columnCount() = 0;
virtual QString columnNameByIndex(int columnIndex) = 0;
virtual QVariant headerData(const QString &columnName, const QString &roleName) = 0;
virtual int columnIndexByName(QString name) = 0;
virtual bool isInvalid() const = 0;
virtual QString lastError() = 0;
Expand Down
39 changes: 39 additions & 0 deletions limereport/lrdatasourcemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1680,6 +1680,18 @@ QVariant DataSourceManager::fieldDataByRowIndex(const QString &fieldName, int ro
return QVariant();
}

QVariant DataSourceManager::fieldDataByRowIndex(const QString &fieldName,
int rowIndex,
const QString &roleName) {
if(containsField(fieldName)) {
IDataSource *ds = dataSource(extractDataSource(fieldName));
if(ds) {
return ds->dataByRowIndex(extractFieldName(fieldName), rowIndex, roleName);
}
}
return QVariant();
}

QVariant DataSourceManager::fieldDataByKey(const QString &datasourceName,
const QString &valueFieldName,
const QString &keyFieldName,
Expand All @@ -1691,6 +1703,33 @@ QVariant DataSourceManager::fieldDataByKey(const QString &datasourceName,
return QVariant();
}

QVariant DataSourceManager::headerData(const QString &fieldName, const QString &roleName) {
if(containsField(fieldName)) {
IDataSource *ds = dataSource(extractDataSource(fieldName));
if(ds) {
return ds->headerData(extractFieldName(fieldName), roleName);
}
}
return QVariant();
}

QString DataSourceManager::columnName(const QString &datasourceName, int index) {
IDataSource *ds = dataSource(datasourceName);
if(ds && !ds->isInvalid() && ds->columnCount() > index) {
return ds->columnNameByIndex(index);
}
return QString("unknown");
}

int DataSourceManager::columnCount(const QString &datasourceName) {
IDataSource *ds = dataSource(datasourceName);
if(ds && !ds->isInvalid()) {
return ds->columnCount();
}

return -1;
}

void DataSourceManager::reopenDatasource(const QString &datasourceName) {
QueryHolder *qh = dynamic_cast<QueryHolder *>(dataSourceHolder(datasourceName));
if(qh) {
Expand Down
4 changes: 4 additions & 0 deletions limereport/lrdatasourcemanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,10 +205,14 @@ class DataSourceManager : public QObject,
QVariant fieldData(const QString &fieldName);
QVariant fieldDataByRowIndex(const QString &fieldName, int rowIndex);
QVariant fieldDataByRowIndex(const QString &fieldName, int rowIndex, int role);
QVariant fieldDataByRowIndex(const QString &fieldName, int rowIndex, const QString &roleName);
QVariant fieldDataByKey(const QString &datasourceName,
const QString &valueFieldName,
const QString &keyFieldName,
QVariant keyValue);
QVariant headerData(const QString &fieldName, const QString &roleName);
QString columnName(const QString &datasourceName, int index);
int columnCount(const QString &datasourceName);
void reopenDatasource(const QString &datasourceName);

QString extractDataSource(const QString &fieldName);
Expand Down
83 changes: 82 additions & 1 deletion limereport/lrscriptenginemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1052,13 +1052,67 @@ bool ScriptEngineManager::createGetFieldByRowIndexEx() {
fd.setCategory(tr("GENERAL"));
fd.setName("getFieldByRowIndexEx");
fd.setDescription("getFieldByRowIndexEx(\"" + tr("FieldName") + "\", \"" + tr("RowIndex")
+ "\", \"" + tr("Role value") + "\")");
+ "\", \"" + tr("RoleIndex") + "\")");
fd.setScriptWrapper(QString("function getFieldByRowIndexEx(fieldName, rowIndex, role){"
"return %1.getFieldByRowIndexEx(fieldName, rowIndex, role);}")
.arg(LimeReport::Const::FUNCTION_MANAGER_NAME));
return addFunction(fd);
}

bool ScriptEngineManager::createGetFieldByRowIndexEx2() {
JSFunctionDesc fd;
fd.setManager(m_functionManager);
fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME);
fd.setCategory(tr("GENERAL"));
fd.setName("getFieldByRowIndexEx2");
fd.setDescription("getFieldByRowIndexEx2(\"" + tr("FieldName") + "\", \"" + tr("RowIndex")
+ "\", \"" + tr("RoleName") + "\")");
fd.setScriptWrapper(QString("function getFieldByRowIndexEx2(fieldName, rowIndex, role){"
"return %1.getFieldByRowIndexEx2(fieldName, rowIndex, role);}")
.arg(LimeReport::Const::FUNCTION_MANAGER_NAME));
return addFunction(fd);
}

bool ScriptEngineManager::createHeaderData() {
JSFunctionDesc fd;
fd.setManager(m_functionManager);
fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME);
fd.setCategory(tr("GENERAL"));
fd.setName("getHeaderData");
fd.setDescription("getHeaderData(\"" + tr("FieldName") + "\", \"" + tr("RoleName") + "\")");
fd.setScriptWrapper(QString("function getHeaderData(fieldName, role){"
"return %1.getHeaderData(fieldName, role);}")
.arg(LimeReport::Const::FUNCTION_MANAGER_NAME));
return addFunction(fd);
}

bool ScriptEngineManager::createHeaderColumnNameByIndex() {
JSFunctionDesc fd;
fd.setManager(m_functionManager);
fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME);
fd.setCategory(tr("GENERAL"));
fd.setName("getHeaderColumnNameByIndex");
fd.setDescription("getHeaderColumnNameByIndex(\"" + tr("datasourceName") + "\", \""
+ tr("columnIndex") + "\")");
fd.setScriptWrapper(QString("function getHeaderColumnNameByIndex(datasourceName, columnIndex){"
"return %1.getHeaderColumnNameByIndex(datasourceName, columnIndex);}")
.arg(LimeReport::Const::FUNCTION_MANAGER_NAME));
return addFunction(fd);
}

bool ScriptEngineManager::createColumnCount() {
JSFunctionDesc fd;
fd.setManager(m_functionManager);
fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME);
fd.setCategory(tr("GENERAL"));
fd.setName("getColumnCount");
fd.setDescription("getColumnCount(\"" + tr("datasourceName") + "\")");
fd.setScriptWrapper(QString("function getColumnCount(datasourceName){"
"return %1.getColumnCount(datasourceName);}")
.arg(LimeReport::Const::FUNCTION_MANAGER_NAME));
return addFunction(fd);
}

ScriptEngineManager::ScriptEngineManager() : m_model(0), m_context(0), m_dataManager(0) {
m_scriptEngine = new ScriptEngineType;
m_functionManager = new ScriptFunctionsManager(this);
Expand Down Expand Up @@ -1101,6 +1155,10 @@ ScriptEngineManager::ScriptEngineManager() : m_model(0), m_context(0), m_dataMan
createClearTableOfContentsFunction();
createReopenDatasourceFunction();
createGetFieldByRowIndexEx();
createGetFieldByRowIndexEx2();
createHeaderData();
createHeaderColumnNameByIndex();
createColumnCount();

m_model = new ScriptEngineModel(this);
}
Expand Down Expand Up @@ -1821,6 +1879,29 @@ QVariant ScriptFunctionsManager::getFieldByRowIndexEx(const QString &fieldName,
return dm->fieldDataByRowIndex(fieldName, rowIndex, role);
}

QVariant ScriptFunctionsManager::getFieldByRowIndexEx2(const QString &fieldName,
int rowIndex,
const QString &roleName) {
DataSourceManager *dm = scriptEngineManager()->dataManager();
return dm->fieldDataByRowIndex(fieldName, rowIndex, roleName);
}

QVariant ScriptFunctionsManager::getHeaderData(const QString &fieldName, const QString &roleName) {
DataSourceManager *dm = scriptEngineManager()->dataManager();
return dm->headerData(fieldName, roleName);
}

QVariant ScriptFunctionsManager::getHeaderColumnNameByIndex(const QString &datasourceName,
const int columnIndex) {
DataSourceManager *dm = scriptEngineManager()->dataManager();
return dm->columnName(datasourceName, columnIndex);
}

int ScriptFunctionsManager::getColumnCount(const QString &datasourceName) {
DataSourceManager *dm = scriptEngineManager()->dataManager();
return dm->columnCount(datasourceName);
}

#ifdef USE_QJSENGINE

void ScriptFunctionsManager::addItemsToComboBox(QJSValue object, const QStringList &values) {
Expand Down
43 changes: 43 additions & 0 deletions limereport/lrscriptenginemanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,46 @@ class ScriptFunctionsManager : public QObject {
bool bold = false,
bool italic = false,
bool underLine = false);
/*!
* \brief getFieldByRowIndexEx Выдает для поля значение заданной роли
* \param fieldName имя источника данных + имя поля
* \param rowIndex индекс строки
* \param role код роли
* \return
*/
Q_INVOKABLE QVariant getFieldByRowIndexEx(const QString &fieldName, int rowIndex, const int role);
/*!
* \brief getFieldByRowIndexEx2 Выдает для поля значение заданной роли
* \param fieldName имя источника данных + имя поля
* \param rowIndex индекс строки
* \param roleName имя роли из roleNames()
* \return
*/
Q_INVOKABLE QVariant getFieldByRowIndexEx2(const QString &fieldName,
int rowIndex,
const QString &roleName);
/*!
* \brief getHeaderData Выдает для поля заголовка значение заданной роли
* \param fieldName имя источника данных + имя поля
* \param role имя роли из roleNames()
* \return
*/
Q_INVOKABLE QVariant getHeaderData(const QString &fieldName, const QString &roleName);
/*!
* \brief getHeaderColumnNameByIndex Выдает имя колонки по ее индексу (имя используемое LR)
* \param datasourceName имя источника данных
* \param columnIndex индекс колонки
* \return
*/
Q_INVOKABLE QVariant getHeaderColumnNameByIndex(const QString &datasourceName,
const int columnIndex);
/*!
* \brief getColumnCount Выдает число столбцов в источнике данных
* \param datasourceName имя источника данных
* \return возможно -1 при ошибке
*/
Q_INVOKABLE int getColumnCount(const QString &datasourceName);

#ifdef USE_QJSENGINE
Q_INVOKABLE void addItemsToComboBox(QJSValue object, const QStringList &values);
Q_INVOKABLE void addItemToComboBox(QJSValue object, const QString &value);
Expand Down Expand Up @@ -570,6 +609,10 @@ class ScriptEngineManager : public QObject,
bool createClearTableOfContentsFunction();
bool createReopenDatasourceFunction();
bool createGetFieldByRowIndexEx();
bool createGetFieldByRowIndexEx2();
bool createHeaderData();
bool createHeaderColumnNameByIndex();
bool createColumnCount();

private:
ScriptEngineManager();
Expand Down

0 comments on commit d3c05ee

Please sign in to comment.