diff --git a/include/lrdatasourceintf.h b/include/lrdatasourceintf.h index 26f7a65..481787c 100644 --- a/include/lrdatasourceintf.h +++ b/include/lrdatasourceintf.h @@ -18,9 +18,12 @@ public: virtual bool eof() = 0; 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; diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 4677892..b293495 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -77,10 +77,6 @@ TextItem::TextItem(QObject *owner, QGraphicsItem *parent) TextItem::~TextItem(){} -int TextItem::fakeMarginSize() const{ - return marginSize()+5; -} - void TextItem::preparePopUpMenu(QMenu &menu) { QAction* editAction = menu.addAction(QIcon(":/report/images/edit_pecil2.png"),tr("Edit")); @@ -180,7 +176,7 @@ void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, Q qreal hOffset = 0, vOffset = 0; switch (m_angle){ case Angle0: - hOffset = fakeMarginSize(); + hOffset = marginSize(); if ((tmpSize.height() > 0) && (m_alignment & Qt::AlignVCenter)){ vOffset = tmpSize.height() / 2; } @@ -189,8 +185,8 @@ void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, Q painter->translate(hOffset,vOffset); break; case Angle90: - hOffset = width() - fakeMarginSize(); - vOffset = fakeMarginSize(); + hOffset = width() - marginSize(); + vOffset = marginSize(); if (m_alignment & Qt::AlignVCenter){ hOffset = (width() - text->size().height()) / 2 + text->size().height(); } @@ -202,8 +198,8 @@ void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, Q painter->rotate(90); break; case Angle180: - hOffset = width() - fakeMarginSize(); - vOffset = height() - fakeMarginSize(); + hOffset = width() - marginSize(); + vOffset = height() - marginSize(); if ((tmpSize.width()>0) && (m_alignment & Qt::AlignVCenter)){ vOffset = tmpSize.height() / 2+ text->size().height(); } @@ -214,8 +210,8 @@ void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, Q painter->rotate(180); break; case Angle270: - hOffset = fakeMarginSize(); - vOffset = height()-fakeMarginSize(); + hOffset = marginSize(); + vOffset = height()-marginSize(); if (m_alignment & Qt::AlignVCenter){ hOffset = (width() - text->size().height())/2; } @@ -321,7 +317,7 @@ void TextItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, i initTextSizes(); if (m_textSize.width()>width() && ((m_autoWidth==MaxWordLength)||(m_autoWidth==MaxStringLength))){ - setWidth(m_textSize.width() + fakeMarginSize()*2); + setWidth(m_textSize.width() + marginSize()*2); } if (m_textSize.height()>height()) { @@ -380,9 +376,9 @@ QString TextItem::replaceReturns(QString text) const void TextItem::setTextFont(TextPtr text, const QFont& value) const { text->setDefaultFont(value); if ((m_angle==Angle0)||(m_angle==Angle180)){ - text->setTextWidth(rect().width()-fakeMarginSize()*2); + text->setTextWidth(rect().width()-marginSize()*2); } else { - text->setTextWidth(rect().height()-fakeMarginSize()*2); + text->setTextWidth(rect().height()-marginSize()*2); } } @@ -394,7 +390,7 @@ void TextItem::adaptFontSize(TextPtr text) const{ if (_font.pixelSize()>2) _font.setPixelSize(_font.pixelSize()-1); else break; - } while(text->size().height()>this->height() || text->size().width()>(this->width()) - fakeMarginSize() * 2); + } while(text->size().height()>this->height() || text->size().width()>(this->width()) - marginSize() * 2); } int TextItem::underlineLineSize() const diff --git a/limereport/items/lrtextitem.h b/limereport/items/lrtextitem.h index 0d63415..a64142e 100644 --- a/limereport/items/lrtextitem.h +++ b/limereport/items/lrtextitem.h @@ -192,7 +192,6 @@ protected: bool isNeedExpandContent() const; QString replaceBR(QString text) const; QString replaceReturns(QString text) const; - int fakeMarginSize() const; QString getTextPart(int height, int skipHeight); void restoreLinksEvent(); void preparePopUpMenu(QMenu &menu); diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index 0315c27..f7b3aa2 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -272,6 +272,24 @@ QVariant ModelToDataSource::dataByRowIndex(const QString &columnName, int rowInd return QVariant(); } +QVariant ModelToDataSource::dataByRowIndex(const QString &columnName, int rowIndex, int roleName) +{ + if(m_model->rowCount() > rowIndex) + return m_model->data(m_model->index(rowIndex, columnIndexByName(columnName))); + 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) { for( int i=0; i < m_model->rowCount(); ++i ){ @@ -310,6 +328,13 @@ 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; @@ -722,6 +747,18 @@ QVariant CallbackDatasource::dataByRowIndex(const QString &columnName, int rowIn return result; } +QVariant CallbackDatasource::dataByRowIndex(const QString &columnName, int rowIndex, int roleName) +{ + Q_UNUSED(roleName) + 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) { int backupCurrentRow = m_currentRow; @@ -816,6 +853,12 @@ 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(); if (m_rowCount > 0) { diff --git a/limereport/lrdatadesignintf.h b/limereport/lrdatadesignintf.h index f76de85..f070f7a 100644 --- a/limereport/lrdatadesignintf.h +++ b/limereport/lrdatadesignintf.h @@ -388,10 +388,13 @@ public: bool bof(); 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(); @@ -421,6 +424,8 @@ public: bool eof(){return m_eof;} 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); @@ -428,6 +433,7 @@ public: 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); bool checkIfEmpty(); @@ -441,6 +447,7 @@ private: QHash m_valuesCache; bool m_getDataFromCache; int m_lastKeyRow; + }; class CallbackDatasourceHolder :public QObject, public IDataSourceHolder{ diff --git a/limereport/lrdatasourceintf.h b/limereport/lrdatasourceintf.h index 26f7a65..481787c 100644 --- a/limereport/lrdatasourceintf.h +++ b/limereport/lrdatasourceintf.h @@ -18,9 +18,12 @@ public: virtual bool eof() = 0; 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; diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 91f1189..a532c1e 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -1689,6 +1689,28 @@ QVariant DataSourceManager::fieldDataByRowIndex(const QString &fieldName, int ro return QVariant(); } +QVariant DataSourceManager::fieldDataByRowIndex(const QString &fieldName, int rowIndex, int role) +{ + if(containsField(fieldName)) { + IDataSource *ds = dataSource(extractDataSource(fieldName)); + if(ds) { + return ds->dataByRowIndex(extractFieldName(fieldName), rowIndex, role); + } + } + 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, QVariant keyValue) { IDataSource* ds = dataSource(datasourceName); @@ -1698,6 +1720,36 @@ QVariant DataSourceManager::fieldDataByKey(const QString& datasourceName, const 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(dataSourceHolder(datasourceName)); diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index f870b77..7e94be9 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -173,12 +173,17 @@ public: bool containsField(const QString& fieldName); 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); diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 5ea8688..810dafc 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -29,8 +29,6 @@ ****************************************************************************/ #include "lrpreviewreportwindow.h" #include "ui_lrpreviewreportwindow.h" -#include "serializators/lrxmlreader.h" -#include "serializators/lrxmlwriter.h" #include "lrreportengine_p.h" #include "lrpreviewreportwidget.h" #include "lrpreviewreportwidget_p.h" @@ -179,7 +177,6 @@ PreviewReportWindow::~PreviewReportWindow() { if (m_ownedSettings) delete m_settings; - //delete m_previewPage; delete ui; } @@ -266,17 +263,6 @@ QSettings*PreviewReportWindow::settings() } } -void PreviewReportWindow::setReportReader(ItemsReaderIntf::Ptr /*reader*/) -{ -// m_reader=reader; -// if (!reader.isNull()){ -// if (reader->first()) reader->readItem(m_previewPage->pageItem()); -// int pagesCount = reader->firstLevelItemsCount(); -// m_previewPage->pageItem()->setItemMode(PreviewMode); -// initPreview(pagesCount); -// } -} - void PreviewReportWindow::setPages(ReportPages pages) { m_previewReportWidget->d_ptr->setPages(pages); diff --git a/limereport/lrpreviewreportwindow.h b/limereport/lrpreviewreportwindow.h index 52cae96..5e5412e 100644 --- a/limereport/lrpreviewreportwindow.h +++ b/limereport/lrpreviewreportwindow.h @@ -62,7 +62,6 @@ class PreviewReportWindow : public QMainWindow public: explicit PreviewReportWindow(ReportEngine *report, QWidget *parent = 0, QSettings* settings=0, Qt::WindowFlags flags=Qt::WindowFlags()); ~PreviewReportWindow(); - void setReportReader(ItemsReaderIntf::Ptr reader); void setPages(ReportPages pages); void setDefaultPrinter(QPrinter* printer); void exec(); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 0fc7d08..0c00103 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1818,7 +1818,7 @@ PrintProcessor::PrintProcessor(QPrinter* printer) bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) { -#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) + if (!m_firstPage && !m_painter->isActive()) return false; PageDesignIntf* backupPage = dynamic_cast(page->scene()); @@ -1836,91 +1836,47 @@ bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) m_firstPage = false; } +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) qreal leftMargin, topMargin, rightMargin, bottomMargin; m_printer->getPageMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin, QPrinter::Millimeter); - - QRectF printerPageRect = m_printer->pageRect(QPrinter::Millimeter); - printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * page->unitFactor(), - (printerPageRect.size().height() + bottomMargin +topMargin) * page->unitFactor()); - - if (page->printBehavior() == PageItemDesignIntf::Split && m_printer->pageSize() != static_cast(page->pageSize()) && - printerPageRect.width() < page->geometry().width()) - { - qreal pageWidth = page->geometry().width(); - qreal pageHeight = page->geometry().height(); - QRectF currentPrintingRect = printerPageRect; - qreal curHeight = 0; - qreal curWidth = 0; - bool first = true; - while (pageHeight > 0){ - while (curWidth < pageWidth){ - if (!first) m_printer->newPage(); else first = false; - m_renderPage.render(m_painter, m_printer->pageRect(), currentPrintingRect); - currentPrintingRect.adjust(printerPageRect.size().width(), 0, printerPageRect.size().width(), 0); - curWidth += printerPageRect.size().width(); - - } - pageHeight -= printerPageRect.size().height(); - curHeight += printerPageRect.size().height(); - currentPrintingRect = printerPageRect; - currentPrintingRect.adjust(0, curHeight, 0, curHeight); - curWidth = 0; - } - - } else { - if (page->getSetPageSizeToPrinter()){ - QRectF source = page->geometry(); - QSizeF inchSize = source.size() / (100 * 2.54); - QRectF target = QRectF(QPoint(0,0), inchSize * m_printer->resolution()); - m_renderPage.render(m_painter, target, source); - } else { - m_renderPage.render(m_painter); - } - } - page->setPos(backupPagePos); - m_renderPage.removePageItem(page); - if (backupPage) backupPage->reactivatePageItem(page); #else - if (!m_firstPage && !m_painter->isActive()) return false; - PageDesignIntf* backupPage = dynamic_cast(page->scene()); - - QPointF backupPagePos = page->pos(); - page->setPos(0,0); - m_renderPage.setPageItem(page); - m_renderPage.setSceneRect(m_renderPage.pageItem()->mapToScene(m_renderPage.pageItem()->rect()).boundingRect()); - initPrinter(m_renderPage.pageItem()); - - if (!m_firstPage){ - m_printer->newPage(); - } else { - m_painter = new QPainter(m_printer); - if (!m_painter->isActive()) return false; - m_firstPage = false; - } - qreal leftMargin = m_printer->pageLayout().margins().left(); qreal topMargin = m_printer->pageLayout().margins().top(); qreal rightMargin = m_printer->pageLayout().margins().right(); qreal bottomMargin = m_printer->pageLayout().margins().bottom(); +#endif QRectF printerPageRect = m_printer->pageRect(QPrinter::Millimeter); printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * page->unitFactor(), (printerPageRect.size().height() + bottomMargin + topMargin) * page->unitFactor()); - if (page->printBehavior() == PageItemDesignIntf::Split && m_printer->pageLayout().pageSize() != QPageSize((QPageSize::PageSizeId)page->pageSize()) && +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) + if (page->printBehavior() == PageItemDesignIntf::Split && + m_printer->pageSize() != static_cast(page->pageSize()) && printerPageRect.width() < page->geometry().width()) { +#else + if ( + page->printBehavior() == PageItemDesignIntf::Split && + m_printer->pageLayout().pageSize() != QPageSize((QPageSize::PageSizeId)page->pageSize()) && + printerPageRect.width() < page->geometry().width() + ){ +#endif qreal pageWidth = page->geometry().width(); qreal pageHeight = page->geometry().height(); - QRectF currentPrintingRect = printerPageRect; qreal curHeight = 0; qreal curWidth = 0; + QRectF currentPrintingRect = printerPageRect; + bool first = true; while (pageHeight > 0){ while (curWidth < pageWidth){ if (!first) m_printer->newPage(); else first = false; - m_renderPage.render(m_painter, m_printer->pageRect(QPrinter::Millimeter), currentPrintingRect); - currentPrintingRect.adjust(printerPageRect.size().width(), 0, printerPageRect.size().width(), 0); + m_renderPage.render(m_painter, QRectF(), currentPrintingRect); curWidth += printerPageRect.size().width(); + currentPrintingRect = QRectF( + curWidth, 0, + printerPageRect.size().width() > (pageWidth - curWidth) ? (pageWidth - curWidth) : printerPageRect.size().width(), pageHeight + ); } pageHeight -= printerPageRect.size().height(); @@ -1943,7 +1899,6 @@ bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) page->setPos(backupPagePos); m_renderPage.removePageItem(page); if (backupPage) backupPage->reactivatePageItem(page); -#endif return true; } diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 31220d3..c940f8b 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1073,6 +1073,79 @@ bool ScriptEngineManager::createReopenDatasourceFunction() return addFunction(fd); } +bool ScriptEngineManager::createGetFieldByRowIndexEx() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory(tr("GENERAL")); + fd.setName("getFieldByRowIndexEx"); + fd.setDescription("getFieldByRowIndexEx(\"" + tr("FieldName") + "\", \"" + tr("RowIndex") + + "\", \"" + 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) { @@ -1114,6 +1187,11 @@ ScriptEngineManager::ScriptEngineManager() createAddTableOfContentsItemFunction(); createClearTableOfContentsFunction(); createReopenDatasourceFunction(); + createGetFieldByRowIndexEx(); + createGetFieldByRowIndexEx2(); + createHeaderData(); + createHeaderColumnNameByIndex(); + createColumnCount(); m_model = new ScriptEngineModel(this); } @@ -1866,6 +1944,36 @@ QFont ScriptFunctionsManager::font(const QString &family, int pointSize, bool it return result; } +QVariant ScriptFunctionsManager::getFieldByRowIndexEx(const QString &fieldName, int rowIndex, const int role) +{ + DataSourceManager *dm = scriptEngineManager()->dataManager(); + 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) diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index d027a1a..1763190 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -378,6 +378,43 @@ public: Q_INVOKABLE void addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent = 0); Q_INVOKABLE void clearTableOfContents(); Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, 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); @@ -506,6 +543,12 @@ private: bool createAddTableOfContentsItemFunction(); bool createClearTableOfContentsFunction(); bool createReopenDatasourceFunction(); + bool createGetFieldByRowIndexEx(); + bool createGetFieldByRowIndexEx2(); + bool createHeaderData(); + bool createHeaderColumnNameByIndex(); + bool createColumnCount(); + private: ScriptEngineManager(); ScriptEngineType* m_scriptEngine; diff --git a/limereport/scripteditor/lrcompletermodel.cpp b/limereport/scripteditor/lrcompletermodel.cpp index 29c7116..70299f6 100644 --- a/limereport/scripteditor/lrcompletermodel.cpp +++ b/limereport/scripteditor/lrcompletermodel.cpp @@ -22,16 +22,17 @@ QModelIndex CompleterModel::index(int row, int column, const QModelIndex &parent return createIndex(row, column, parentItem->child(row)); } -QModelIndex CompleterModel::parent(const QModelIndex &child) const -{ - if (child.isValid()){ - CompleterItem *childItem = static_cast(child.internalPointer()); - CompleterItem *parentItem = childItem->parent(); - if (parentItem != &m_root) { - return indexFromItem(parentItem); - } +QModelIndex CompleterModel::parent(const QModelIndex &child) const { + if(child.isValid()) { + if(CompleterItem *childItem = static_cast(child.internalPointer()); + childItem) { + CompleterItem *parentItem = childItem->parent(); + if(parentItem != &m_root) { + return indexFromItem(parentItem); + } } - return QModelIndex(); + } + return QModelIndex(); } int CompleterModel::rowCount(const QModelIndex &parent) const diff --git a/limereport/scripteditor/lrcompletermodel.h b/limereport/scripteditor/lrcompletermodel.h index 862437a..8f218e8 100644 --- a/limereport/scripteditor/lrcompletermodel.h +++ b/limereport/scripteditor/lrcompletermodel.h @@ -12,7 +12,9 @@ public: CompleterItem(QString text, QIcon icon):m_parent(0), m_text(text), m_icon(icon), m_model(0){} ~CompleterItem(); int rowCount() const {return m_children.count();} - CompleterItem* child(int row) const {return m_children.at(row).data();} + CompleterItem *child(int row) const { + return m_children.count() > row ? m_children.at(row).data() : nullptr; + } CompleterItem* parent() const {return m_parent;} int row() const{ if (m_parent){ @@ -33,7 +35,7 @@ public: void appendRow(CompleterItem* child); void appendRows(const QList &children); private: - CompleterItem* m_parent; + CompleterItem* m_parent{nullptr}; QVector > m_children; QString m_text; QIcon m_icon;