diff --git a/common.pri b/common.pri index f0cd913..2cebc25 100644 --- a/common.pri +++ b/common.pri @@ -32,13 +32,12 @@ contains(CONFIG, easy_profiler){ !contains(CONFIG, qtscriptengine){ greaterThan(QT_MAJOR_VERSION, 4){ +greaterThan(QT_MINOR_VERSION, 5){ CONFIG *= qjsengine -#greaterThan(QT_MINOR_VERSION, 5){ -# CONFIG *= qjsengine -#} -#lessThan(QT_MINOR_VERSION, 6){ -# CONFIG *= qtscriptengine -#} +} +lessThan(QT_MINOR_VERSION, 6){ + CONFIG *= qtscriptengine +} } lessThan(QT_MAJOR_VERSION, 5){ CONFIG *= qtscriptengine diff --git a/designer/main.cpp b/designer/main.cpp index d36ee1d..413f33f 100644 --- a/designer/main.cpp +++ b/designer/main.cpp @@ -10,17 +10,24 @@ int main(int argc, char *argv[]) DesignerSettingManager manager; QTranslator limeReportTranslator; - QTranslator qtTranslator; + QTranslator qtBaseTranslator; + QTranslator qtDesignerTranslator; + QTranslator qtLinguistTranslator; + QString translationPath = QApplication::applicationDirPath(); - translationPath.append("/languages"); + translationPath.append("/translations"); Qt::LayoutDirection layoutDirection = QLocale::system().textDirection(); QString designerTranslation = QLocale(manager.getCurrentDefaultLanguage()).name(); if (limeReportTranslator.load("limereport_"+designerTranslation, translationPath)){ - qtTranslator.load("qt_" + designerTranslation, translationPath); - a.installTranslator(&qtTranslator); + qtBaseTranslator.load("qtbase_" + designerTranslation, translationPath); + qtDesignerTranslator.load("designer_"+designerTranslation,translationPath); + + a.installTranslator(&qtBaseTranslator); + a.installTranslator(&qtDesignerTranslator); a.installTranslator(&limeReportTranslator); + Qt::LayoutDirection layoutDirection = QLocale(manager.getCurrentDefaultLanguage()).textDirection(); a.setLayoutDirection(layoutDirection); } diff --git a/include/lrglobal.h b/include/lrglobal.h index d1cb8b9..bf23065 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -95,6 +95,7 @@ namespace Const{ const int SCENE_MARGIN = 50; const QString FUNCTION_MANAGER_NAME = "LimeReport"; const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); + const int DEFAULT_TAB_INDENTION = 4; } QString extractClassName(QString className); @@ -157,6 +158,7 @@ namespace Const{ static inline QJSValue getJSValue(QJSEngine &e, T *p) { QJSValue res = e.newQObject(p); + QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); return res; } #else diff --git a/limereport/items/lrtextitemeditor.cpp b/limereport/items/lrtextitemeditor.cpp index 8b2e28b..8299fbc 100644 --- a/limereport/items/lrtextitemeditor.cpp +++ b/limereport/items/lrtextitemeditor.cpp @@ -118,8 +118,6 @@ void TextItemEditor::initUI() { QStringList dataWords; - ui->toolButton->setChecked(false); - ui->gbSettings->setVisible(false); LimeReport::DataSourceManager* dm = m_page->datasourceManager(); LimeReport::ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); se.setDataManager(dm); @@ -152,13 +150,19 @@ void TextItemEditor::readSetting() if (v.isValid()){ ui->codeEditor->restoreState(v.toByteArray()); } - - QVariant fontName = settings()->value("FontName"); + settings()->endGroup(); + settings()->beginGroup("ScriptEditor"); + QVariant fontName = settings()->value("DefaultFontName"); if (fontName.isValid()){ - QVariant fontSize = settings()->value("FontSize"); + QVariant fontSize = settings()->value("DefaultFontSize"); ui->codeEditor->setEditorFont(QFont(fontName.toString(),fontSize.toInt())); - ui->editorFont->setCurrentFont(ui->codeEditor->editorFont()); - ui->editorFontSize->setValue(fontSize.toInt()); + } + + QVariant tabIndention = settings()->value("TabIndention"); + if (tabIndention.isValid()){ + ui->codeEditor->setTabIndention(tabIndention.toInt()); + } else { + ui->codeEditor->setTabIndention(LimeReport::Const::DEFAULT_TAB_INDENTION); } settings()->endGroup(); @@ -175,33 +179,6 @@ void TextItemEditor::writeSetting() } } -void TextItemEditor::on_editorFont_currentFontChanged(const QFont &f) -{ - if (m_isReadingSetting) return; - QFont tmp = f; - tmp.setPointSize(ui->editorFontSize->value()); - ui->codeEditor->setEditorFont(tmp); - settings()->beginGroup("TextItemEditor"); - settings()->setValue("FontName",ui->codeEditor->editorFont().family()); - settings()->setValue("FontSize",ui->editorFontSize->value()); - settings()->endGroup(); -} - -void TextItemEditor::on_editorFontSize_valueChanged(int arg1) -{ - if (m_isReadingSetting) return; - ui->codeEditor->setEditorFont(QFont(ui->codeEditor->editorFont().family(),arg1)); - settings()->beginGroup("TextItemEditor"); - settings()->setValue("FontName",ui->codeEditor->editorFont().family()); - settings()->setValue("FontSize",ui->editorFontSize->value()); - settings()->endGroup(); -} - -void TextItemEditor::on_toolButton_clicked(bool checked) -{ - ui->gbSettings->setVisible(checked); -} - void TextItemEditor::slotSplitterMoved(int, int) { writeSetting(); diff --git a/limereport/items/lrtextitemeditor.h b/limereport/items/lrtextitemeditor.h index 43b41ad..b9e2750 100644 --- a/limereport/items/lrtextitemeditor.h +++ b/limereport/items/lrtextitemeditor.h @@ -69,7 +69,7 @@ public: QSettings* settings=0, QWidget *parent = 0); ~TextItemEditor(); void setSettings(QSettings* value); - QSettings* settings(); + QSettings* settings(); protected: void resizeEvent(QResizeEvent *); void moveEvent(QMoveEvent *); @@ -78,9 +78,6 @@ protected: private slots: void on_pbOk_clicked(); void on_pbCancel_clicked(); - void on_editorFont_currentFontChanged(const QFont &f); - void on_editorFontSize_valueChanged(int arg1); - void on_toolButton_clicked(bool checked); void slotSplitterMoved(int, int); private: void initUI(); diff --git a/limereport/items/lrtextitemeditor.ui b/limereport/items/lrtextitemeditor.ui index f9d74e4..403ea63 100644 --- a/limereport/items/lrtextitemeditor.ui +++ b/limereport/items/lrtextitemeditor.ui @@ -17,7 +17,7 @@ Text Item Editor - + :/items/images/insert-text_3.png:/items/images/insert-text_3.png @@ -58,68 +58,8 @@ - - - - Editor settings - - - - - - - - Editor font - - - - - - - - - - 11 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - ... - - - - :/items/images/settings.png:/items/images/settings.png - - - true - - - true - - - @@ -169,6 +109,9 @@ pbOk pbCancel - + + + + diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index d1cb8b9..bf23065 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -95,6 +95,7 @@ namespace Const{ const int SCENE_MARGIN = 50; const QString FUNCTION_MANAGER_NAME = "LimeReport"; const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); + const int DEFAULT_TAB_INDENTION = 4; } QString extractClassName(QString className); @@ -157,6 +158,7 @@ namespace Const{ static inline QJSValue getJSValue(QJSEngine &e, T *p) { QJSValue res = e.newQObject(p); + QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); return res; } #else diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 23627f0..dbf89f7 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -210,7 +210,10 @@ namespace LimeReport { void multiItemsSelected(QList* objectsList); void miltiItemsSelectionFinished(); void commandHistoryChanged(); - void itemPropertyChanged(const QString& objectName, const QString& propertyName, const QVariant& oldValue, const QVariant& newValue); + void itemPropertyChanged(const QString& objectName, + const QString& propertyName, + const QVariant& oldValue, + const QVariant& newValue); void itemAdded(LimeReport::PageDesignIntf* page, LimeReport::BaseDesignIntf* item); void itemRemoved(LimeReport::PageDesignIntf* page, LimeReport::BaseDesignIntf* item); void bandAdded(LimeReport::PageDesignIntf* page, LimeReport::BandDesignIntf* band); @@ -247,7 +250,9 @@ namespace LimeReport { void setBorders(const BaseDesignIntf::BorderLines& border); private slots: void slotPageGeometryChanged(QObject*, QRectF, QRectF ); - void slotItemPropertyChanged(QString propertyName, const QVariant &oldValue, const QVariant &newValue); + void slotItemPropertyChanged(QString propertyName, + const QVariant &oldValue, + const QVariant &newValue); void slotItemPropertyObjectNameChanged(const QString& oldName, const QString& newName); void bandDeleted(QObject* band); void slotPageItemLoaded(QObject *); @@ -262,7 +267,10 @@ namespace LimeReport { void checkSizeOrPosChanges(); CommandIf::Ptr createChangePosCommand(); CommandIf::Ptr createChangeSizeCommand(); - void saveChangeProppertyCommand(const QString& objectName, const QString& propertyName, const QVariant& oldPropertyValue, const QVariant& newPropertyValue); + void saveChangeProppertyCommand(const QString& objectName, + const QString& propertyName, + const QVariant& oldPropertyValue, + const QVariant& newPropertyValue); void changeSelectedGroupProperty(const QString& name,const QVariant& value); private: diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index c8c2378..fb24404 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -203,7 +203,11 @@ void PreviewReportWidget::print() printer.setPrinterName(pi.defaultPrinter().printerName()); #endif #ifdef HAVE_QT5 +#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) printer.setPrinterName(pi.defaultPrinterName()); +#else + printer.setPrinterName(pi.defaultPrinter().printerName()); +#endif #endif QPrintDialog dialog(&printer,QApplication::activeWindow()); if (dialog.exec()==QDialog::Accepted){ diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 64e04f6..750ae0a 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -51,12 +51,13 @@ namespace LimeReport { // ReportDesignIntf -ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QMainWindow *mainWindow, QWidget *parent) : +ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QSettings* settings, QMainWindow *mainWindow, QWidget *parent) : QWidget(parent), #ifdef HAVE_QTDESIGNER_INTEGRATION m_dialogDesignerManager(new DialogDesignerManager(this)), #endif - m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), m_dialogChanged(false), m_useDarkTheme(false) + m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), + m_dialogChanged(false), m_useDarkTheme(false), m_settings(settings) { #ifdef HAVE_QT4 m_tabWidget = new LimeReportTabWidget(this); @@ -205,41 +206,55 @@ void ReportDesignWidget::applySettings() parentWidget()->setStyleSheet(""); m_report->setStyleSheet(""); } + + if (m_settings){ + m_settings->beginGroup("ScriptEditor"); + QVariant v = m_settings->value("DefaultFontName"); + if (v.isValid()){ + QVariant fontSize = m_settings->value("DefaultFontSize"); + m_scriptEditor->setEditorFont(QFont(v.toString(),fontSize.toInt())); + } + v = m_settings->value("TabIndention"); + if (v.isValid()){ + m_scriptEditor->setTabIndention(v.toInt()); + } + m_settings->endGroup(); + } } -void ReportDesignWidget::loadState(QSettings* settings) +void ReportDesignWidget::loadState() { - settings->beginGroup("DesignerWidget"); - QVariant v = settings->value("hGridStep"); + m_settings->beginGroup("DesignerWidget"); + QVariant v = m_settings->value("hGridStep"); if (v.isValid()){ m_horizontalGridStep = v.toInt(); } - v = settings->value("vGridStep"); + v = m_settings->value("vGridStep"); if (v.isValid()){ m_verticalGridStep = v.toInt(); } - v = settings->value("defaultFont"); + v = m_settings->value("defaultFont"); if (v.isValid()){ m_defaultFont = v.value(); } - v = settings->value("useGrid"); + v = m_settings->value("useGrid"); if (v.isValid()){ m_useGrid = v.toBool(); } - v = settings->value("useDarkTheme"); + v = m_settings->value("useDarkTheme"); if (v.isValid()){ m_useDarkTheme = v.toBool(); } - v = settings->value("ScriptEditorState"); + v = m_settings->value("ScriptEditorState"); if (v.isValid()){ m_scriptEditor->restoreState(v.toByteArray()); } - settings->endGroup(); + m_settings->endGroup(); applySettings(); } @@ -720,6 +735,7 @@ void ReportDesignWidget::deleteCurrentPage() void ReportDesignWidget::editSetting() { SettingDialog setting(this); + setting.setSettings(m_settings); setting.setVerticalGridStep(m_verticalGridStep); setting.setHorizontalGridStep(m_horizontalGridStep); setting.setDefaultFont(m_defaultFont); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index da9719f..0352158 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -84,7 +84,8 @@ public: Translations, TabTypeCount }; - ReportDesignWidget(ReportEnginePrivateInterface* report, QMainWindow *mainWindow, QWidget *parent = 0); + ReportDesignWidget(ReportEnginePrivateInterface* report, QSettings* settings, + QMainWindow *mainWindow, QWidget *parent = 0); ~ReportDesignWidget(); void createStartPage(); void clear(); @@ -112,7 +113,7 @@ public: bool emitSaveReportAs(); bool emitLoadReport(); void saveState(QSettings *settings); - void loadState(QSettings *settings); + void loadState(); void applySettings(); void applyUseGrid(); bool useGrid(){ return m_useGrid;} @@ -227,6 +228,7 @@ private: bool m_useMagnet; bool m_dialogChanged; bool m_useDarkTheme; + QSettings* m_settings; }; } // namespace LimeReport diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 86f5863..416c6c8 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -472,7 +472,7 @@ void ReportDesignWindow::createMainMenu() void ReportDesignWindow::initReportEditor(ReportEnginePrivateInterface* report) { - m_reportDesignWidget=new ReportDesignWidget(report,this,this); + m_reportDesignWidget=new ReportDesignWidget(report, m_settings, this,this); setCentralWidget(m_reportDesignWidget); connect(m_reportDesignWidget,SIGNAL(itemSelected(LimeReport::BaseDesignIntf*)), this,SLOT(slotItemSelected(LimeReport::BaseDesignIntf*))); @@ -822,7 +822,7 @@ void ReportDesignWindow::restoreSetting() } settings()->endGroup(); - m_reportDesignWidget->loadState(settings()); + m_reportDesignWidget->loadState(); m_useGridAction->setChecked(m_reportDesignWidget->useGrid()); createRecentFilesMenu(); } diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index ab09828..dde790f 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -82,7 +82,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage), m_previewLayoutDirection(Qt::LayoutDirectionAuto), m_designerFactory(0), - m_previewScaleType(FitWidth), m_previewScalePercent(0) + m_previewScaleType(FitWidth), m_previewScalePercent(0), m_startTOCPage(0) { #ifdef HAVE_STATIC_BUILD initResources(); @@ -252,7 +252,6 @@ void ReportEnginePrivate::clearReport() m_fileName=""; m_scriptEngineContext->clear(); m_reportSettings.setDefaultValues(); - emit cleared(); } @@ -404,7 +403,11 @@ bool ReportEnginePrivate::printReport(QPrinter* printer) m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); #endif #ifdef HAVE_QT5 +#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) m_printer.data()->setPrinterName(pi.defaultPrinterName()); +#else + m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); +#endif #endif QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); m_printerSelected = dialog.exec()!=QDialog::Rejected; @@ -437,7 +440,11 @@ bool ReportEnginePrivate::printPages(ReportPages pages, QPrinter *printer) m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); #endif #ifdef HAVE_QT5 +#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) m_printer.data()->setPrinterName(pi.defaultPrinterName()); +#else + m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); +#endif #endif QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); m_printerSelected = dialog.exec()!=QDialog::Rejected; @@ -1140,6 +1147,9 @@ void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPai ReportPages ReportEnginePrivate::renderToPages() { + int startTOCPage = -1; + int pageAfterTOCIndex = -1; + if (m_reportRendering) return ReportPages(); initReport(); m_reportRender = ReportRender::Ptr(new ReportRender); @@ -1176,10 +1186,15 @@ ReportPages ReportEnginePrivate::renderToPages() activateLanguage(m_reportLanguage); emit renderStarted(); - foreach(PageItemDesignIntf* page , m_renderingPages){ + for(int i = 0; i < m_renderingPages.count(); ++i){ + PageItemDesignIntf* page = m_renderingPages.at(i); if (!page->isTOC() && page->isPrintable()){ page->setReportSettings(&m_reportSettings); result.append(m_reportRender->renderPageToPages(page)); + } else { + startTOCPage = result.count(); + pageAfterTOCIndex = i+1; + m_reportRender->createTOCMarker(page->resetPageNumber()); } } @@ -1187,16 +1202,17 @@ ReportPages ReportEnginePrivate::renderToPages() PageItemDesignIntf* page = m_renderingPages.at(i); if (page->isTOC()){ page->setReportSettings(&m_reportSettings); - if (i==0){ + if (i < m_renderingPages.count()){ PageItemDesignIntf* secondPage = 0; - if (m_pages.count()>1) secondPage = m_renderingPages.at(1); + if ( m_renderingPages.count() > (pageAfterTOCIndex)) + secondPage = m_renderingPages.at(pageAfterTOCIndex); ReportPages pages = m_reportRender->renderTOC( page, true, secondPage && secondPage->resetPageNumber() ); for (int j=0; j exporters; ScaleType m_previewScaleType; int m_previewScalePercent; + int m_startTOCPage; }; } diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index a2d1c7f..6f01c71 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -148,7 +148,7 @@ void ReportRender::renameChildItems(BaseDesignIntf *item){ ReportRender::ReportRender(QObject *parent) :QObject(parent), m_renderPageItem(0), m_pageCount(0), - m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false), m_renderingFirstTOC(false) + m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false) { initColumns(); } @@ -192,18 +192,13 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool { m_currentNameIndex = 0; m_patternPageItem = patternPage; - m_renderingFirstTOC = isTOC && isFirst; if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) { resetPageNumber(PageReset); } - if (m_renderingFirstTOC && resetPageNumbers){ - PagesRange range; - range.firstPage = 0; - range.lastPage = 0; - m_ranges.insert(0,range); - m_pageCount = 0; + if (m_patternPageItem->resetPageNumber() && !isTOC && m_pageCount == 0){ + m_pagesRanges.startNewRange(); } m_renderCanceled = false; @@ -248,11 +243,6 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool savePage(true); - if (m_renderingFirstTOC && resetPageNumbers && m_ranges.count()>1){ - m_ranges[1].firstPage = m_ranges.at(0).lastPage+1; - m_ranges[1].lastPage += m_ranges.at(0).lastPage+1; - } - #ifndef USE_QJSENGINE ScriptEngineManager::instance().scriptEngine()->popContext(); #endif @@ -1138,21 +1128,26 @@ void ReportRender::secondRenderPass(ReportPages renderedPages) for(int i=0; ichildBaseItems()){ - updateTOC(item, findPageNumber(i)); + updateTOC(item, m_pagesRanges.findPageNumber(i)); } } } for(int i=0; isetReportVariable("#PAGE",findPageNumber(i)); - m_datasources->setReportVariable("#PAGE_COUNT",findLastPageNumber(i)); + m_datasources->setReportVariable("#PAGE",m_pagesRanges.findPageNumber(i)); + m_datasources->setReportVariable("#PAGE_COUNT",m_pagesRanges.findLastPageNumber(i)); foreach(BaseDesignIntf* item, page->childBaseItems()){ item->updateItemSize(m_datasources, SecondPass); } } } +void ReportRender::createTOCMarker(bool startNewRange) +{ + m_pagesRanges.addTOCMarker(startNewRange); +} + BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, int height, BandDesignIntf* patternBand) { int sliceHeight = height; @@ -1256,37 +1251,11 @@ void ReportRender::startNewPage(bool isFirst) void ReportRender::resetPageNumber(ResetPageNuberType resetType) { - PagesRange range; - if (!m_ranges.isEmpty()){ - currentRange().lastPage = (resetType == BandReset)? m_pageCount : m_pageCount-1; - range.firstPage = m_pageCount+((resetType == BandReset)? 1 : 0); - } else { - range.firstPage = m_pageCount; - } - range.lastPage = (resetType == BandReset)? 0 : m_pageCount; - m_ranges.append(range); + m_pagesRanges.startNewRange(); if (resetType == PageReset) m_datasources->setReportVariable("#PAGE",1); } -int ReportRender::findLastPageNumber(int currentPage) -{ - foreach (PagesRange range, m_ranges) { - if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) ) - return (range.lastPage-(range.firstPage))+1; - } - return 0; -} - -int ReportRender::findPageNumber(int currentPage) -{ - foreach (PagesRange range, m_ranges) { - if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) ) - return (currentPage - range.firstPage)+1; - } - return 0; -} - void ReportRender::cutGroups() { m_popupedExpression.clear(); @@ -1406,6 +1375,10 @@ void ReportRender::moveTearOffBand(){ void ReportRender::savePage(bool isLast) { + if (m_renderPageItem->isTOC()) + m_pagesRanges.addTOCPage(); + else + m_pagesRanges.addPage(); m_datasources->setReportVariable("#IS_LAST_PAGEFOOTER",isLast); m_datasources->setReportVariable("#IS_FIRST_PAGEFOOTER",m_datasources->variable("#PAGE").toInt()==1); @@ -1427,14 +1400,12 @@ void ReportRender::savePage(bool isLast) } } - if (currentRange(m_renderingFirstTOC).lastPage==0 && m_ranges.count()>1) { + if (m_pagesRanges.currentRange(m_patternPageItem->isTOC()).firstPage == 0) { m_datasources->setReportVariable("#PAGE",1); } else { m_datasources->setReportVariable("#PAGE",m_datasources->variable("#PAGE").toInt()+1); } - currentRange(m_renderingFirstTOC).lastPage = m_pageCount; - BandDesignIntf* pageFooter = m_renderPageItem->bandByType(BandDesignIntf::PageFooter); if (pageFooter) pageFooter->setBandIndex(++m_currentIndex); m_renderedPages.append(PageItemDesignIntf::Ptr(m_renderPageItem)); @@ -1478,4 +1449,96 @@ void ReportRender::cancelRender(){ m_renderCanceled = true; } +int PagesRanges::findLastPageNumber(int index) +{ + index++; + foreach (PagesRange range, m_ranges) { + if ( range.firstPage <= (index) && range.lastPage>= (index) ) + return (range.lastPage-(range.firstPage))+1; + } + return 0; +} + +int PagesRanges::findPageNumber(int index) +{ + index++; + foreach (PagesRange range, m_ranges) { + if ( range.firstPage <= (index) && range.lastPage >= (index) ) + return (index - range.firstPage)+1; + } + return 0; +} + +PagesRange&PagesRanges::currentRange(bool isTOC) +{ + Q_ASSERT( (isTOC && m_TOCRangeIndex!=-1) || !isTOC); + if (isTOC && m_TOCRangeIndex !=-1) return m_ranges[m_TOCRangeIndex]; + return m_ranges.last(); +} + +void PagesRanges::startNewRange(bool isTOC) +{ + PagesRange range; + if (!m_ranges.isEmpty()){ + range.firstPage = 0; + range.lastPage = m_ranges.last().lastPage + 1; + } else { + range.firstPage = 0; + range.lastPage = 0; + } + range.isTOC = isTOC; + m_ranges.append(range); + if (isTOC) m_TOCRangeIndex = m_ranges.size()-1; +} + +void PagesRanges::addTOCMarker(bool addNewRange) +{ + if ( addNewRange || m_ranges.isEmpty()){ + startNewRange(true); + } else { + m_TOCRangeIndex = m_ranges.size()-1; + m_ranges.last().isTOC = true; + } +} + +void PagesRanges::addPage() +{ + if (m_ranges.isEmpty()) startNewRange(); + if (m_ranges.last().firstPage == 0){ + m_ranges.last().firstPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage; + m_ranges.last().lastPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage; + } else { + m_ranges.last().lastPage++; + } +} + +void PagesRanges::shiftRangesNextToTOC(){ + for(int i = m_TOCRangeIndex+1; i < m_ranges.size(); ++i){ + m_ranges[i].firstPage++; + m_ranges[i].lastPage++; + } +} + +void PagesRanges::addTOCPage() +{ + Q_ASSERT(m_TOCRangeIndex != -1); + if (m_TOCRangeIndex != -1){ + PagesRange& tocRange = m_ranges[m_TOCRangeIndex]; + if (tocRange.firstPage == 0) { + tocRange.firstPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; + tocRange.lastPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; + if (tocRange.lastPage == 1 && tocRange.lastPage == 1) + shiftRangesNextToTOC(); + } else { + tocRange.lastPage++; + shiftRangesNextToTOC(); + } + } +} + +void PagesRanges::clear() +{ + m_ranges.clear(); +} + } // namespace LimeReport diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 6c14bda..8cbbc0f 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -61,6 +61,25 @@ private: struct PagesRange{ int firstPage; int lastPage; + bool isTOC; +}; + +class PagesRanges{ +public: + PagesRanges(): m_TOCRangeIndex(-1) {} + int findLastPageNumber(int index); + int findPageNumber(int index); + PagesRange& currentRange(bool isTOC); + void startNewRange(bool isTOC = false); + void addTOCMarker(bool addNewRange); + void addPage(); + void addTOCPage(); + void clear(); +private: + void shiftRangesNextToTOC(); +private: + QVector m_ranges; + int m_TOCRangeIndex; }; class ReportRender: public QObject @@ -84,6 +103,7 @@ public: ReportPages renderPageToPages(PageItemDesignIntf *patternPage); ReportPages renderTOC(PageItemDesignIntf *patternPage, bool first, bool resetPages); void secondRenderPass(ReportPages renderedPages); + void createTOCMarker(bool startNewRange); signals: void pageRendered(int renderedPageCount); public slots: @@ -147,8 +167,8 @@ private: void startNewColumn(); void startNewPage(bool isFirst = false); void resetPageNumber(ResetPageNuberType resetType); - int findLastPageNumber(int currentPage); - int findPageNumber(int currentPage); + //int findLastPageNumber(int currentPage); + //int findPageNumber(int currentPage); void savePage(bool isLast = false); QString toString(); void initColumns(); @@ -161,7 +181,7 @@ private: void renameChildItems(BaseDesignIntf *item); void renderGroupFooterByHeader(BandDesignIntf *groupHeader); void updateTOC(BaseDesignIntf* item, int pageNumber); - PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();} + //PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();} void placeBandOnPage(BandDesignIntf *band, int columnIndex); private: DataSourceManager* m_datasources; @@ -190,11 +210,10 @@ private: QVector m_maxHeightByColumn; QVector m_currentStartDataPos; int m_currentColumn; - QList m_ranges; + PagesRanges m_pagesRanges; QVector m_columnedBandItems; unsigned long long m_currentNameIndex; bool m_newPageStarted; - bool m_renderingFirstTOC; }; } // namespace LimeReport diff --git a/limereport/lrsettingdialog.cpp b/limereport/lrsettingdialog.cpp index 9040fb0..b7ad816 100644 --- a/limereport/lrsettingdialog.cpp +++ b/limereport/lrsettingdialog.cpp @@ -1,11 +1,12 @@ #include "lrsettingdialog.h" #include "ui_lrsettingdialog.h" +#include "lrglobal.h" #include namespace LimeReport{ SettingDialog::SettingDialog(QWidget *parent) : - QDialog(parent), + QDialog(parent), m_settings(0), ui(new Ui::SettingDialog) { ui->setupUi(this); @@ -13,6 +14,7 @@ SettingDialog::SettingDialog(QWidget *parent) : if (!theme.exists()){ ui->cbbUseDarkTheme->setVisible(false); } + ui->indentSize->setRange(0,10); } SettingDialog::~SettingDialog() @@ -37,6 +39,18 @@ QFont SettingDialog::defaultFont() return result; } +QFont SettingDialog::scriptFont() +{ + QFont result = ui->scriptFont->currentFont(); + result.setPointSize(ui->scriptFontSize->value()); + return result; +} + +int SettingDialog::tabIndention() +{ + return ui->indentSize->value(); +} + bool SettingDialog::userDarkTheme() { return ui->cbbUseDarkTheme->isChecked(); @@ -76,6 +90,17 @@ void SettingDialog::setDefaultFont(const QFont &value) ui->defaultFontSize->setValue(value.pointSize()); } +void SettingDialog::setScriptFont(const QFont& value) +{ + ui->scriptFont->setCurrentFont(value); + ui->scriptFontSize->setValue(value.pointSize()); +} + +void SettingDialog::setScritpTabIndention(int size) +{ + ui->indentSize->setValue(size); +} + void SettingDialog::setUseDarkTheme(bool value) { ui->cbbUseDarkTheme->setChecked(value); @@ -103,4 +128,37 @@ void SettingDialog::setDesignerLanguages(QList languages, QLo #endif } +void SettingDialog::setSettings(QSettings* settings){ + m_settings = settings; + if (m_settings){ + m_settings->beginGroup("ScriptEditor"); + QVariant fontName = m_settings->value("DefaultFontName"); + if (fontName.isValid()){ + QVariant fontSize = m_settings->value("DefaultFontSize"); + ui->scriptFont->setCurrentFont(QFont(fontName.toString(),fontSize.toInt())); + ui->scriptFontSize->setValue(fontSize.toInt()); + } + QVariant indentSize = m_settings->value("TabIndention"); + if (indentSize.isValid()){ + ui->indentSize->setValue(indentSize.toInt()); + } else { + ui->indentSize->setValue(LimeReport::Const::DEFAULT_TAB_INDENTION); + } + m_settings->endGroup(); + } +} + +void SettingDialog::on_bbOkCancel_accepted() +{ + if (m_settings){ + m_settings->beginGroup("ScriptEditor"); + m_settings->setValue("DefaultFontName", ui->scriptFont->currentFont().family()); + m_settings->setValue("DefaultFontSize", ui->scriptFontSize->value()); + m_settings->setValue("TabIndention", ui->indentSize->value()); + m_settings->endGroup(); + } +} + } // namespace LimeReport + + diff --git a/limereport/lrsettingdialog.h b/limereport/lrsettingdialog.h index d4c89e3..bc4e862 100644 --- a/limereport/lrsettingdialog.h +++ b/limereport/lrsettingdialog.h @@ -3,6 +3,7 @@ #include #include +#include namespace LimeReport{ @@ -20,6 +21,8 @@ public: int verticalGridStep(); int horizontalGridStep(); QFont defaultFont(); + QFont scriptFont(); + int tabIndention(); bool userDarkTheme(); bool suppressAbsentFieldsAndVarsWarnings(); QLocale::Language designerLanguage(); @@ -27,12 +30,19 @@ public: void setHorizontalGridStep(int value); void setVerticalGridStep(int value); void setDefaultFont(const QFont& value); + void setScriptFont(const QFont& value); + void setScritpTabIndention(int size); void setUseDarkTheme(bool value); void setDesignerLanguages(QList languages, QLocale::Language currentLanguage); + void setSettings(QSettings* settings); +private slots: + void on_bbOkCancel_accepted(); + private: Ui::SettingDialog *ui; QList m_aviableLanguages; QLocale::Language m_currentLanguage; + QSettings* m_settings; }; } // namespace LimeReport diff --git a/limereport/lrsettingdialog.ui b/limereport/lrsettingdialog.ui index 19d27fe..12af083 100644 --- a/limereport/lrsettingdialog.ui +++ b/limereport/lrsettingdialog.ui @@ -6,8 +6,8 @@ 0 0 - 397 - 345 + 419 + 362 @@ -19,164 +19,260 @@ Designer setting - - - QLayout::SetDefaultConstraint - + - - - Designer Setting + + + 0 - - - - - - - Default font - - - - - - - - - - 10 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Grid - - + + + + 0 + 0 + 401 + 218 + + + + Designer settings + + + + - - - - - Vertical grid step - - - - - - - 10 - - - - - - - Horizontal grid step - - - - - - - 10 - - - - + + + Default font + + - + + + + + + 10 + + + + + Qt::Horizontal - 73 + 40 20 - - - - - - - - Language - - - - - - - - 0 - 0 - - - - - - - - - - Use dark theme - - - - + + + + + Grid + + + + + + + + Vertical grid step + + + + + + + 10 + + + + + + + Horizontal grid step + + + + + + + 10 + + + + + + + + + Qt::Horizontal + + + + 73 + 20 + + + + + + + + + + + + + Language + + + + + + + + 0 + 0 + + + + + + + + + + Use dark theme + + + + + + + + + 0 + 0 + 401 + 218 + + + + Script editor settings + + + + + + + + Font + + + + + + + + + + 10 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Indent size + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 123 + + + + + + + + + + 0 + 0 + 401 + 218 + + + + Report settings + + + + + 10 + 10 + 280 + 23 + + + + Suppress absent fields and variables warning + + + - - - - Report Setting - - - - - - Suppress absent fields and variables warning - - - - - - - - - - Qt::Vertical - - - - 20 - 4 - - - - diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index b39c4d0..2addb1e 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -154,6 +154,7 @@ void QObjectPropertyModel::translatePropertyName() tr("replaceCRwithBR"); tr("hideIfEmpty"); tr("hideEmptyItems"); + tr("useExternalPainter"); } void QObjectPropertyModel::clearObjectsList() diff --git a/limereport/objectinspector/propertyItems/lrcontentpropitem.cpp b/limereport/objectinspector/propertyItems/lrcontentpropitem.cpp index 53c9806..cc50ced 100644 --- a/limereport/objectinspector/propertyItems/lrcontentpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrcontentpropitem.cpp @@ -26,7 +26,6 @@ void ContentEditor::editButtonClicked() dialog->setLayout(new QVBoxLayout()); dialog->layout()->setContentsMargins(1,1,1,1); dialog->setAttribute(Qt::WA_DeleteOnClose); - //dialog->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, dialog->size(), QApplication::desktop()->availableGeometry())); dialog->setWindowTitle(propertyName()); QWidget* editor = dynamic_cast(m_object)->defaultEditor(); dialog->layout()->addWidget(editor); diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index f40068a..c73a225 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -14,12 +14,13 @@ namespace LimeReport{ ScriptEditor::ScriptEditor(QWidget *parent) : QWidget(parent), - ui(new Ui::ScriptEditor), m_reportEngine(0), m_page(0) + ui(new Ui::ScriptEditor), m_reportEngine(0), m_page(0), m_tabIndention(4) { ui->setupUi(this); setFocusProxy(ui->textEdit); m_completer = new ReportStructureCompleater(this); ui->textEdit->setCompleter(m_completer); + ui->textEdit->setTabStopWidth(ui->textEdit->fontMetrics().width("0")*m_tabIndention); connect(ui->splitter, SIGNAL(splitterMoved(int,int)), this, SIGNAL(splitterMoved(int,int))); } @@ -79,58 +80,16 @@ void ScriptEditor::setPageBand(BandDesignIntf* band) } } +void ScriptEditor::setTabIndention(int charCount) +{ + if (m_tabIndention != charCount){ + ui->textEdit->setTabStopWidth(ui->textEdit->fontMetrics().width("W")*charCount); + m_tabIndention = charCount; + } +} + void ScriptEditor::initCompleter() { -// QStringList dataWords; - -// DataSourceManager* dm = 0; -// if (m_reportEngine) -// dm = m_reportEngine->dataManager(); -// if (m_page) -// dm = m_page->datasourceManager(); - -//#ifdef USE_QJSENGINE -// ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); -// QJSValue globalObject = se.scriptEngine()->globalObject(); -// QJSValueIterator it(globalObject); -// while (it.hasNext()){ -// it.next(); -// if (it.value().isCallable() ){ -// dataWords << it.name(); -// } -// } -//#endif -// foreach(const QString &dsName,dm->dataSourceNames()){ -// dataWords << dsName; -// foreach(const QString &field, dm->fieldNames(dsName)){ -// dataWords<variableNames()) { -// dataWords << varName.remove("#"); -// } - -// if (m_reportEngine){ -// for ( int i = 0; i < m_reportEngine->pageCount(); ++i){ -// PageDesignIntf* page = m_reportEngine->pageAt(i); -// dataWords << page->pageItem()->objectName(); -// QMetaObject const * mo = page->pageItem()->metaObject(); -// for(int i = mo->methodOffset(); i < mo->methodCount(); ++i) -// { -// if (mo->method(i).methodType() == QMetaMethod::Signal) { -// dataWords << page->pageItem()->objectName() +"."+QString::fromLatin1(mo->method(i).name()); -// } -// } -// dataWords << page->pageItem()->objectName()+".beforeRender"; -// dataWords << page->pageItem()->objectName()+".afterRender"; -// foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ -// addItemToCompleater(page->pageItem()->objectName(), item, dataWords); -// } -// } -// } - -// dataWords.sort(); if (m_reportEngine) m_completer->updateCompleaterModel(m_reportEngine); else @@ -167,26 +126,26 @@ QString ScriptEditor::toPlainText() return ui->textEdit->toPlainText(); } -void ScriptEditor::addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords) -{ - BandDesignIntf* band = dynamic_cast(item); - if (band){ - dataWords << band->objectName(); - dataWords << pageName+"_"+band->objectName(); - dataWords << pageName+"_"+band->objectName()+".beforeRender"; - dataWords << pageName+"_"+item->objectName()+".afterData"; - dataWords << pageName+"_"+band->objectName()+".afterRender"; - foreach (BaseDesignIntf* child, band->childBaseItems()){ - addItemToCompleater(pageName, child, dataWords); - } - } else { - dataWords << item->objectName(); - dataWords << pageName+"_"+item->objectName(); - dataWords << pageName+"_"+item->objectName()+".beforeRender"; - dataWords << pageName+"_"+item->objectName()+".afterData"; - dataWords << pageName+"_"+item->objectName()+".afterRender"; - } -} +//void ScriptEditor::addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords) +//{ +// BandDesignIntf* band = dynamic_cast(item); +// if (band){ +// dataWords << band->objectName(); +// dataWords << pageName+"_"+band->objectName(); +// dataWords << pageName+"_"+band->objectName()+".beforeRender"; +// dataWords << pageName+"_"+item->objectName()+".afterData"; +// dataWords << pageName+"_"+band->objectName()+".afterRender"; +// foreach (BaseDesignIntf* child, band->childBaseItems()){ +// addItemToCompleater(pageName, child, dataWords); +// } +// } else { +// dataWords << item->objectName(); +// dataWords << pageName+"_"+item->objectName(); +// dataWords << pageName+"_"+item->objectName()+".beforeRender"; +// dataWords << pageName+"_"+item->objectName()+".afterData"; +// dataWords << pageName+"_"+item->objectName()+".afterRender"; +// } +//} void ScriptEditor::on_twData_doubleClicked(const QModelIndex &index) { diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index e9e0aa6..8233d8e 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -52,6 +52,7 @@ public: void setReportEngine(LimeReport::ReportEnginePrivateInterface* reportEngine); void setReportPage(PageDesignIntf* page); void setPageBand(BandDesignIntf* band); + void setTabIndention(int charCount); void initCompleter(); QByteArray saveState(); void restoreState(QByteArray state); @@ -68,13 +69,14 @@ private slots: void on_twData_doubleClicked(const QModelIndex &index); void on_twScriptEngine_doubleClicked(const QModelIndex &index); void slotOnCurrentChanged(const QModelIndex& to, const QModelIndex&); -private: - void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); +//private: +// void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); private: Ui::ScriptEditor *ui; ReportEnginePrivateInterface* m_reportEngine; PageDesignIntf* m_page; ReportStructureCompleater* m_completer; + int m_tabIndention; }; } // namespace LimeReport diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index 0b912bd..aa82093 100644 Binary files a/translations/limereport_ru.qm and b/translations/limereport_ru.qm differ diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index cca8845..9d72224 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -384,6 +384,14 @@ p, li { white-space: pre-wrap; } Print if empty Печатать, если пустое + + Cut + Вырезать + + + Copy + Копировать + LimeReport::BaseDesignIntf @@ -1086,6 +1094,10 @@ p, li { white-space: pre-wrap; } LimeReport::ImageItem + + Ext. + Внешний + Image Изображение @@ -1864,6 +1876,10 @@ p, li { white-space: pre-wrap; } hideEmptyItems Скрывать пустые элементы + + useExternalPainter + Использовать внешний отрисовщик + LimeReport::RectMMPropItem