From 8efb6792a3e039d5e110a36abe4688a363d43690 Mon Sep 17 00:00:00 2001 From: Alexander Arin Date: Tue, 2 Nov 2021 22:30:29 +0300 Subject: [PATCH 1/3] support of Qt6 --- common.pri | 4 +- include/lrglobal.h | 6 +- limereport.pro | 7 +- limereport/bands/lrpageheader.h | 1 + limereport/bands/lrreportheader.h | 1 + .../items/editors/lrfonteditorwidget.cpp | 4 + limereport/items/lrsimpletagparser.cpp | 77 +++++----- limereport/items/lrsimpletagparser.h | 2 +- limereport/items/lrtextitem.cpp | 5 +- limereport/items/lrtextitemeditor.ui | 3 - limereport/limereport.pri | 4 +- limereport/lrdatasourcemanager.cpp | 117 ++++++++++++--- limereport/lrglobal.cpp | 6 +- limereport/lrglobal.h | 6 +- limereport/lrpreviewreportwindow.cpp | 4 + limereport/lrreportdesignwindow.cpp | 28 +++- limereport/lrreportdesignwindow.h | 1 + limereport/lrreportrender.cpp | 141 +++++++++++++++--- limereport/scripteditor/lrcodeeditor.cpp | 1 + .../lrxmlbasetypesserializators.cpp | 3 +- lrdview/MainWindow.cpp | 15 +- 21 files changed, 338 insertions(+), 98 deletions(-) diff --git a/common.pri b/common.pri index 140ddb7..08e298c 100644 --- a/common.pri +++ b/common.pri @@ -140,8 +140,8 @@ OBJECTS_DIR = $${ARCH_DIR}/$${BUILD_TYPE}/obj RCC_DIR = $${ARCH_DIR}/$${BUILD_TYPE}/rcc LIMEREPORT_VERSION_MAJOR = 1 -LIMEREPORT_VERSION_MINOR = 5 -LIMEREPORT_VERSION_RELEASE = 90 +LIMEREPORT_VERSION_MINOR = 6 +LIMEREPORT_VERSION_RELEASE = 0 LIMEREPORT_VERSION = '$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}' DEFINES *= LIMEREPORT_VERSION_STR=\\\"$${LIMEREPORT_VERSION}\\\" diff --git a/include/lrglobal.h b/include/lrglobal.h index f1da95f..ed0254a 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -104,10 +104,10 @@ namespace Const{ QString extractClassName(QString className); QString escapeSimbols(const QString& value); QString replaceHTMLSymbols(const QString &value); -#if QT_VERSION < 0x060000 - QVector normalizeCaptures(const QRegExp ®); -#else +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) QVector normalizeCaptures(const QRegularExpressionMatch ®); +#else + QVector normalizeCaptures(const QRegExp ®); #endif bool isColorDark(QColor color); diff --git a/limereport.pro b/limereport.pro index e83f859..74b9954 100644 --- a/limereport.pro +++ b/limereport.pro @@ -17,9 +17,14 @@ SUBDIRS += \ if(equals(QT_MAJOR_VERSION, 5) : greaterThan(QT_MINOR_VERSION, 1)) | equals(QT_MAJOR_VERSION, 6) { SUBDIRS += console \ - lrdview + lrdview + } +#if(equals(QT_MAJOR_VERSION, 5) : greaterThan(QT_MINOR_VERSION, 1)) { +# SUBDIRS += lrdview +#} + !CONFIG(embedded_designer) : !CONFIG(static_build) { SUBDIRS += designer_plugin } diff --git a/limereport/bands/lrpageheader.h b/limereport/bands/lrpageheader.h index ccfdff1..d0607cd 100644 --- a/limereport/bands/lrpageheader.h +++ b/limereport/bands/lrpageheader.h @@ -46,6 +46,7 @@ public: void setPrintOnFirstPage(bool printOnFirstPage); bool printOnLastPage() const; void setPrintOnLastPage(bool printOnLastPage); + bool isHeader() const{return true;} protected: virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); QColor bandColor() const; diff --git a/limereport/bands/lrreportheader.h b/limereport/bands/lrreportheader.h index 0faa493..4a85b3b 100644 --- a/limereport/bands/lrreportheader.h +++ b/limereport/bands/lrreportheader.h @@ -45,6 +45,7 @@ public: virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); bool printBeforePageHeader() const; void setPrintBeforePageHeader(bool printBeforePageHeader); + bool isHeader() const {return true;} protected: QColor bandColor() const; bool m_printBeforePageHeader; diff --git a/limereport/items/editors/lrfonteditorwidget.cpp b/limereport/items/editors/lrfonteditorwidget.cpp index 6c6cfea..ad62f6a 100644 --- a/limereport/items/editors/lrfonteditorwidget.cpp +++ b/limereport/items/editors/lrfonteditorwidget.cpp @@ -63,7 +63,11 @@ void FontEditorWidget::initEditor() m_fontSizeEditor = new QComboBox(this); m_fontSizeEditor->setModel(&m_fontSizeModel); m_fontSizeEditor->setEditable(true); +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + connect(m_fontSizeEditor,SIGNAL(currentTextChanged(QString)),this,SLOT(slotFontSizeChanged(QString))); +#else connect(m_fontSizeEditor,SIGNAL(currentIndexChanged(QString)),this,SLOT(slotFontSizeChanged(QString))); +#endif addWidget(m_fontSizeEditor); addSeparator(); diff --git a/limereport/items/lrsimpletagparser.cpp b/limereport/items/lrsimpletagparser.cpp index 2ee4e6a..54f3532 100644 --- a/limereport/items/lrsimpletagparser.cpp +++ b/limereport/items/lrsimpletagparser.cpp @@ -110,7 +110,7 @@ void HtmlContext::parseSymbs(QString text) text.remove(pos,rx.matchedLength()); } - foreach(QString pattern,m_symbPatterns){ + foreach(QString pattern, m_symbPatterns){ rx.setPattern(pattern); while (text.contains(rx)){ int pos=rx.indexIn(text); @@ -120,6 +120,13 @@ void HtmlContext::parseSymbs(QString text) } #else QRegularExpression rx("<[^<]*>"); + + while (text.contains(rx)){ + int pos=text.indexOf(rx); //rx.indexIn(text); + if (rx.cap().compare("
",Qt::CaseInsensitive)==0) + m_symbs.append(new Symb(rx.cap(),pos)); + text.remove(pos,rx.matchedLength()); + } // TODO: Qt6 port #endif } @@ -191,43 +198,43 @@ bool HtmlContext::isVectorEqual(QVector source, QVector dest) return true; } -QString HtmlContext::extendTextByTags(QString text, int pos) -{ - QString curText=""; - QVector curTags=tagsAt(pos); - for(int i=0;itagText()+'>'; - } +//QString HtmlContext::extendTextByTags(QString text, int pos) +//{ +// QString curText=""; +// QVector curTags=tagsAt(pos); +// for(int i=0;itagText()+'>'; +// } - for(int i=0;i tagsAtPos=tagsAt(pos); - if (!HtmlContext::isVectorEqual(curTags,tagsAtPos)){ - QVector diffs=HtmlContext::tagVectDiff(curTags,tagsAtPos); - foreach(TagDiff diff,diffs){ - if (diff.direction==TagDiff::Inner){ - curText+='<'+diff.tag->tagText()+'>'; - curTags.append(diff.tag); - } - else{ - curText+="tagText(),1)+'>'; - curTags.remove(curTags.indexOf(diff.tag)); - } - } - } - Symb s=symbAt(pos); - if (s.isValid()){ - if (s.isTag()) curText+=s.text()+text.at(i); - else curText+=s.text(); - } else curText+=text.at(i); - } +// for(int i=0;i tagsAtPos=tagsAt(pos); +// if (!HtmlContext::isVectorEqual(curTags,tagsAtPos)){ +// QVector diffs=HtmlContext::tagVectDiff(curTags,tagsAtPos); +// foreach(TagDiff diff,diffs){ +// if (diff.direction==TagDiff::Inner){ +// curText+='<'+diff.tag->tagText()+'>'; +// curTags.append(diff.tag); +// } +// else{ +// curText+="tagText(),1)+'>'; +// curTags.remove(curTags.indexOf(diff.tag)); +// } +// } +// } +// Symb s=symbAt(pos); +// if (s.isValid()){ +// if (s.isTag()) curText+=s.text()+text.at(i); +// else curText+=s.text(); +// } else curText+=text.at(i); +// } - curTags=tagsAt(pos); - for(int i=0;itagText(),1)+'>'; - } +// curTags=tagsAt(pos); +// for(int i=0;itagText(),1)+'>'; +// } - return curText; -} +// return curText; +//} QVector HtmlContext::tagsAt(int pos) { diff --git a/limereport/items/lrsimpletagparser.h b/limereport/items/lrsimpletagparser.h index ea7603c..5079fb1 100644 --- a/limereport/items/lrsimpletagparser.h +++ b/limereport/items/lrsimpletagparser.h @@ -82,7 +82,7 @@ public: static QVector tagVectDiff(QVector source, QVector dest); static bool isVectorEqual(QVector source, QVector dest); void fillTagVector(QString html); - QString extendTextByTags(QString text, int pos); + //QString extendTextByTags(QString text, int pos); QVector tagsAt(int pos); Symb symbAt(int pos); void clearTags(); diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 0effd5d..658aadb 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -360,10 +360,13 @@ void TextItem::updateLayout() bool TextItem::isNeedExpandContent() const { + bool result = false; #if QT_VERSION < 0x060000 QRegExp rx("$*\\{[^{]*\\}"); #else - QRegularExpression rx("$*\\{[^{]*\\}"); + QRegularExpression rx("\\$*\\{[^{]*\\}"); + result = content().contains(rx) || isContentBackedUp(); + return result; #endif return content().contains(rx) || isContentBackedUp(); } diff --git a/limereport/items/lrtextitemeditor.ui b/limereport/items/lrtextitemeditor.ui index 403ea63..7c2945e 100644 --- a/limereport/items/lrtextitemeditor.ui +++ b/limereport/items/lrtextitemeditor.ui @@ -88,9 +88,6 @@ Cancel - - Esc - diff --git a/limereport/limereport.pri b/limereport/limereport.pri index c014955..6e5b5ca 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -35,7 +35,7 @@ SOURCES += \ $$REPORT_PATH/items/editors/lrfonteditorwidget.cpp \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ - $$REPORT_PATH/items/lrsimpletagparser.cpp \ +# $$REPORT_PATH/items/lrsimpletagparser.cpp \ $$REPORT_PATH/items/lrimageitem.cpp \ $$REPORT_PATH/items/lrimageitemeditor.cpp \ $$REPORT_PATH/items/lrtextitemeditor.cpp \ @@ -121,7 +121,7 @@ HEADERS += \ $$REPORT_PATH/items/lrshapeitem.h \ $$REPORT_PATH/items/lrimageitem.h \ $$REPORT_PATH/items/lrimageitemeditor.h \ - $$REPORT_PATH/items/lrsimpletagparser.h \ +# $$REPORT_PATH/items/lrsimpletagparser.h \ $$REPORT_PATH/items/lrverticallayout.h \ $$REPORT_PATH/items/lrlayoutmarker.h \ $$REPORT_PATH/items/lrabstractlayout.h \ diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 03135ff..f280b71 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -423,7 +423,28 @@ QString DataSourceManager::extractField(QString source) } QString DataSourceManager::replaceVariables(QString value){ -#if QT_VERSION < 0x060000 +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + QRegularExpression rx(Const::VARIABLE_RX); + QRegularExpressionMatchIterator iter = rx.globalMatch(value); + qsizetype pos = 0; + QString result; + while (iter.hasNext()) { + QRegularExpressionMatch match = iter.next(); + QString var = match.captured(0); + var.remove("$V{"); + var.remove("}"); + result += value.mid(pos, match.capturedStart(0)); + if (variable(var).isValid()){ + result += variable(var).toString(); + } else { + result += QString(tr("Variable \"%1\" not found!").arg(var)); + } + pos = match.capturedEnd(0); + } + result += value.mid(pos); + return result; + // TODO: Qt6 port - done +#else QRegExp rx(Const::VARIABLE_RX); if (value.contains(rx)){ @@ -440,17 +461,55 @@ QString DataSourceManager::replaceVariables(QString value){ } } } - return value; -#else - QRegularExpression rx(Const::VARIABLE_RX); - // TODO: Qt6 port + return value; #endif return QString(); } QString DataSourceManager::replaceVariables(QString query, QMap &aliasesToParam) { -#if QT_VERSION < 0x060000 +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + QRegularExpression rx(Const::VARIABLE_RX); + int curentAliasIndex = 0; + if (query.contains(rx)){ + int pos = -1; + QRegularExpressionMatch match = rx.match(query); + while ((pos=match.capturedStart())!=-1){ + + QString var=match.captured(0); + var.remove("$V{"); + var.remove("}"); + if (!match.captured(1).isEmpty()){ + if (aliasesToParam.contains(var)){ + curentAliasIndex++; + aliasesToParam.insert(var+"_v_alias"+QString::number(curentAliasIndex),var); + var += "_v_alias"+QString::number(curentAliasIndex); + } else { + aliasesToParam.insert(var,var); + } + query.replace(pos,match.captured(0).length(),":"+var); + } else { + QString varName = match.captured(2).trimmed(); + QString varParam = match.captured(3).trimmed(); + if (!varName.isEmpty()){ + if (!varParam.isEmpty() && varParam.compare("nobind") == 0 ){ + query.replace(pos,match.captured(0).length(), variable(varName).toString()); + } else { + query.replace(pos,match.captured(0).length(), + QString(tr("Unknown parameter \"%1\" for variable \"%2\" found!") + .arg(varName) + .arg(varParam)) + ); + } + } else { + query.replace(pos,match.captured(0).length(),QString(tr("Variable \"%1\" not found!").arg(var))); + } + } + match = rx.match(query); + } + } + // TODO: Qt6 port - done +#else QRegExp rx(Const::VARIABLE_RX); int curentAliasIndex = 0; if (query.contains(rx)){ @@ -488,17 +547,44 @@ QString DataSourceManager::replaceVariables(QString query, QMap } } } - return query; -#else - QRegularExpression rx(Const::VARIABLE_RX); - // TODO: Qt6 port #endif - return QString(); + return query; } QString DataSourceManager::replaceFields(QString query, QMap &aliasesToParam, QString masterDatasource) { -#if QT_VERSION < 0x060000 +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + + QRegularExpression rx(Const::FIELD_RX); + int curentAliasIndex = 0; + if (query.contains(rx)){ + int pos = -1; + QRegularExpressionMatch match = rx.match(query); + while ((pos=match.capturedStart())!=-1){ + + QString field=match.captured(0); + field.remove("$D{"); + field.remove("}"); + + if (!aliasesToParam.contains(field)){ + if (field.contains(".")) + aliasesToParam.insert(field, field); + else + aliasesToParam.insert(field, masterDatasource+"."+field); + } else { + curentAliasIndex++; + if (field.contains(".")) + aliasesToParam.insert(field+"_f_alias"+QString::number(curentAliasIndex), field); + else + aliasesToParam.insert(field+"_f_alias"+QString::number(curentAliasIndex), masterDatasource+"."+field); + field+="_f_alias"+QString::number(curentAliasIndex); + } + query.replace(pos,match.capturedLength(),":"+extractField(field)); + match = rx.match(query); + } + } + // TODO: Qt6 port - possible done +#else QRegExp rx(Const::FIELD_RX); if (query.contains(rx)){ int curentAliasIndex=0; @@ -524,12 +610,9 @@ QString DataSourceManager::replaceFields(QString query, QMap &a query.replace(pos,rx.cap(0).length(),":"+extractField(field)); } } - return query; -#else - QRegularExpression rx(Const::FIELD_RX); - // TODO: Qt6 port + return query; #endif - return QString(); + return query; } void DataSourceManager::setReportVariable(const QString &name, const QVariant &value) diff --git a/limereport/lrglobal.cpp b/limereport/lrglobal.cpp index 8df6e22..cd2b6c0 100644 --- a/limereport/lrglobal.cpp +++ b/limereport/lrglobal.cpp @@ -67,10 +67,10 @@ QString replaceHTMLSymbols(const QString &value) return result; } -#if QT_VERSION < 0x060000 -QVector normalizeCaptures(const QRegExp& reg){ -#else +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) QVector normalizeCaptures(const QRegularExpressionMatch& reg){ +#else +QVector normalizeCaptures(const QRegExp& reg){ #endif QVector result; foreach (QString cap, reg.capturedTexts()) { diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index f1da95f..ed0254a 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -104,10 +104,10 @@ namespace Const{ QString extractClassName(QString className); QString escapeSimbols(const QString& value); QString replaceHTMLSymbols(const QString &value); -#if QT_VERSION < 0x060000 - QVector normalizeCaptures(const QRegExp ®); -#else +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) QVector normalizeCaptures(const QRegularExpressionMatch ®); +#else + QVector normalizeCaptures(const QRegExp ®); #endif bool isColorDark(QColor color); diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 9494042..33691bd 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -119,7 +119,11 @@ PreviewReportWindow::PreviewReportWindow(ReportEngine *report, QWidget *parent, connect(ui->actionShowMessages, SIGNAL(triggered()), this, SLOT(slotShowErrors())); connect(m_previewReportWidget, SIGNAL(scalePercentChanged(int)), this, SLOT(slotScalePercentChanged(int))); +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + connect(m_scalePercent, SIGNAL(currentTextChanged(QString)), this, SLOT(scaleComboboxChanged(QString))); +#else connect(m_scalePercent, SIGNAL(currentIndexChanged(QString)), this, SLOT(scaleComboboxChanged(QString))); +#endif connect(m_previewReportWidget, SIGNAL(pageChanged(int)), this, SLOT(slotCurrentPageChanged(int))); connect(m_previewReportWidget, SIGNAL(itemInserted(LimeReport::PageDesignIntf*, QPointF, QString)), this, SLOT(slotItemInserted(LimeReport::PageDesignIntf*, QPointF, QString))); diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index cae9df2..b7a2b89 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -169,7 +169,7 @@ void ReportDesignWindow::createActions() m_editModeAction->setIcon(QIcon(":/report/images/editMode")); m_editModeAction->setCheckable(true); m_editModeAction->setChecked(true); - m_editModeAction->setShortcut(QKeySequence(Qt::Key_Escape)); + //m_editModeAction->setShortcut(QKeySequence(Qt::Key_Escape)); connect(m_editModeAction,SIGNAL(triggered()),this,SLOT(slotEditMode())); m_undoAction = new QAction(tr("Undo"),this); @@ -502,8 +502,11 @@ void ReportDesignWindow::createBandsButton() connect(m_newTearOffBand,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); m_bandsAddSignalsMap->setMapping(m_newTearOffBand,BandDesignIntf::TearOffBand); m_newBandButton->addAction(m_newTearOffBand); - +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + connect(m_bandsAddSignalsMap,SIGNAL(mappedInt(int)),this,SLOT(slotNewBand(int))); +#else connect(m_bandsAddSignalsMap,SIGNAL(mapped(int)),this,SLOT(slotNewBand(int))); +#endif } void ReportDesignWindow::createMainMenu() @@ -530,7 +533,11 @@ void ReportDesignWindow::createMainMenu() m_infoMenu->addAction(m_aboutAction); m_recentFilesMenu = m_fileMenu->addMenu(tr("Recent Files")); m_recentFilesSignalMap = new QSignalMapper(this); +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + connect(m_recentFilesSignalMap,SIGNAL(mappedString(QString)),this,SLOT(slotLoadRecentFile(QString))); +#else connect(m_recentFilesSignalMap,SIGNAL(mapped(QString)),this,SLOT(slotLoadRecentFile(QString))); +#endif m_recentFilesMenu->setDisabled(m_recentFiles.isEmpty()); } @@ -744,6 +751,11 @@ void ReportDesignWindow::setDocWidgetsVisibility(bool visible) hideDockWidgets(Qt::RightDockWidgetArea,!visible); } +void ReportDesignWindow::keyPressEvent(QKeyEvent *event) +{ + if (event->key()==Qt::Key_Escape){m_editModeAction->trigger();} +} + void ReportDesignWindow::writeState() { settings()->beginGroup("DesignerWindow"); @@ -837,16 +849,16 @@ void ReportDesignWindow::restoreSetting() if (v.isValid()){ restoreGeometry(v.toByteArray()); } else { -#if QT_VERSION < 0x060000 - QDesktopWidget *desktop = QApplication::desktop(); - - int screenWidth = desktop->screenGeometry().width(); - int screenHeight = desktop->screenGeometry().height(); -#else +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) QScreen *screen = QGuiApplication::primaryScreen(); int screenWidth = screen->geometry().width(); int screenHeight = screen->geometry().height(); +#else + QDesktopWidget *desktop = QApplication::desktop(); + + int screenWidth = desktop->screenGeometry().width(); + int screenHeight = desktop->screenGeometry().height(); #endif int x = screenWidth * 0.1; int y = screenHeight * 0.1; diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 6e3ad3d..b1aef76 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -138,6 +138,7 @@ protected: void hideDockWidgets(Qt::DockWidgetArea area, bool value); bool isDockAreaVisible(Qt::DockWidgetArea area); void setDocWidgetsVisibility(bool visible); + void keyPressEvent(QKeyEvent *event); private: void initReportEditor(ReportEnginePrivate* report); diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 3c885a5..e6b39c3 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -196,14 +196,19 @@ void ReportRender::analizeItem(ContentItemDesignIntf* contentItem, BandDesignInt QString content = contentItem->content(); QVector functions; foreach(const QString &functionName, m_datasources->groupFunctionNames()){ -#if QT_VERSION < 0x060000 +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + QRegularExpression rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); + rx.setPatternOptions(rx.InvertedGreedinessOption); + if(content.indexOf(rx)>=0){ + functions.append(functionName); + } + // TODO: Qt6 port - done +#else QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); rx.setMinimal(true); if (rx.indexIn(content)>=0){ functions.append(functionName); - } -#else - // TODO: Qt6 port + } #endif } if (functions.size()>0) @@ -363,13 +368,18 @@ void ReportRender::clearPageMap() bool checkContentItem(ContentItemDesignIntf* item, DataSourceManager* datasources){ QString content = item->content(); foreach(QString functionName, datasources->groupFunctionNames()){ -#if QT_VERSION < 0x060000 +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + QRegularExpression rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); + rx.setPatternOptions(rx.InvertedGreedinessOption); + if(content.indexOf(rx)>=0){ + return true; + } + // TODO: Qt6 port - done +#else QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); if (rx.indexIn(content)>=0){ return true; } -#else - // TODO: Qt6 port #endif } return false; @@ -390,7 +400,78 @@ bool ReportRender::containsGroupFunctions(BaseDesignIntf *container){ } void ReportRender::extractGroupFuntionsFromItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band){ -#if QT_VERSION < 0x060000 +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + + if ( contentItem && contentItem->content().contains(QRegularExpression("\\$S\\s*\\{.*\\}"))){ + foreach(const QString &functionName, m_datasources->groupFunctionNames()){ + QRegularExpression rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); + rx.setPatternOptions(rx.InvertedGreedinessOption); + QRegularExpression rxName(QString(Const::GROUP_FUNCTION_NAME_RX).arg(functionName)); + rxName.setPatternOptions(rx.InvertedGreedinessOption); + + QRegularExpressionMatch match = rx.match(contentItem->content()); + if (match.hasMatch()){ + + QRegularExpressionMatchIterator iter = rx.globalMatch(contentItem->content()); + while(iter.hasNext()){ + match = iter.next(); + QVector captures = normalizeCaptures(match); + if (captures.size() >= 3){ + int dsIndex = captures.size() == 3 ? Const::DATASOURCE_INDEX - 1 : Const::DATASOURCE_INDEX; + BandDesignIntf* dataBand = m_patternPageItem->bandByName(captures.at(dsIndex)); + if (dataBand){ + GroupFunction* gf = datasources()->addGroupFunction( + functionName, captures.at(Const::VALUE_INDEX), band->objectName(), dataBand->objectName() + ); + if (gf){ + connect(dataBand, SIGNAL(bandRendered(BandDesignIntf*)), + gf, SLOT(slotBandRendered(BandDesignIntf*))); + connect(dataBand, SIGNAL(bandReRendered(BandDesignIntf*, BandDesignIntf*)), + gf, SLOT(slotBandReRendered(BandDesignIntf*, BandDesignIntf*))); + } + } else { + GroupFunction* gf = datasources()->addGroupFunction( + functionName, captures.at(Const::VALUE_INDEX), band->objectName(), captures.at(dsIndex) + ); + gf->setInvalid(tr("Databand \"%1\" not found").arg(captures.at(dsIndex))); + } + } + } +// int pos = 0; +// while ( (pos = match.capturedStart()) != -1){ +// QVector captures = normalizeCaptures(match); +// if (captures.size() >= 3){ +// int dsIndex = captures.size() == 3 ? Const::DATASOURCE_INDEX - 1 : Const::DATASOURCE_INDEX; +// BandDesignIntf* dataBand = m_patternPageItem->bandByName(captures.at(dsIndex)); +// if (dataBand){ +// GroupFunction* gf = datasources()->addGroupFunction( +// functionName, captures.at(Const::VALUE_INDEX), band->objectName(), dataBand->objectName() +// ); +// if (gf){ +// connect(dataBand, SIGNAL(bandRendered(BandDesignIntf*)), +// gf, SLOT(slotBandRendered(BandDesignIntf*))); +// connect(dataBand, SIGNAL(bandReRendered(BandDesignIntf*, BandDesignIntf*)), +// gf, SLOT(slotBandReRendered(BandDesignIntf*, BandDesignIntf*))); +// } +// } else { +// GroupFunction* gf = datasources()->addGroupFunction( +// functionName, captures.at(Const::VALUE_INDEX), band->objectName(), captures.at(dsIndex) +// ); +// gf->setInvalid(tr("Databand \"%1\" not found").arg(captures.at(dsIndex))); +// } +// } +// match = rx.match(contentItem->content(), pos + match.capturedLength()); +// } + } else if (contentItem->content().indexOf(rxName)>=0){ + match = rxName.match(contentItem->content()); + GroupFunction* gf = datasources()->addGroupFunction(functionName, match.captured(1), band->objectName(), ""); + gf->setInvalid(tr("Wrong using function %1").arg(functionName)); + } + } + } + + // TODO: Qt6 port - possible done +#else if ( contentItem && contentItem->content().contains(QRegExp("\\$S\\s*\\{.*\\}"))){ foreach(const QString &functionName, m_datasources->groupFunctionNames()){ QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); @@ -424,9 +505,7 @@ void ReportRender::extractGroupFuntionsFromItem(ContentItemDesignIntf* contentIt gf->setInvalid(tr("Wrong using function %1").arg(functionName)); } } - } -#else - // TODO: Qt6 port + } #endif } @@ -450,7 +529,35 @@ void ReportRender::replaceGroupFunctionsInItem(ContentItemDesignIntf* contentIte if (m_groupfunctionItems.contains(contentItem->patternName())){ QString content = contentItem->content(); foreach(QString functionName, m_groupfunctionItems.value(contentItem->patternName())){ -#if QT_VERSION < 0x060000 +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 3) + + QRegularExpression rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); + rx.setPatternOptions(rx.InvertedGreedinessOption); + QRegularExpressionMatch match = rx.match(content); + + if (match.capturedStart() != -1){ + int pos = 0; + while ( (pos = match.capturedStart()) != -1 ){ + QVector captures = normalizeCaptures(match); + if (captures.size() >= 3){ + QString expressionIndex = datasources()->putGroupFunctionsExpressions(captures.at(Const::VALUE_INDEX)); + if (captures.size()<5){ + content.replace(captures.at(0), QString("%1(%2,%3)") + .arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"')); + } else { + content.replace(captures.at(0), QString("%1(%2,%3,%4)").arg( + functionName, + '"'+expressionIndex+'"', + '"'+band->objectName()+'"', + captures.at(4) + )); + } + } + match = rx.match(content, pos + match.capturedLength()); + } + } + // TODO: Qt6 port - possible done +#else QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); rx.setMinimal(true); if (rx.indexIn(content)>=0){ @@ -470,11 +577,9 @@ void ReportRender::replaceGroupFunctionsInItem(ContentItemDesignIntf* contentIte )); } } - pos += rx.matchedLength(); } } -#else - // TODO: Qt6 port + #endif } contentItem->setContent(content); @@ -747,11 +852,13 @@ void ReportRender::renderPageHeader(PageItemDesignIntf *patternPage) void ReportRender::renderReportHeader(PageItemDesignIntf *patternPage, PageRenderStage stage) { BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::ReportHeader); + BandDesignIntf* resBand = 0; if (band){ if (band->property("printBeforePageHeader").toBool() && stage == BeforePageHeader ) - renderBand(band, 0, StartNewPageAsNeeded); + resBand = renderBand(band, 0, StartNewPageAsNeeded); if (!band->property("printBeforePageHeader").toBool() && stage == AfterPageHeader ) - renderBand(band, 0, StartNewPageAsNeeded); + resBand = renderBand(band, 0, StartNewPageAsNeeded); + if (resBand && containsGroupFunctions(band)) m_recalcBands.append(resBand); } } diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index 772b064..4ba71cf 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -91,6 +91,7 @@ void CodeEditor::keyPressEvent(QKeyEvent *e) case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Escape: + m_compleater->popup()->close(); case Qt::Key_Tab: case Qt::Key_Backtab: case Qt::Key_Right: diff --git a/limereport/serializators/lrxmlbasetypesserializators.cpp b/limereport/serializators/lrxmlbasetypesserializators.cpp index d5f0fb9..38feed3 100644 --- a/limereport/serializators/lrxmlbasetypesserializators.cpp +++ b/limereport/serializators/lrxmlbasetypesserializators.cpp @@ -197,7 +197,8 @@ QVariant XmlFontSerializator::loadValue() //#if QT_VERSION>0x040800 // font.setStyleName(node()->attribute("stylename")); //#endif - font.setWeight(static_cast(node()->attribute("weight").toInt())); + if (node()->attribute("weight").toInt() > 0) + font.setWeight(static_cast(node()->attribute("weight").toInt())); if (!node()->attribute("bold").isEmpty()) font.setBold(node()->attribute("bold").toInt()); font.setItalic(node()->attribute("italic").toInt()); diff --git a/lrdview/MainWindow.cpp b/lrdview/MainWindow.cpp index 3619ab5..b90d9e3 100644 --- a/lrdview/MainWindow.cpp +++ b/lrdview/MainWindow.cpp @@ -5,7 +5,9 @@ #include #include #include +#if QT_VERSION < 0x060000 #include +#endif #include "XmlModel.h" #include "SettingDialog.h" #include "lrreportengine.h" @@ -15,11 +17,22 @@ //#endif void centerWindow(QWidget* widget, double widthFactor, double heightFactor) { +#if QT_VERSION < 0x060000 QDesktopWidget desk; int ww = desk.width() * widthFactor; int wh = desk.height() * heightFactor; - widget->resize(ww, wh); widget->move((desk.width() - ww) / 2, (desk.height() - wh) / 2); + widget->resize(ww, wh); +#else + QScreen* desk = QGuiApplication::primaryScreen(); + int ww = desk->geometry().width() * widthFactor; + int wh = desk->geometry().height() * heightFactor; + + widget->resize(ww, wh); + widget->move((desk->geometry().width() - ww) / 2, (desk->geometry().height() - wh) / 2); +#endif + + } MainWindow::MainWindow(QWidget *parent) : From 37b929459b1a0e02abc9fbdfe3f806f0b0863e9c Mon Sep 17 00:00:00 2001 From: Alexander Arin Date: Wed, 3 Nov 2021 00:40:16 +0300 Subject: [PATCH 2/3] Completer refactored --- limereport/lrdatasourcemanager.cpp | 2 +- limereport/lrreportrender.cpp | 4 +- limereport/scripteditor/lrcodeeditor.cpp | 56 +++++++++++++----------- limereport/scripteditor/lrcodeeditor.h | 4 +- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index f280b71..1d7b913 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -583,7 +583,7 @@ QString DataSourceManager::replaceFields(QString query, QMap &a match = rx.match(query); } } - // TODO: Qt6 port - possible done + // TODO: Qt6 port - done #else QRegExp rx(Const::FIELD_RX); if (query.contains(rx)){ diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index e6b39c3..b4777f6 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -470,7 +470,7 @@ void ReportRender::extractGroupFuntionsFromItem(ContentItemDesignIntf* contentIt } } - // TODO: Qt6 port - possible done + // TODO: Qt6 port - done #else if ( contentItem && contentItem->content().contains(QRegExp("\\$S\\s*\\{.*\\}"))){ foreach(const QString &functionName, m_datasources->groupFunctionNames()){ @@ -556,7 +556,7 @@ void ReportRender::replaceGroupFunctionsInItem(ContentItemDesignIntf* contentIte match = rx.match(content, pos + match.capturedLength()); } } - // TODO: Qt6 port - possible done + // TODO: Qt6 port - done #else QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); rx.setMinimal(true); diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index 4ba71cf..cd73ef4 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -15,7 +15,7 @@ namespace LimeReport{ CodeEditor::CodeEditor(QWidget *parent) - : QPlainTextEdit(parent), m_compleater(0) + : QPlainTextEdit(parent), m_completer(0) { lineNumberArea = new LineNumberArea(this); @@ -33,12 +33,13 @@ CodeEditor::CodeEditor(QWidget *parent) void CodeEditor::setCompleter(QCompleter *value) { if (value) disconnect(value,0,this,0); - m_compleater = value; - if (!m_compleater) return; - m_compleater->setWidget(this); - m_compleater->setCompletionMode(QCompleter::PopupCompletion); - m_compleater->setCaseSensitivity(Qt::CaseInsensitive); - connect(m_compleater,SIGNAL(activated(QString)),this,SLOT(insertCompletion(QString))); + m_completer = value; + if (!m_completer) return; + m_completer->setWidget(this); + m_completer->setCompletionMode(QCompleter::PopupCompletion); + m_completer->setCaseSensitivity(Qt::CaseInsensitive); + + connect(m_completer,SIGNAL(activated(QString)),this,SLOT(insertCompletion(QString))); } void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent* event) @@ -86,12 +87,11 @@ int CodeEditor::lineNumberAreaWidth() void CodeEditor::keyPressEvent(QKeyEvent *e) { - if (m_compleater && m_compleater->popup()->isVisible()) { + if (m_completer && m_completer->popup()->isVisible()) { switch (e->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Escape: - m_compleater->popup()->close(); case Qt::Key_Tab: case Qt::Key_Backtab: case Qt::Key_Right: @@ -106,10 +106,10 @@ void CodeEditor::keyPressEvent(QKeyEvent *e) } bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_Space); - if (!m_compleater || !isShortcut) QPlainTextEdit::keyPressEvent(e); + if (!m_completer || !isShortcut) QPlainTextEdit::keyPressEvent(e); const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); - if (!m_compleater || (ctrlOrShift && e->text().isEmpty())) + if (!m_completer || (ctrlOrShift && e->text().isEmpty())) return; bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; @@ -120,36 +120,36 @@ void CodeEditor::keyPressEvent(QKeyEvent *e) || Const::EOW.contains(e->text().right(1))) ) { - m_compleater->popup()->hide(); + m_completer->popup()->hide(); return; } - if (completionPrefix != m_compleater->completionPrefix()) { - m_compleater->setCompletionPrefix(completionPrefix); - m_compleater->popup()->setCurrentIndex(m_compleater->completionModel()->index(0, 0)); + if (completionPrefix != m_completer->completionPrefix()) { + m_completer->setCompletionPrefix(completionPrefix); + m_completer->popup()->setCurrentIndex(m_completer->completionModel()->index(0, 0)); } - QModelIndex ci = m_compleater->completionModel()->index(0,0); - if (ci.isValid() && m_compleater->completionModel()->data(ci).toString().compare(completionPrefix) == 0){ - m_compleater->popup()->hide(); + QModelIndex ci = m_completer->completionModel()->index(0,0); + if (ci.isValid() && m_completer->completionModel()->data(ci).toString().compare(completionPrefix) == 0){ + m_completer->popup()->hide(); return; } QRect cr = cursorRect(); - cr.setWidth(m_compleater->popup()->sizeHintForColumn(0) - + m_compleater->popup()->verticalScrollBar()->sizeHint().width()); - m_compleater->complete(cr); + cr.setWidth(m_completer->popup()->sizeHintForColumn(0) + + m_completer->popup()->verticalScrollBar()->sizeHint().width()); + m_completer->complete(cr); if (!completionPrefix.isEmpty() && completionPrefix.at(completionPrefix.length()-1) == '.') { - m_compleater->popup(); + m_completer->popup(); } } void CodeEditor::focusInEvent(QFocusEvent *e) { - if (m_compleater) m_compleater->setWidget(this); + if (m_completer) m_completer->setWidget(this); QPlainTextEdit::focusInEvent(e); } @@ -279,13 +279,17 @@ QChar CodeEditor::getParenthesisReverceChar(QChar parenthesisChar) void CodeEditor::insertCompletion(const QString &completion) { - if (m_compleater->widget() != this) + if (m_completer->widget() != this) return; QTextCursor tc = textCursor(); - int extra = completion.length() - m_compleater->completionPrefix().length(); + int extra = completion.length() - m_completer->completionPrefix().length(); //tc.movePosition(QTextCursor::Left); //tc.movePosition(QTextCursor::EndOfWord); - tc.insertText(completion.right(extra)); + for (int i=0; i < m_completer->completionPrefix().length(); ++i ) { + tc.deletePreviousChar(); + } + tc.insertText(completion); + //tc.insertText(completion.right(extra)); setTextCursor(tc); } diff --git a/limereport/scripteditor/lrcodeeditor.h b/limereport/scripteditor/lrcodeeditor.h index 851583f..9a638b3 100644 --- a/limereport/scripteditor/lrcodeeditor.h +++ b/limereport/scripteditor/lrcodeeditor.h @@ -20,7 +20,7 @@ class CodeEditor :public QPlainTextEdit public: CodeEditor(QWidget* parent=0); void setCompleter(QCompleter* value); - QCompleter* compleater() const{ return m_compleater;} + QCompleter* compleater() const{ return m_completer;} void lineNumberAreaPaintEvent(QPaintEvent *event); int lineNumberAreaWidth(); protected: @@ -41,7 +41,7 @@ private slots: void updateLineNumberArea(const QRect &rect, int dy); void matchParentheses(); private: - QCompleter* m_compleater; + QCompleter* m_completer; QWidget *lineNumberArea; }; From c7eec9160d21d1dcd36b1981a53f4ea20ad866d1 Mon Sep 17 00:00:00 2001 From: Alexander Arin Date: Thu, 16 Dec 2021 00:13:39 +0300 Subject: [PATCH 3/3] QT_VERSION < 0x060000 -> (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) page order has been fixed when TOC page is present and some pages are not printable --- demo_r2/mainwindow.cpp | 4 +- include/lrglobal.cpp | 2 +- .../designerintegrationv2/sizehandlerect.cpp | 8 +- .../designerintegrationv2/sizehandlerect.h | 9 +- limereport/items/lrchartitem.cpp | 2 +- limereport/items/lrtextitem.cpp | 8 +- limereport/limereport.pri | 2 + limereport/lrbasedesignintf.cpp | 2 +- limereport/lrdatasourcemanager.cpp | 4 +- limereport/lrgraphicsviewzoom.cpp | 2 +- limereport/lrgroupfunctions.cpp | 16 +- limereport/lritemdesignintf.cpp | 2 +- limereport/lrpagedesignintf.cpp | 4 +- limereport/lrpageitemdesignintf.cpp | 2 +- limereport/lrpageitemdesignintf.h | 2 +- limereport/lrpreviewreportwidget.cpp | 6 +- limereport/lrpreviewreportwindow.cpp | 4 +- limereport/lrreportdesignwidget.cpp | 2 +- limereport/lrreportdesignwindow.cpp | 4 +- limereport/lrreportengine.cpp | 8 +- limereport/lrreporttranslation.h | 1 + limereport/lrscriptenginemanager.cpp | 8 +- .../editors/lrbuttonlineeditor.cpp | 4 +- .../lrobjectinspectorwidget.cpp | 6 +- limereport/scripteditor/lrcodeeditor.cpp | 7 +- limereport/scripteditor/lrcompletermodel.cpp | 142 ++++++++++++++++++ limereport/scripteditor/lrcompletermodel.h | 71 +++++++++ limereport/scripteditor/lrscripteditor.cpp | 116 ++++++++------ limereport/scripteditor/lrscripteditor.h | 16 +- lrdview/MainWindow.cpp | 4 +- 30 files changed, 360 insertions(+), 108 deletions(-) create mode 100644 limereport/scripteditor/lrcompletermodel.cpp create mode 100644 limereport/scripteditor/lrcompletermodel.h diff --git a/demo_r2/mainwindow.cpp b/demo_r2/mainwindow.cpp index f95b5a5..47c7149 100644 --- a/demo_r2/mainwindow.cpp +++ b/demo_r2/mainwindow.cpp @@ -3,7 +3,7 @@ #include #include #include -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) #include #else #include @@ -44,7 +44,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->actionOne_to_One, SIGNAL(triggered()), this, SLOT(slotOneToOne())); initPercentCombobox(); enableUI(false); -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QDesktopWidget *desktop = QApplication::desktop(); int screenWidth = desktop->screenGeometry().width(); diff --git a/include/lrglobal.cpp b/include/lrglobal.cpp index e8a31bb..07c5d8e 100644 --- a/include/lrglobal.cpp +++ b/include/lrglobal.cpp @@ -67,7 +67,7 @@ QString replaceHTMLSymbols(const QString &value) return result; } -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QVector normalizeCaptures(const QRegExp& reg){ #else QVector normalizeCaptures(const QRegularExpressionMatch ®){ diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.cpp b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.cpp index 4247769..78d2748 100644 --- a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.cpp +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.cpp @@ -103,9 +103,11 @@ void SizeHandleRect::mousePressEvent(QMouseEvent *e) return; m_startSize = m_curSize = m_resizable->size(); +#if QT_VERSION < QT_VERSION_CHECK(5,15,3) m_startPos = m_curPos = m_resizable->mapFromGlobal(e->globalPos()); - if (debugSizeHandle) - qDebug() << "SizeHandleRect::mousePressEvent" << m_startSize << m_startPos << m_curPos; +#else + m_startPos = m_curPos = m_resizable->mapFromGlobal(e->globalPosition()); +#endif } @@ -136,7 +138,7 @@ void SizeHandleRect::mouseMoveEvent(QMouseEvent *e) delta = QSize(0, 0); break; } - if (delta != QSize(0, 0)) + if (delta != QSizeF(0, 0)) tryResize(delta); } diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.h b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.h index c916b00..d7980ca 100644 --- a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.h +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.h @@ -66,8 +66,15 @@ private: private: const Direction m_dir; - QPoint m_startPos; +#if QT_VERSION < QT_VERSION_CHECK(5,12,3) + QPoint m_startPos; QPoint m_curPos; +#else + QPointF m_startPos; + QPointF m_curPos; +// QSizeF m_startSize; +// QSizeF m_curSize; +#endif QSize m_startSize; QSize m_curSize; QWidget *m_resizable; diff --git a/limereport/items/lrchartitem.cpp b/limereport/items/lrchartitem.cpp index a0f6488..086ed3e 100644 --- a/limereport/items/lrchartitem.cpp +++ b/limereport/items/lrchartitem.cpp @@ -722,7 +722,7 @@ QFont AbstractSeriesChart::adaptLabelsFont(QRectF rect, QFont font) QFontMetrics fm(font); foreach(QString label, m_chartItem->labels()){ -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) foreach (QString currentWord, label.split(QRegExp("\\W+"))){ #else foreach (QString currentWord, label.split(QRegularExpression("\\W+"))){ diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 658aadb..086adca 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -359,11 +359,11 @@ void TextItem::updateLayout() } bool TextItem::isNeedExpandContent() const -{ - bool result = false; -#if QT_VERSION < 0x060000 +{ +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp rx("$*\\{[^{]*\\}"); #else + bool result = false; QRegularExpression rx("\\$*\\{[^{]*\\}"); result = content().contains(rx) || isContentBackedUp(); return result; @@ -824,7 +824,7 @@ void TextItem::expandContent(DataSourceManager* dataManager, RenderPass pass) { QString context=content(); foreach (QString variableName, dataManager->variableNamesByRenderPass(SecondPass)) { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp rx(QString(Const::NAMED_VARIABLE_RX).arg(variableName)); #else QRegularExpression rx(QString(Const::NAMED_VARIABLE_RX).arg(variableName)); diff --git a/limereport/limereport.pri b/limereport/limereport.pri index 6e5b5ca..6615978 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -15,6 +15,7 @@ INCLUDEPATH += \ $$REPORT_PATH/scripteditor SOURCES += \ + $$PWD/scripteditor/lrcompletermodel.cpp \ $$REPORT_PATH/bands/lrpageheader.cpp \ $$REPORT_PATH/bands/lrpagefooter.cpp \ $$REPORT_PATH/bands/lrreportheader.cpp \ @@ -90,6 +91,7 @@ CONFIG(svg) { HEADERS += \ $$PWD/items/lreditableimageitemintf.h \ + $$PWD/scripteditor/lrcompletermodel.h \ $$REPORT_PATH/base/lrsingleton.h \ $$REPORT_PATH/base/lrsimpleabstractfactory.h \ $$REPORT_PATH/base/lrattribsabstractfactory.h \ diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 97660f6..8d35fab 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -64,7 +64,7 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_borderLineSize(1), m_BGMode(OpaqueMode), m_opacity(100), - m_borderLinesFlags(0), + m_borderLinesFlags(BorderLines()), m_storageTypeName(storageTypeName), m_itemMode(DesignMode), m_objectState(ObjectCreated), diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 1d7b913..b3e3738 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -31,7 +31,7 @@ #include "lrdatadesignintf.h" #include #include -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) #include #endif #include @@ -1495,7 +1495,7 @@ void DataSourceManager::invalidateQueriesContainsVariable(const QString& variabl foreach (const QString& datasourceName, dataSourceNames()){ QueryHolder* holder = dynamic_cast(m_datasources.value(datasourceName)); if (holder){ -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp rx(QString(Const::NAMED_VARIABLE_RX).arg(variableName)); #else QRegularExpression rx(QString(Const::NAMED_VARIABLE_RX).arg(variableName)); diff --git a/limereport/lrgraphicsviewzoom.cpp b/limereport/lrgraphicsviewzoom.cpp index ead08cd..54fac03 100644 --- a/limereport/lrgraphicsviewzoom.cpp +++ b/limereport/lrgraphicsviewzoom.cpp @@ -53,7 +53,7 @@ bool GraphicsViewZoomer::eventFilter(QObject *object, QEvent *event) { } else if (event->type() == QEvent::Wheel) { QWheelEvent* wheel_event = static_cast(event); if (QApplication::keyboardModifiers() == m_modifiers) { - #if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) if (wheel_event->orientation() == Qt::Vertical) { double angle = wheel_event->delta(); double factor = qPow(m_zoomFactorBase, angle); diff --git a/limereport/lrgroupfunctions.cpp b/limereport/lrgroupfunctions.cpp index 30db2d2..3130832 100644 --- a/limereport/lrgroupfunctions.cpp +++ b/limereport/lrgroupfunctions.cpp @@ -34,7 +34,7 @@ #include "lrscriptenginemanager.h" #include "lrpageitemdesignintf.h" -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) #include #endif @@ -44,7 +44,7 @@ void GroupFunction::slotBandRendered(BandDesignIntf *band) { ScriptEngineManager& sm = ScriptEngineManager::instance(); -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp rxField(Const::FIELD_RX); QRegExp rxVar(Const::VARIABLE_RX); #else @@ -54,7 +54,7 @@ void GroupFunction::slotBandRendered(BandDesignIntf *band) switch (m_dataType){ case Field:{ -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) if (rxField.indexIn(m_data) != -1){ QString field = rxField.cap(1); #else @@ -72,7 +72,7 @@ void GroupFunction::slotBandRendered(BandDesignIntf *band) break; } case Variable:{ -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) if (rxVar.indexIn(m_data) != -1){ QString var = rxVar.cap(1); #else @@ -149,7 +149,7 @@ QVariant GroupFunction::multiplication(QVariant value1, QVariant value2) GroupFunction::GroupFunction(const QString &expression, const QString &dataBandName, DataSourceManager* dataManager) :m_data(expression), m_dataBandName(dataBandName), m_dataManager(dataManager), m_isValid(true), m_errorMessage("") { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp rxField(Const::FIELD_RX,Qt::CaseInsensitive); QRegExp rxVariable(Const::VARIABLE_RX,Qt::CaseInsensitive); QRegExp rxScript(Const::SCRIPT_RX,Qt::CaseInsensitive); @@ -158,7 +158,7 @@ GroupFunction::GroupFunction(const QString &expression, const QString &dataBandN QRegularExpression rxVariable(Const::VARIABLE_RX, QRegularExpression::CaseInsensitiveOption); QRegularExpression rxScript(Const::SCRIPT_RX, QRegularExpression::CaseInsensitiveOption); #endif -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) if (rxScript.indexIn(expression) != -1){ #else QRegularExpressionMatch matchScript = rxScript.match(expression); @@ -168,7 +168,7 @@ GroupFunction::GroupFunction(const QString &expression, const QString &dataBandN return; } -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) if (rxField.indexIn(expression) != -1){ #else QRegularExpressionMatch matchField = rxField.match(expression); @@ -178,7 +178,7 @@ GroupFunction::GroupFunction(const QString &expression, const QString &dataBandN return; } -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) if (rxVariable.indexIn(expression) != -1){ #else QRegularExpressionMatch matchVariable = rxVariable.match(expression); diff --git a/limereport/lritemdesignintf.cpp b/limereport/lritemdesignintf.cpp index 86e029b..b3f41a6 100644 --- a/limereport/lritemdesignintf.cpp +++ b/limereport/lritemdesignintf.cpp @@ -35,7 +35,7 @@ #include "lrglobal.h" #include -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) #include #endif #include diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index d4db356..785b4a4 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -753,7 +753,7 @@ void PageDesignIntf::dropEvent(QGraphicsSceneDragDropEvent* event) BaseDesignIntf* item = addReportItem("TextItem",event->scenePos(),QSize(250, 50)); TextItem* ti = dynamic_cast(item); QString data = event->mimeData()->text().remove(0,event->mimeData()->text().indexOf(":")+1); -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) if (isVar) data = data.remove(QRegExp(" \\[.*\\]")); #else if (isVar) data = data.remove(QRegularExpression(" \\[.*\\]")); @@ -762,7 +762,7 @@ void PageDesignIntf::dropEvent(QGraphicsSceneDragDropEvent* event) if (!isVar){ BandDesignIntf* parentBand = dynamic_cast(ti->parentItem()); if (parentBand && parentBand->datasourceName().isEmpty()){ -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp dataSource("(?:\\$D\\{\\s*(.*)\\..*\\})"); if (dataSource.indexIn(data) != -1){ parentBand->setProperty("datasource",dataSource.cap(1)); diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 0d57563..f22eede 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -711,7 +711,7 @@ QSizeF PageItemDesignIntf::getRectByPageSize(const PageSize& size) if (size != Custom) { QPrinter printer; printer.setOutputFormat(QPrinter::PdfFormat); -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) printer.setOrientation((QPrinter::Orientation)pageOrientation()); printer.setPaperSize((QPrinter::PageSize)size); return QSizeF(printer.paperSize(QPrinter::Millimeter).width() * 10, diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 97d5118..365c87d 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -66,7 +66,7 @@ class PageItemDesignIntf : public ItemsContainerDesignInft Q_PROPERTY(bool mixWithPriorPage READ mixWithPriorPage WRITE setMixWithPriorPage) friend class ReportRender; public: -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) enum Orientation { Portrait = QPrinter::Portrait, Landscape = QPrinter::Landscape }; enum PrintBehavior {Scale, Split}; diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 71b4d35..bed200e 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -143,7 +143,7 @@ void PreviewReportWidget::initPreview() { if (ui->graphicsView->scene()!=d_ptr->m_previewPage) ui->graphicsView->setScene(d_ptr->m_previewPage); - #if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) ui->graphicsView->resetMatrix(); #else ui->graphicsView->resetTransform(); @@ -299,7 +299,7 @@ void PreviewReportWidget::saveToFile() void PreviewReportWidget::setScalePercent(int percent) { m_scaleChanging = true; -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) ui->graphicsView->resetMatrix(); #else ui->graphicsView->resetTransform(); @@ -482,7 +482,7 @@ void PreviewReportWidget::reportEngineDestroyed(QObject *object) void PreviewReportWidget::slotZoomed(double ) { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) d_ptr->m_scalePercent = ui->graphicsView->matrix().m11()*100; #else d_ptr->m_scalePercent = ui->graphicsView->transform().m11()*100; diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 33691bd..e5c3ddc 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -41,7 +41,7 @@ #include #include #include -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) #include #else #include @@ -147,7 +147,7 @@ void PreviewReportWindow::restoreSetting() if (v.isValid()){ restoreGeometry(v.toByteArray()); } else { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QDesktopWidget *desktop = QApplication::desktop(); int screenWidth = desktop->screenGeometry().width(); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index b59ca70..6b7c608 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -1058,7 +1058,7 @@ bool ReportDesignWidget::eventFilter(QObject *target, QEvent *event) if (event->type() == QEvent::Wheel){ QWheelEvent* we = dynamic_cast(event); if (QApplication::keyboardModifiers()==Qt::ControlModifier){ -#if QT_VERSION < 0x060000 +#if QT_VERSION < QT_VERSION_CHECK(5,12,3) if(we->delta()<0) scale(1.2,1.2); else scale(1/1.2,1/1.2); #else diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index b7a2b89..2fbd9be 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -39,7 +39,7 @@ #include #include #include -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) #include #else #include @@ -1552,7 +1552,7 @@ void ReportDesignWindow::slotPageDeleted() void ReportDesignWindow::slotFilterTextChanged(const QString& filter) { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) m_filterModel->setFilterRegExp(QRegExp(filter, Qt::CaseInsensitive, QRegExp::FixedString)); #else m_filterModel->setFilterRegularExpression(QRegularExpression(filter, QRegularExpression::CaseInsensitiveOption)); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index ba0e8d7..3ff5d34 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -32,7 +32,7 @@ #include #include #include -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) #include #else #include @@ -1324,7 +1324,7 @@ ReportPages ReportEnginePrivate::renderToPages() m_reportRender->renderPageToPages(page), page->mixWithPriorPage() ? MixPages : AppendPages ); - } else { + } else if (page->isTOC()){ startTOCPage = result.count(); pageAfterTOCIndex = i+1; m_reportRender->createTOCMarker(page->resetPageNumber()); @@ -1818,7 +1818,7 @@ PrintProcessor::PrintProcessor(QPrinter* printer) bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) if (!m_firstPage && !m_painter->isActive()) return false; PageDesignIntf* backupPage = dynamic_cast(page->scene()); @@ -1949,7 +1949,7 @@ bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) void PrintProcessor::initPrinter(PageItemDesignIntf* page) { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) if (page->oldPrintMode()){ m_printer->setPageMargins(page->leftMargin(), page->topMargin(), diff --git a/limereport/lrreporttranslation.h b/limereport/lrreporttranslation.h index c9b82a2..8fb6e1e 100644 --- a/limereport/lrreporttranslation.h +++ b/limereport/lrreporttranslation.h @@ -64,6 +64,7 @@ private: PageTranslation* createPageTranslation(PageDesignIntf* page); private: QLocale::Language m_language; + QLocale::Script m_script; QList m_pagesTranslation; }; diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index b027c2c..2abc084 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -354,7 +354,7 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ QString ScriptEngineManager::expandUserVariables(QString context, RenderPass /* pass */, ExpandType expandType, QVariant &varValue) { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp rx(Const::VARIABLE_RX); if (context.contains(rx)){ int pos = 0; @@ -452,7 +452,7 @@ QString ScriptEngineManager::expandUserVariables(QString context, RenderPass /* QString ScriptEngineManager::expandDataFields(QString context, ExpandType expandType, QVariant &varValue, QObject *reportItem) { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp rx(Const::FIELD_RX); if (context.contains(rx)){ @@ -562,7 +562,7 @@ QString ScriptEngineManager::expandDataFields(QString context, ExpandType expand QString ScriptEngineManager::expandScripts(QString context, QVariant& varValue, QObject *reportItem) { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp rx(Const::SCRIPT_RX); if (context.contains(rx)){ @@ -631,7 +631,7 @@ QString ScriptEngineManager::replaceScripts(QString context, QVariant &varValue, QVariant ScriptEngineManager::evaluateScript(const QString& script){ -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QRegExp rx(Const::SCRIPT_RX); QVariant varValue; diff --git a/limereport/objectinspector/editors/lrbuttonlineeditor.cpp b/limereport/objectinspector/editors/lrbuttonlineeditor.cpp index 4eead43..294e384 100644 --- a/limereport/objectinspector/editors/lrbuttonlineeditor.cpp +++ b/limereport/objectinspector/editors/lrbuttonlineeditor.cpp @@ -34,7 +34,7 @@ #include #include #include -#if QT_VERSION < 0x060000 +#if QT_VERSION < QT_VERSION_CHECK(5,12,3) #include #else #include @@ -70,7 +70,7 @@ void ButtonLineEditor::editButtonClicked() { TextItemPropertyEditor* editor = new TextItemPropertyEditor(QApplication::activeWindow()); editor->setAttribute(Qt::WA_DeleteOnClose); -#if QT_VERSION < 0x060000 +#if QT_VERSION < QT_VERSION_CHECK(5,12,3) editor->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, editor->size(), QApplication::desktop()->availableGeometry())); #else editor->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, editor->size(), QGuiApplication::screens().first()->availableGeometry())); diff --git a/limereport/objectinspector/lrobjectinspectorwidget.cpp b/limereport/objectinspector/lrobjectinspectorwidget.cpp index 413c403..2baa105 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.cpp +++ b/limereport/objectinspector/lrobjectinspectorwidget.cpp @@ -168,7 +168,7 @@ bool PropertyFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sou { QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); if (sourceParent.isValid()) return true; -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) return sourceModel()->data(index).toString().contains(filterRegExp()); #else return sourceModel()->data(index).toString().contains(filterRegularExpression()); @@ -182,7 +182,7 @@ ObjectInspectorWidget::ObjectInspectorWidget(QWidget *parent) m_propertyModel = new BaseDesignPropertyModel(this); m_filterModel = new PropertyFilterModel(this); m_filterModel->setSourceModel(m_propertyModel); -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) m_filterModel->setFilterRegExp(QRegExp("", Qt::CaseInsensitive, QRegExp::FixedString)); #else m_filterModel->setFilterRegularExpression(QRegularExpression("", QRegularExpression::CaseInsensitiveOption)); @@ -314,7 +314,7 @@ void ObjectInspectorWidget::updateProperty(const QString &propertyName) void ObjectInspectorWidget::slotFilterTextChanged(const QString &filter) { if (m_filterModel) -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) m_filterModel->setFilterRegExp(QRegExp(filter, Qt::CaseInsensitive, QRegExp::FixedString)); #else m_filterModel->setFilterRegularExpression(QRegularExpression(filter, QRegularExpression::CaseInsensitiveOption)); diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index cd73ef4..c70c20b 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -282,14 +282,13 @@ void CodeEditor::insertCompletion(const QString &completion) if (m_completer->widget() != this) return; QTextCursor tc = textCursor(); - int extra = completion.length() - m_completer->completionPrefix().length(); - //tc.movePosition(QTextCursor::Left); - //tc.movePosition(QTextCursor::EndOfWord); +// QString prefix = m_completer->completionPrefix(); +// int extra = completion.length() - prefix.length(); for (int i=0; i < m_completer->completionPrefix().length(); ++i ) { tc.deletePreviousChar(); } tc.insertText(completion); - //tc.insertText(completion.right(extra)); +// tc.insertText(completion.right(extra)); setTextCursor(tc); } diff --git a/limereport/scripteditor/lrcompletermodel.cpp b/limereport/scripteditor/lrcompletermodel.cpp new file mode 100644 index 0000000..29c7116 --- /dev/null +++ b/limereport/scripteditor/lrcompletermodel.cpp @@ -0,0 +1,142 @@ +#include "lrcompletermodel.h" +#include + +CompleterModel::CompleterModel(QObject *parent) : QAbstractItemModel(parent){m_root.setModel(this);} + +QModelIndex CompleterModel::index(int row, int column, const QModelIndex &parent) const +{ + CompleterItem const *parentItem; + if (!parent.isValid()) + parentItem = &m_root; + else + parentItem = static_cast(parent.internalPointer()); + + if ((parentItem == nullptr) + || (row < 0) + || (column < 0) + || (row >= parentItem->rowCount()) + || (column >= 1)) + { + return QModelIndex(); + } + 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); + } + } + return QModelIndex(); +} + +int CompleterModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()){ + CompleterItem *parentItem = static_cast(parent.internalPointer()); + return parentItem->rowCount(); + } + return m_root.rowCount(); +} + +int CompleterModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + return 1; +} + +QVariant CompleterModel::data(const QModelIndex &index, int role) const +{ + if (index.isValid()){ + CompleterItem* item = static_cast(index.internalPointer()); + switch (role) { + case Qt::DisplayRole: + case Qt::EditRole: + if (!item) return QVariant(); + + if (index.column()==0){ + return item->text(); + } else { + return ""; + } + case Qt::DecorationRole : + if (!item) return QIcon(); + if (index.column()==0){ + return item->icon(); + } else return QIcon(); + default: + return QVariant(); + } + } + return QVariant(); +} + +QList CompleterModel::findItems(const QString &text, Qt::MatchFlags flags, int column) const +{ + QModelIndexList indexes = match(index(0, column, QModelIndex()), + Qt::DisplayRole, text, -1, flags); + QList items; + const int numIndexes = indexes.size(); + items.reserve(numIndexes); + for (int i = 0; i < numIndexes; ++i) + items.append(itemFromIndex(indexes.at(i))); + return items; +} + +void CompleterModel::clear() +{ + beginResetModel(); + m_root.clear(); + endResetModel(); +} + +CompleterItem *CompleterModel::itemFromIndex(const QModelIndex index) const +{ + if ((index.row() < 0) || (index.column() < 0) || (index.model() != this)) + return nullptr; + CompleterItem *parent = static_cast(index.internalPointer()); + if (parent == nullptr) + return nullptr; + CompleterItem *item = parent->child(index.row()); + return item; +} + +QModelIndex CompleterModel::indexFromItem(CompleterItem *item) const +{ + if (item && item->parent()){ + return createIndex(item->row(), 0, item); + } + return QModelIndex(); +} + +CompleterItem::~CompleterItem(){} + +void CompleterItem::setIcon(const QIcon &newIcon) +{ + m_icon = newIcon; +} + +void CompleterItem::setText(const QString &newText) +{ + m_text = newText; +} + +void CompleterItem::appendRow(CompleterItem *child){ + child->m_parent = this; + child->m_model = this->m_model; + m_children.append(QSharedPointer(child)); + if (m_model){ + QModelIndex start = m_model->indexFromItem(child); + emit m_model->dataChanged(start, start); + } +} + +void CompleterItem::appendRows(const QList &children){ + foreach(CompleterItem* item, children){ + appendRow(item); + } +} diff --git a/limereport/scripteditor/lrcompletermodel.h b/limereport/scripteditor/lrcompletermodel.h new file mode 100644 index 0000000..862437a --- /dev/null +++ b/limereport/scripteditor/lrcompletermodel.h @@ -0,0 +1,71 @@ +#ifndef COMPLETERMODEL_H +#define COMPLETERMODEL_H + +#include +#include + +class CompleterModel; + +class CompleterItem { +public: + CompleterItem():m_parent(0), m_model(0){} + 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* parent() const {return m_parent;} + int row() const{ + if (m_parent){ + for(int i=0; i < m_parent->m_children.count(); ++i){ + CompleterItem* c = m_parent->m_children.at(i).data(); + if (c == this) return i; + } + } + return -1; + } + QString text(){return m_text;} + QIcon icon() {return m_icon;} + + void setIcon(const QIcon &newIcon); + void setText(const QString &newText); + void setModel(CompleterModel* model){m_model=model;} + void clear(){m_children.clear();} + void appendRow(CompleterItem* child); + void appendRows(const QList &children); +private: + CompleterItem* m_parent; + QVector > m_children; + QString m_text; + QIcon m_icon; + CompleterModel* m_model; +}; + + +class CompleterModel : public QAbstractItemModel +{ + friend CompleterItem; +public: + explicit CompleterModel(QObject *parent = nullptr); + + // QAbstractItemModel interface +public: + QModelIndex index(int row, int column, const QModelIndex &parent) const; + QModelIndex parent(const QModelIndex &child) const; + int rowCount(const QModelIndex &parent) const; + int columnCount(const QModelIndex &parent) const; + QVariant data(const QModelIndex &index, int role) const; + CompleterItem* invisibleRootItem(){return &m_root;} + QList findItems(const QString &text, + Qt::MatchFlags flags = Qt::MatchExactly, + int column = 0) const; + void clear(); +private: + CompleterItem *itemFromIndex(const QModelIndex index) const; + QModelIndex indexFromItem(CompleterItem *item) const; +private: + CompleterItem m_root; +public: + +}; + +#endif // COMPLETERMODEL_H diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 34e2c74..916739e 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -20,7 +20,7 @@ ScriptEditor::ScriptEditor(QWidget *parent) : setFocusProxy(ui->textEdit); m_completer = new ReportStructureCompleater(this); ui->textEdit->setCompleter(m_completer); -#if QT_VERSION < 0x060000 +#if QT_VERSION < QT_VERSION_CHECK(5,12,3) ui->textEdit->setTabStopWidth(ui->textEdit->fontMetrics().boundingRect("0").width()*m_tabIndention); #else ui->textEdit->setTabStopDistance(ui->textEdit->fontMetrics().boundingRect("0").width()*m_tabIndention); @@ -90,7 +90,7 @@ void ScriptEditor::setPageBand(BandDesignIntf* band) void ScriptEditor::setTabIndention(int charCount) { if (m_tabIndention != charCount){ -#if QT_VERSION < 0x060000 +#if QT_VERSION < QT_VERSION_CHECK(5,12,3) ui->textEdit->setTabStopWidth(ui->textEdit->fontMetrics().boundingRect("W").width()*charCount); #else ui->textEdit->setTabStopDistance(ui->textEdit->fontMetrics().boundingRect("W").width()*charCount); @@ -182,21 +182,21 @@ QStringList ReportStructureCompleater::splitPath(const QString &path) const return path.split("."); } -void ReportStructureCompleater::addAdditionalDatawords(QStandardItemModel* model, DataSourceManager* dataManager){ +void ReportStructureCompleater::addAdditionalDatawords(CompleterModel* model, DataSourceManager* dataManager){ foreach(const QString &dsName,dataManager->dataSourceNames()){ - QStandardItem* dsNode = new QStandardItem; + CompleterItem* dsNode = new CompleterItem; dsNode->setText(dsName); + model->invisibleRootItem()->appendRow(dsNode); foreach(const QString &field, dataManager->fieldNames(dsName)){ - QStandardItem* fieldNode = new QStandardItem; + CompleterItem* fieldNode = new CompleterItem; fieldNode->setText(field); dsNode->appendRow(fieldNode); } - model->invisibleRootItem()->appendRow(dsNode); } foreach (QString varName, dataManager->variableNames()) { - QStandardItem* varNode = new QStandardItem; + CompleterItem* varNode = new CompleterItem; varNode->setText(varName.remove("#")); model->invisibleRootItem()->appendRow(varNode); } @@ -208,19 +208,20 @@ void ReportStructureCompleater::addAdditionalDatawords(QStandardItemModel* model while (it.hasNext()){ it.next(); if (it.value().isCallable() ){ - QStandardItem* itemNode = new QStandardItem; + CompleterItem* itemNode = new CompleterItem; itemNode->setText(it.name()+"()"); model->invisibleRootItem()->appendRow(itemNode); } if (it.value().isQObject()){ if (it.value().toQObject()){ if (model->findItems(it.name()).isEmpty()){ - QStandardItem* objectNode = new QStandardItem; + CompleterItem* objectNode = new CompleterItem; objectNode->setText(it.name()); objectNode->setIcon(QIcon(":/report/images/object")); + for (int i = 0; i< it.value().toQObject()->metaObject()->methodCount();++i){ if (it.value().toQObject()->metaObject()->method(i).methodType() == QMetaMethod::Method){ - QStandardItem* methodNode = new QStandardItem; + CompleterItem* methodNode = new CompleterItem; QMetaMethod m = it.value().toQObject()->metaObject()->method(i); QString methodSignature = m.name() + "("; bool isFirst = true; @@ -245,46 +246,49 @@ void ReportStructureCompleater::addAdditionalDatawords(QStandardItemModel* model void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterface* report) { if (report){ - m_model.clear(); + m_newModel.clear(); + QIcon signalIcon(":/report/images/signal"); QIcon propertyIcon(":/report/images/property"); for ( int i = 0; i < report->pageCount(); ++i){ PageDesignIntf* page = report->pageAt(i); - QStandardItem* itemNode = new QStandardItem; + CompleterItem* itemNode = new CompleterItem; itemNode->setText(page->pageItem()->objectName()); itemNode->setIcon(QIcon(":/report/images/object")); - m_model.invisibleRootItem()->appendRow(itemNode); QStringList items = extractSignalNames(page->pageItem()); foreach(QString slotName, items){ - QStandardItem* slotItem = new QStandardItem; + CompleterItem* slotItem = new CompleterItem; slotItem->setText(slotName); slotItem->setIcon(signalIcon); itemNode->appendRow(slotItem); } items = extractProperties(page->pageItem()); foreach(QString propertyName, items){ - QStandardItem* properyItem = new QStandardItem; + CompleterItem* properyItem = new CompleterItem; properyItem->setText(propertyName); properyItem->setIcon(propertyIcon); itemNode->appendRow(properyItem); } + foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ - addChildItem(item, itemNode->text(), m_model.invisibleRootItem()); + addChildItem(item, itemNode->text(), m_newModel.invisibleRootItem()); } + + m_newModel.invisibleRootItem()->appendRow(itemNode); } - addAdditionalDatawords(&m_model, report->dataManager()); - m_model.sort(0); + addAdditionalDatawords(&m_newModel, report->dataManager()); + m_newModel.sort(0); } } void ReportStructureCompleater::updateCompleaterModel(DataSourceManager *dataManager) { - m_model.clear(); - addAdditionalDatawords(&m_model, dataManager); + m_newModel.clear(); + addAdditionalDatawords(&m_newModel, dataManager); } QStringList ReportStructureCompleater::extractSignalNames(BaseDesignIntf *item) @@ -325,46 +329,64 @@ QStringList ReportStructureCompleater::extractProperties(BaseDesignIntf *item) return result; } -void ReportStructureCompleater::addChildItem(BaseDesignIntf *item, const QString &pageName, QStandardItem *parent) +void ReportStructureCompleater::addChildItem(BaseDesignIntf *item, const QString &pageName, CompleterItem *parent) { if (!item) return; QIcon signalIcon(":/report/images/signal"); QIcon propertyIcon(":/report/images/property"); - QStandardItem* itemNode = new QStandardItem; + CompleterItem* itemNode = new CompleterItem; itemNode->setText(pageName+"_"+item->objectName()); itemNode->setIcon(QIcon(":/report/images/object")); parent->appendRow(itemNode); - QStringList items; - if (!m_signals.contains(item->metaObject()->className())){ - items = extractSignalNames(item); - m_signals.insert(item->metaObject()->className(),items); - } else { - items = m_signals.value(item->metaObject()->className()); - } +// if (m_cache.contains(item->metaObject()->className())){ - foreach(QString slotName, items){ - QStandardItem* slotItem = new QStandardItem; - slotItem->setText(slotName); - slotItem->setIcon(signalIcon); - itemNode->appendRow(slotItem); - } +// QSharedPointer cacheItem = m_cache.value(item->metaObject()->className()); +// itemNode->appendRows(cacheItem->slotsItems); +// itemNode->appendRows(cacheItem->propsItems); - if (!m_properties.contains(item->metaObject()->className())){ - items = extractProperties(item); - m_properties.insert(item->metaObject()->className(),items); - } else { - items = m_properties.value(item->metaObject()->className()); - } +// } else { - foreach(QString propertyName, items){ - QStandardItem* properyItem = new QStandardItem; - properyItem->setText(propertyName); - properyItem->setIcon(propertyIcon); - itemNode->appendRow(properyItem); - } +// QSharedPointer cacheItem = QSharedPointer(new CacheItem); + + QStringList items; + if (!m_signals.contains(item->metaObject()->className())){ + items = extractSignalNames(item); + m_signals.insert(item->metaObject()->className(),items); + } else { + items = m_signals.value(item->metaObject()->className()); + } + + foreach(QString slotName, items){ + CompleterItem* slotItem = new CompleterItem; + slotItem->setText(slotName); + slotItem->setIcon(signalIcon); + //cacheItem->slotsItems.append(QSharedPointer(slotItem)); + itemNode->appendRow(slotItem); + + } + + if (!m_properties.contains(item->metaObject()->className())){ + items = extractProperties(item); + m_properties.insert(item->metaObject()->className(),items); + } else { + items = m_properties.value(item->metaObject()->className()); + } + + foreach(QString propertyName, items){ + CompleterItem* properyItem = new CompleterItem; + properyItem->setText(propertyName); + properyItem->setIcon(propertyIcon); + itemNode->appendRow(properyItem); + //cacheItem->propsItems.append(QSharedPointer(properyItem)); + } + + //m_cache.insert(item->metaObject()->className(), cacheItem); + //itemNode->appendRows(cacheItem->slotsItems); + //itemNode->appendRows(cacheItem->propsItems); + //} foreach (BaseDesignIntf* child, item->childBaseItems()){ addChildItem(child, pageName, parent); diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index 10dcd5a..ea0a433 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -7,6 +7,7 @@ #include #include #include +#include "lrcompletermodel.h" namespace LimeReport{ @@ -20,12 +21,17 @@ namespace Ui { class ScriptEditor; } +struct CacheItem { + QList> propsItems; + QList> slotsItems; +}; + class ReportStructureCompleater : public QCompleter{ Q_OBJECT public: - explicit ReportStructureCompleater(QObject* parent = 0): QCompleter(parent){ setModel(&m_model);} + explicit ReportStructureCompleater(QObject* parent = 0): QCompleter(parent){ setModel(&m_newModel);} explicit ReportStructureCompleater(QAbstractItemModel* model, QObject* parent = 0) - :QCompleter(model, parent){ setModel(&m_model);} + :QCompleter(model, parent){ setModel(&m_newModel);} public: // QCompleter interface QString pathFromIndex(const QModelIndex& index) const; @@ -35,10 +41,10 @@ public: protected: QStringList extractSignalNames(BaseDesignIntf* item); QStringList extractProperties(BaseDesignIntf* item); - void addChildItem(BaseDesignIntf *item, const QString &pageName, QStandardItem *parent); - void addAdditionalDatawords(QStandardItemModel* model, DataSourceManager *dataManager); + void addChildItem(BaseDesignIntf *item, const QString &pageName, CompleterItem *parent); + void addAdditionalDatawords(CompleterModel *model, DataSourceManager *dataManager); private: - QStandardItemModel m_model; + CompleterModel m_newModel; QMap m_properties; QMap m_signals; }; diff --git a/lrdview/MainWindow.cpp b/lrdview/MainWindow.cpp index b90d9e3..1a26d00 100644 --- a/lrdview/MainWindow.cpp +++ b/lrdview/MainWindow.cpp @@ -5,7 +5,7 @@ #include #include #include -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) #include #endif #include "XmlModel.h" @@ -17,7 +17,7 @@ //#endif void centerWindow(QWidget* widget, double widthFactor, double heightFactor) { -#if QT_VERSION < 0x060000 +#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 1)) QDesktopWidget desk; int ww = desk.width() * widthFactor; int wh = desk.height() * heightFactor;