diff --git a/limereport/dialogdesigner/dialogdesigner.qrc b/limereport/dialogdesigner/dialogdesigner.qrc index 67c62fb..3911131 100644 --- a/limereport/dialogdesigner/dialogdesigner.qrc +++ b/limereport/dialogdesigner/dialogdesigner.qrc @@ -6,4 +6,7 @@ images/tabordertool.png images/widgettool.png + + templates/Dialog.ui + diff --git a/limereport/dialogdesigner/lrdialogdesigner.cpp b/limereport/dialogdesigner/lrdialogdesigner.cpp index 643cf50..e71fb78 100644 --- a/limereport/dialogdesigner/lrdialogdesigner.cpp +++ b/limereport/dialogdesigner/lrdialogdesigner.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "pluginmanager_p.h" //#include @@ -25,14 +26,14 @@ namespace LimeReport{ -DialogDesigner::DialogDesigner(QObject *parent) : QObject(parent) +DialogDesignerManager::DialogDesignerManager(QObject *parent) : QObject(parent) { QDesignerComponents::initializeResources(); m_formEditor = QDesignerComponents::createFormEditor(this); QDesignerComponents::initializePlugins(m_formEditor); QDesignerComponents::createTaskMenu(m_formEditor, this); - m_editWidgetsAction = new QAction(tr("Edit Widgets")); + m_editWidgetsAction = new QAction(tr("Edit Widgets"), this); m_editWidgetsAction->setIcon(QIcon(":/images/images/widgettool.png")); m_editWidgetsAction->setEnabled(false); connect(m_editWidgetsAction, SIGNAL(triggered()), this, SLOT(slotEditWidgets())); @@ -102,7 +103,7 @@ DialogDesigner::DialogDesigner(QObject *parent) : QObject(parent) } -DialogDesigner::~DialogDesigner() +DialogDesignerManager::~DialogDesignerManager() { for (int i = 0; isetIconSize(QSize(16,16)); + m_formEditor->formWindowManager()->actionCopy()->setIcon(QIcon(":/report/images/copy")); tb->addAction(m_formEditor->formWindowManager()->actionCopy()); + m_formEditor->formWindowManager()->actionPaste()->setIcon(QIcon(":/report/images/paste")); tb->addAction(m_formEditor->formWindowManager()->actionPaste()); + m_formEditor->formWindowManager()->actionCut()->setIcon(QIcon(":/report/images/cut")); tb->addAction(m_formEditor->formWindowManager()->actionCut()); + m_formEditor->formWindowManager()->actionUndo()->setIcon(QIcon(":/report/images/undo")); tb->addAction(m_formEditor->formWindowManager()->actionUndo()); + m_formEditor->formWindowManager()->actionRedo()->setIcon(QIcon(":/report/images/redo")); tb->addAction(m_formEditor->formWindowManager()->actionRedo()); tb->addActions(m_modes->actions()); @@ -135,7 +141,7 @@ void DialogDesigner::initToolBar(QToolBar *tb) tb->addAction(m_formEditor->formWindowManager()->actionAdjustSize()); } -QWidget *DialogDesigner::createFormEditor(const QString &content) +QWidget *DialogDesignerManager::createFormEditor(const QString &content) { QDesignerFormWindowInterface* wnd = m_formEditor->formWindowManager()->createFormWindow(0, Qt::Window); wnd->setContents(content); @@ -143,25 +149,32 @@ QWidget *DialogDesigner::createFormEditor(const QString &content) m_formEditor->objectInspector()->setFormWindow(wnd); wnd->editWidgets(); - connect(wnd, SIGNAL(changed()), this, SIGNAL(dialogChanged())); + DialogDesigner* dialogDesigner = new DialogDesigner(wnd, m_formEditor); - SharedTools::WidgetHost *placeholder = new SharedTools::WidgetHost(0,wnd); - placeholder->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); - placeholder->setFocusProxy( wnd ); + connect(dialogDesigner, SIGNAL(dialogChanged()), this, SLOT(slotDialogChanged())); + connect(dialogDesigner, SIGNAL(dialogNameChanged(QString,QString)), this, SIGNAL(dialogNameChanged(QString,QString))); + connect(dialogDesigner, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*))); + + m_dialogDesigners.append(dialogDesigner); + + return dialogDesigner; - return placeholder; } -QByteArray DialogDesigner::getDialogDescription(QWidget *form) +QByteArray DialogDesignerManager::getDialogDescription(QWidget *form) { - SharedTools::WidgetHost* wh = dynamic_cast(form); - if (wh){ - return wh->formWindow()->contents().toUtf8(); + QByteArray result; + DialogDesigner* dialogDesigner = dynamic_cast(form); + Q_ASSERT(dialogDesigner != NULL); + //SharedTools::WidgetHost* wh = dynamic_cast(form); + if (dialogDesigner){ + result = dialogDesigner->dialogContent(); + //wh->formWindow()->setDirty(false); } - return QByteArray(); + return result; } -void DialogDesigner::setActiveEditor(QWidget *widget) +void DialogDesignerManager::setActiveEditor(QWidget *widget) { SharedTools::WidgetHost* wh = dynamic_cast(widget); if (wh){ @@ -169,52 +182,70 @@ void DialogDesigner::setActiveEditor(QWidget *widget) } } -QWidget* DialogDesigner::widgetBox() const +void DialogDesignerManager::setDirty(bool value) +{ + foreach(DialogDesigner* dialogDesigner, m_dialogDesigners){ + dialogDesigner->setChanged(value); + } +} + +QWidget* DialogDesignerManager::widgetBox() const { return m_widgetBox; } -QWidget* DialogDesigner::actionEditor() const +QWidget* DialogDesignerManager::actionEditor() const { return m_actionEditor; } -QWidget* DialogDesigner::propertyEditor() const +QWidget* DialogDesignerManager::propertyEditor() const { return m_propertyEditor; } -QWidget* DialogDesigner::objectInspector() const +QWidget* DialogDesignerManager::objectInspector() const { return m_objectInspector; } -QWidget *DialogDesigner::signalSlotEditor() const +QWidget *DialogDesignerManager::signalSlotEditor() const { return m_signalSlotEditor; } -QWidget *DialogDesigner::resourcesEditor() const +QWidget *DialogDesignerManager::resourcesEditor() const { return m_resourcesEditor; } -void DialogDesigner::slotObjectDestroyed(QObject *object) +void DialogDesignerManager::slotObjectDestroyed(QObject* object) { + + QList::Iterator it = m_dialogDesigners.begin(); + while(it!=m_dialogDesigners.end()){ + if (*it == object){ + it = m_dialogDesigners.erase(it); + return; + } else { + ++it; + } + } + for ( int i = 0; iformWindowManager()->formWindowCount(); ++i){ m_formEditor->formWindowManager()->formWindow(i)->editWidgets(); } } -void DialogDesigner::slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow) +void DialogDesignerManager::slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow) { if (formWindow){ m_editWidgetsAction->setEnabled(true); @@ -222,7 +253,15 @@ void DialogDesigner::slotActiveFormWindowChanged(QDesignerFormWindowInterface *f } } -QString DialogDesigner::iconPathByName(const QString &name) +void DialogDesignerManager::slotDialogChanged() +{ + DialogDesigner* dialogDesigner = dynamic_cast(sender()); + if (dialogDesigner){ + emit dialogChanged(dialogDesigner->dialogName()); + } +} + +QString DialogDesignerManager::iconPathByName(const QString &name) { if (name.compare("__qt_edit_signals_slots_action") == 0) return ":/images/images/signalslottool.png"; @@ -233,4 +272,74 @@ QString DialogDesigner::iconPathByName(const QString &name) return ""; } +DialogDesigner::DialogDesigner(QDesignerFormWindowInterface* wnd, QDesignerFormEditorInterface* formEditor, QWidget *parent, Qt::WindowFlags flags) + :QWidget(parent, flags), m_formEditor(formEditor) +{ + m_dialogName = wnd->mainContainer()->objectName(); + connect(wnd, SIGNAL(changed()), this, SIGNAL(dialogChanged())); + connect(wnd->mainContainer(), SIGNAL(objectNameChanged(QString)), this, SLOT(slotMainContainerNameChanged(QString))); + + m_designerHolder = new SharedTools::WidgetHost(this,wnd); + m_designerHolder->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); + m_designerHolder->setFocusProxy( wnd ); + + QVBoxLayout* l = new QVBoxLayout(this); + l->addWidget(m_designerHolder); + setLayout(l); + +} + +DialogDesigner::~DialogDesigner(){} + +QString DialogDesigner::dialogName() const +{ + return m_dialogName; +} + +void DialogDesigner::setDialogName(const QString &dialogName) +{ + m_dialogName = dialogName; +} + +bool DialogDesigner::isChanged() +{ + return m_designerHolder->formWindow()->isDirty(); +} + +void DialogDesigner::setChanged(bool value) +{ + m_designerHolder->formWindow()->setDirty(false); +} + +QByteArray DialogDesigner::dialogContent() +{ + if (m_designerHolder && m_designerHolder->formWindow()) + return m_designerHolder->formWindow()->contents().toUtf8(); + return QByteArray(); +} + +void DialogDesigner::undo() +{ + Q_ASSERT(m_formEditor != NULL); + if (m_formEditor){ + m_formEditor->formWindowManager()->actionUndo()->trigger(); + } +} + +void DialogDesigner::redo() +{ + Q_ASSERT(m_formEditor != NULL); + if (m_formEditor){ + m_formEditor->formWindowManager()->actionRedo()->trigger(); + } +} + +void DialogDesigner::slotMainContainerNameChanged(QString newName) +{ + if (m_dialogName.compare(newName) != 0){ + emit dialogNameChanged(m_dialogName, newName); + m_dialogName = newName; + } +} + } diff --git a/limereport/dialogdesigner/lrdialogdesigner.h b/limereport/dialogdesigner/lrdialogdesigner.h index bebc4dd..8a0bfbe 100644 --- a/limereport/dialogdesigner/lrdialogdesigner.h +++ b/limereport/dialogdesigner/lrdialogdesigner.h @@ -14,18 +14,48 @@ class QDesignerPropertyEditorInterface; class QDesignerObjectInspectorInterface; class QDesignerFormWindowManagerInterface; +namespace SharedTools{ + class WidgetHost; +} + namespace LimeReport{ -class DialogDesigner : public QObject +class DialogDesigner : public QWidget{ + Q_OBJECT +public: + DialogDesigner(QDesignerFormWindowInterface *wnd, QDesignerFormEditorInterface* formEditor, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags()); + ~DialogDesigner(); + QString dialogName() const; + void setDialogName(const QString &dialogName); + bool isChanged(); + void setChanged(bool value); + QByteArray dialogContent(); +public slots: + void undo(); + void redo(); +signals: + void dialogChanged(); + void dialogNameChanged(QString oldName, QString newName); + +private slots: + void slotMainContainerNameChanged(QString newName); +private: + QString m_dialogName; + SharedTools::WidgetHost* m_designerHolder; + QDesignerFormEditorInterface* m_formEditor; +}; + +class DialogDesignerManager : public QObject { Q_OBJECT public: - explicit DialogDesigner(QObject *parent = 0); - ~DialogDesigner(); + explicit DialogDesignerManager(QObject *parent = 0); + ~DialogDesignerManager(); void initToolBar(QToolBar* tb); QWidget* createFormEditor(const QString& content); QByteArray getDialogDescription(QWidget* form); - void setActiveEditor(QWidget* widget); + void setActiveEditor(QWidget* widget); + void setDirty(bool value); QWidget* widgetBox() const; QWidget* actionEditor() const; QWidget* propertyEditor() const; @@ -33,11 +63,13 @@ public: QWidget* signalSlotEditor() const; QWidget* resourcesEditor() const; signals: - void dialogChanged(); + void dialogChanged(QString dialogName); + void dialogNameChanged(QString oldName, QString newName); private slots: void slotObjectDestroyed(QObject* object); void slotEditWidgets(); void slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow); + void slotDialogChanged(); private: QString iconPathByName(const QString& name); private: @@ -53,6 +85,7 @@ private: QAction* m_editWidgetsAction; QActionGroup* m_modes; QString m_activeWindowName; + QList m_dialogDesigners; }; } // namespace LimeReport diff --git a/limereport/dialogdesigner/templates/Dialog.ui b/limereport/dialogdesigner/templates/Dialog.ui new file mode 100644 index 0000000..6eb9e5f --- /dev/null +++ b/limereport/dialogdesigner/templates/Dialog.ui @@ -0,0 +1,18 @@ + + $ClassName$ + + + + 0 + 0 + 400 + 300 + + + + $ClassName$ + + + + + diff --git a/limereport/images/addDialog.png b/limereport/images/addDialog.png new file mode 100644 index 0000000..6023700 Binary files /dev/null and b/limereport/images/addDialog.png differ diff --git a/limereport/images/deleteDialog.png b/limereport/images/deleteDialog.png new file mode 100644 index 0000000..5391490 Binary files /dev/null and b/limereport/images/deleteDialog.png differ diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 97621ab..ec1332c 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -50,9 +50,9 @@ namespace LimeReport { ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow *mainWindow, QWidget *parent) : QWidget(parent), #ifdef HAVE_QTDESIGNER_INTEGRATION - m_dialogDesigner(new DialogDesigner(this)), + m_dialogDesignerManager(new DialogDesignerManager(this)), #endif - m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false) + m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), m_dialogChanged(false) { m_tabWidget = new QTabWidget(this); m_tabWidget->setTabPosition(QTabWidget::South); @@ -75,6 +75,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow connect(m_report,SIGNAL(pagesLoadFinished()),this,SLOT(slotPagesLoadFinished())); connect(m_report,SIGNAL(cleared()),this,SIGNAL(cleared())); connect(m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slotCurrentTabChanged(int))); + connect(m_report->scriptContext(), SIGNAL(dialogDeleted(QString)), this, SLOT(slotDialogDeleted(QString))); m_scriptEditor->setPlainText(report->scriptContext()->initScript()); m_zoomer = new GraphicsViewZoomer(activeView()); @@ -84,35 +85,49 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow #endif #ifdef HAVE_QTDESIGNER_INTEGRATION - connect(m_dialogDesigner, SIGNAL(dialogChanged()), this, SLOT(slotDialogChanged())); + connect(m_dialogDesignerManager, SIGNAL(dialogChanged(QString)), + this, SLOT(slotDialogChanged(QString))); + connect(m_dialogDesignerManager, SIGNAL(dialogNameChanged(QString,QString)), + this, SLOT(slotDialogNameChanged(QString,QString))); #endif } -DialogDesigner *ReportDesignWidget::dialogDesigner() const +#ifdef HAVE_QTDESIGNER_INTEGRATION +DialogDesignerManager *ReportDesignWidget::dialogDesignerManager() const { - return m_dialogDesigner; + return m_dialogDesignerManager; } +QString ReportDesignWidget::activeDialogName() +{ + if (activeDialogPage()) + return activeDialogPage()->dialogName(); + return ""; +} + + QWidget *ReportDesignWidget::toolWindow(ReportDesignWidget::ToolWindowType windowType) { switch (windowType) { case WidgetBox: - return dialogDesigner()->widgetBox(); + return dialogDesignerManager()->widgetBox(); case PropertyEditor: - return dialogDesigner()->propertyEditor(); + return dialogDesignerManager()->propertyEditor(); case ObjectInspector: - return dialogDesigner()->objectInspector(); + return dialogDesignerManager()->objectInspector(); case ActionEditor: - return dialogDesigner()->actionEditor(); + return dialogDesignerManager()->actionEditor(); case ResourceEditor: - return dialogDesigner()->resourcesEditor(); + return dialogDesignerManager()->resourcesEditor(); case SignalSlotEditor: - return dialogDesigner()->signalSlotEditor(); + return dialogDesignerManager()->signalSlotEditor(); default: return 0; } } +#endif + ReportDesignWidget::EditorTabType ReportDesignWidget::activeTabType() { QString tabType = m_tabWidget->tabWhatsThis(m_tabWidget->currentIndex()); @@ -121,20 +136,24 @@ ReportDesignWidget::EditorTabType ReportDesignWidget::activeTabType() return Page; } +#ifdef HAVE_QTDESIGNER_INTEGRATION + void ReportDesignWidget::initDialogDesignerToolBar(QToolBar *toolBar) { - m_dialogDesigner->initToolBar(toolBar); + m_dialogDesignerManager->initToolBar(toolBar); } void ReportDesignWidget::updateDialogs() { for ( int i = 0; icount(); ++i ){ if (m_tabWidget->tabWhatsThis(i).compare("dialog") == 0){ - m_report->scriptContext()->changeDialog(m_tabWidget->tabText(i), m_dialogDesigner->getDialogDescription(m_tabWidget->widget(i))); + m_report->scriptContext()->changeDialog(m_tabWidget->tabText(i), m_dialogDesignerManager->getDialogDescription(m_tabWidget->widget(i))); } } } +#endif + bool ReportDesignWidget::useMagnet() const { return m_useMagnet; @@ -210,21 +229,38 @@ void ReportDesignWidget::createTabs(){ pageIndex = m_tabWidget->addTab(view,QIcon(),m_report->pageAt(i)->pageItem()->objectName()); m_tabWidget->setTabWhatsThis(pageIndex, "page"); } -#ifdef HAVE_QTDESIGNER_INTEGRATION - QWidget* dialogEditor; - foreach(DialogDescriber::Ptr dialogDesc, m_report->scriptContext()->dialogDescribers()){ - dialogEditor = m_dialogDesigner->createFormEditor(dialogDesc->description()); - pageIndex = m_tabWidget->addTab(dialogEditor,QIcon(),dialogDesc->name()); - m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); - } -#endif + m_scriptEditor = new QTextEdit(this); pageIndex = m_tabWidget->addTab(m_scriptEditor,QIcon(),tr("Script")); m_tabWidget->setTabWhatsThis(pageIndex,"script"); m_tabWidget->setCurrentIndex(0); +#ifdef HAVE_QTDESIGNER_INTEGRATION + QWidget* dialogDesigner; + foreach(DialogDescriber::Ptr dialogDesc, m_report->scriptContext()->dialogDescribers()){ + dialogDesigner = m_dialogDesignerManager->createFormEditor(dialogDesc->description()); + pageIndex = m_tabWidget->addTab(dialogDesigner,QIcon(),dialogDesc->name()); + m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); + + } +#endif + } +#ifdef HAVE_QTDESIGNER_INTEGRATION +void ReportDesignWidget::createNewDialogTab(const QString& dialogName, const QByteArray& description) +{ + QWidget* dialogDesigner = m_dialogDesignerManager->createFormEditor(description); + int pageIndex = m_tabWidget->addTab(dialogDesigner,QIcon(),dialogName); + m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); +} + +DialogDesigner*ReportDesignWidget::activeDialogPage() +{ + return dynamic_cast(m_tabWidget->currentWidget()); +} +#endif + ReportDesignWidget::~ReportDesignWidget() { delete m_zoomer; @@ -301,6 +337,8 @@ PageDesignIntf * ReportDesignWidget::activePage() return 0; } + + QList ReportDesignWidget::selectedItems(){ return activePage()->selectedItems(); } @@ -321,16 +359,26 @@ void ReportDesignWidget::slotItemSelected(BaseDesignIntf *item){ emit itemSelected(item); } -void ReportDesignWidget::saveToFile(const QString &fileName){ +bool ReportDesignWidget::saveToFile(const QString &fileName){ + bool result = false; m_report->scriptContext()->setInitScript(m_scriptEditor->toPlainText()); #ifdef HAVE_QTDESIGNER_INTEGRATION updateDialogs(); #endif if (m_report->saveToFile(fileName)) { - m_report->emitSaveFinished(); + m_report->emitSaveFinished(); + result = true; } + +#ifdef HAVE_QTDESIGNER_INTEGRATION + if (result){ + m_dialogChanged = false; + m_dialogDesignerManager->setDirty(false); + } +#endif + return result; } bool ReportDesignWidget::save() @@ -340,24 +388,32 @@ bool ReportDesignWidget::save() updateDialogs(); #endif + bool result = false; + if (!m_report->reportFileName().isEmpty()){ if (m_report->saveToFile()){ m_report->emitSaveFinished(); - return true; + result = true; } } else { m_report->emitSaveReport(); if (m_report->isSaved()) { m_report->emitSaveFinished(); - return true; + result = true; } - if (m_report->saveToFile(QFileDialog::getSaveFileName(this,tr("Report file name"),"","Report files (*.lrxml);; All files (*)"))){ + else if (m_report->saveToFile(QFileDialog::getSaveFileName(this,tr("Report file name"),"","Report files (*.lrxml);; All files (*)"))){ m_report->emitSaveFinished(); - return true; + result = true; }; } - return false; +#ifdef HAVE_QTDESIGNER_INTEGRATION + if (result){ + m_dialogChanged = false; + m_dialogDesignerManager->setDirty(false); + } +#endif + return result; } bool ReportDesignWidget::loadFromFile(const QString &fileName) @@ -367,6 +423,7 @@ bool ReportDesignWidget::loadFromFile(const QString &fileName) //connectPage(m_report->pageAt(0)); m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); emit loaded(); + m_dialogChanged = false; return true; } else { QMessageBox::critical(this,tr("Error"),tr("Wrong file format")); @@ -390,7 +447,7 @@ QString ReportDesignWidget::reportFileName() bool ReportDesignWidget::isNeedToSave() { if(m_report) - return m_report->isNeedToSave(); + return (m_report->isNeedToSave() || m_dialogChanged); return false; } @@ -409,12 +466,20 @@ void ReportDesignWidget::undo() { if (activePage()) activePage()->undo(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + if (activeDialogPage()) + activeDialogPage()->undo(); +#endif } void ReportDesignWidget::redo() { if (activePage()) activePage()->redo(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + if (activeDialogPage()) + activeDialogPage()->redo(); +#endif } void ReportDesignWidget::copy() @@ -667,6 +732,16 @@ void ReportDesignWidget::slotPagesLoadFinished() emit loaded(); } +void ReportDesignWidget::slotDialogDeleted(QString dialogName) +{ + for (int i = 0; icount(); ++i ){ + if (m_tabWidget->tabText(i).compare(dialogName) == 0){ + delete m_tabWidget->widget(i); + break; + } + } +} + void ReportDesignWidget::slotDatasourceCollectionLoaded(const QString & /*collectionName*/) { } @@ -685,16 +760,40 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) } m_zoomer->setView(view); } +#ifdef HAVE_QTDESIGNER_INTEGRATION if (activeTabType() == Dialog){ - m_dialogDesigner->setActiveEditor(m_tabWidget->widget(index)); + m_dialogDesignerManager->setActiveEditor(m_tabWidget->widget(index)); } + updateDialogs(); +#endif emit activePageChanged(); } #ifdef HAVE_QTDESIGNER_INTEGRATION -void ReportDesignWidget::slotDialogChanged() +void ReportDesignWidget::addNewDialog() { + QFile templateUi(":/templates/templates/Dialog.ui"); + templateUi.open(QIODevice::ReadOnly|QIODevice::Text); + QString templateStr = templateUi.readAll(); + QString dialogName = m_report->scriptContext()->getNewDialogName(); + templateStr.replace("$ClassName$", dialogName); + m_report->scriptContext()->addDialog(dialogName,templateStr.toUtf8()); + createNewDialogTab(dialogName, templateStr.toUtf8()); +} + +void ReportDesignWidget::slotDialogChanged(QString ) +{ + m_dialogChanged = true; +} + +void ReportDesignWidget::slotDialogNameChanged(QString oldName, QString newName) +{ + for (int i = 0; i < m_tabWidget->count(); ++i){ + if (m_tabWidget->tabText(i).compare(oldName) == 0) + m_tabWidget->setTabText(i, newName); + } + m_report->scriptContext()->changeDialogName(oldName, newName); } #endif diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index ee6a157..455b685 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -48,6 +48,7 @@ namespace LimeReport { class ReportEnginePrivate; class DataBrowser; class ReportDesignWindow; +class DialogDesignerManager; class DialogDesigner; class ReportDesignWidget : public QWidget @@ -100,15 +101,17 @@ public: bool useGrid(){ return m_useGrid;} bool useMagnet() const; void setUseMagnet(bool useMagnet); - DialogDesigner *dialogDesigner() const; - QWidget* toolWindow(ToolWindowType windowType); EditorTabType activeTabType(); #ifdef HAVE_QTDESIGNER_INTEGRATION void initDialogDesignerToolBar(QToolBar* toolBar); void updateDialogs(); + DialogDesignerManager *dialogDesignerManager() const; + QString activeDialogName(); + DialogDesigner* activeDialogPage(); + QWidget* toolWindow(ToolWindowType windowType); #endif public slots: - void saveToFile(const QString&); + bool saveToFile(const QString&); bool save(); bool loadFromFile(const QString&); void deleteSelectedItems(); @@ -140,6 +143,10 @@ public slots: void addPage(); void deleteCurrentPage(); void slotPagesLoadFinished(); + void slotDialogDeleted(QString dialogName); +#ifdef HAVE_QTDESIGNER_INTEGRATION + void addNewDialog(); +#endif private slots: void slotItemSelected(LimeReport::BaseDesignIntf *item); void slotSelectionChanged(); @@ -147,7 +154,8 @@ private slots: void slotSceneRectChanged(QRectF); void slotCurrentTabChanged(int index); #ifdef HAVE_QTDESIGNER_INTEGRATION - void slotDialogChanged(); + void slotDialogChanged(QString); + void slotDialogNameChanged(QString oldName, QString newName); #endif signals: void insertModeStarted(); @@ -169,13 +177,18 @@ signals: void pageDeleted(); protected: void createTabs(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + void createNewDialogTab(const QString& dialogName,const QByteArray& description); +#endif private: bool eventFilter(QObject *target, QEvent *event); private: ReportEnginePrivate* m_report; QGraphicsView *m_view; QTextEdit* m_scriptEditor; - DialogDesigner* m_dialogDesigner; +#ifdef HAVE_QTDESIGNER_INTEGRATION + DialogDesignerManager* m_dialogDesignerManager; +#endif QMainWindow *m_mainWindow; QTabWidget* m_tabWidget; GraphicsViewZoomer* m_zoomer; @@ -184,6 +197,7 @@ private: int m_horizontalGridStep; bool m_useGrid; bool m_useMagnet; + bool m_dialogChanged; }; } diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index febddfd..b2df5a1 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -211,11 +211,6 @@ void ReportDesignWindow::createActions() m_testAction->setIcon(QIcon(":/report/images/pin")); connect(m_testAction,SIGNAL(triggered()),this,SLOT(slotTest())); -// m_printReportAction = new QAction(tr("Print Report"),this); -// m_printReportAction->setIcon(QIcon(":/report/images/print")); -// m_printReportAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_P)); -// connect(m_printReportAction,SIGNAL(triggered()),this,SLOT(slotPrintReport())); - m_editLayoutMode = new QAction(tr("Edit layouts mode"),this); m_editLayoutMode->setIcon(QIcon(":/report/images/editlayout")); m_editLayoutMode->setCheckable(true); @@ -231,15 +226,22 @@ void ReportDesignWindow::createActions() m_hideLeftPanel = new QAction(tr("Hide left panel"),this); m_hideLeftPanel->setCheckable(true); -// m_hideLeftPanel->setChecked(true); m_hideLeftPanel->setIcon(QIcon(":/report/images/hideLeftPanel")); connect(m_hideLeftPanel,SIGNAL(toggled(bool)), this, SLOT(slotHideLeftPanel(bool))); m_hideRightPanel = new QAction(tr("Hide right panel"),this); m_hideRightPanel->setCheckable(true); -// m_hideRightPanel->setChecked(true); m_hideRightPanel->setIcon(QIcon(":/report/images/hideRightPanel")); connect(m_hideRightPanel,SIGNAL(toggled(bool)), this, SLOT(slotHideRightPanel(bool))); +#ifdef HAVE_QTDESIGNER_INTEGRATION + m_deleteDialogAction = new QAction(tr("Delete dialog"), this); + m_deleteDialogAction->setIcon(QIcon(":/report//images/deleteDialog")); + connect(m_deleteDialogAction, SIGNAL(triggered()), this, SLOT(slotDeleteDialog())); + + m_addNewDialogAction = new QAction(tr("Add new dialog"), this); + m_addNewDialogAction->setIcon(QIcon(":/report//images/addDialog")); + connect(m_addNewDialogAction, SIGNAL(triggered()), this, SLOT(slotAddNewDialog())); +#endif } void ReportDesignWindow::createReportToolBar() @@ -252,7 +254,6 @@ void ReportDesignWindow::createReportToolBar() m_reportToolBar->setObjectName("reportTools"); createItemsActions(); m_reportToolBar->addSeparator(); - //m_reportToolBar->addAction(m_editLayoutMode); m_reportToolBar->addAction(m_addHLayout); m_reportToolBar->addSeparator(); m_reportToolBar->addAction(m_deleteItemAction); @@ -286,6 +287,9 @@ void ReportDesignWindow::createToolBars() m_mainToolBar->addAction(m_newPageAction); m_mainToolBar->addAction(m_deletePageAction); +#ifdef HAVE_QTDESIGNER_INTEGRATION + m_mainToolBar->addAction(m_addNewDialogAction); +#endif m_mainToolBar->addSeparator(); m_mainToolBar->addAction(m_copyAction); @@ -582,6 +586,11 @@ void ReportDesignWindow::createDialogDesignerToolBar() { m_dialogDesignerToolBar = addToolBar(tr("Dialog Designer Tools")); m_dialogDesignerToolBar->setObjectName("DialogDesignerTools"); + m_dialogDesignerToolBar->addAction(m_saveReportAction); + m_dialogDesignerToolBar->addAction(m_previewReportAction); + m_dialogDesignerToolBar->addSeparator(); + m_dialogDesignerToolBar->addAction(m_deleteDialogAction); + m_dialogDesignerToolBar->addSeparator(); m_reportDesignWidget->initDialogDesignerToolBar(m_dialogDesignerToolBar); m_dialogTools << m_dialogDesignerToolBar; } @@ -1257,6 +1266,7 @@ void ReportDesignWindow::slotActivePageChanged() switch (m_editorTabType) { case ReportDesignWidget::Dialog: m_dialogEditorsState = saveState(); + m_scriptBrowser->updateDialogsTree(); break; default: m_pageEditorsState = saveState(); @@ -1388,6 +1398,20 @@ void ReportDesignWindow::slotPageDeleted() m_deletePageAction->setEnabled(m_reportDesignWidget->report()->pageCount()>1); } +#ifdef HAVE_QTDESIGNER_INTEGRATION +void ReportDesignWindow::slotDeleteDialog() +{ + if ( m_editorTabType == ReportDesignWidget::Dialog ){ + m_reportDesignWidget->report()->scriptContext()->deleteDialog(m_reportDesignWidget->activeDialogName()); + } +} + +void ReportDesignWindow::slotAddNewDialog() +{ + m_reportDesignWidget->addNewDialog(); +} +#endif + void ReportDesignWindow::closeEvent(QCloseEvent * event) { if (checkNeedToSave()){ diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 0abe16c..c3e2578 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -119,6 +119,10 @@ private slots: void slotLoadRecentFile(const QString fileName); void slotPageAdded(PageDesignIntf* ); void slotPageDeleted(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + void slotDeleteDialog(); + void slotAddNewDialog(); +#endif protected: void closeEvent(QCloseEvent *event); void resizeEvent(QResizeEvent *); @@ -217,6 +221,10 @@ private: QAction* m_addHLayout; QAction* m_hideLeftPanel; QAction* m_hideRightPanel; +#ifdef HAVE_QTDESIGNER_INTEGRATION + QAction* m_deleteDialogAction; + QAction* m_addNewDialogAction; +#endif QMenu* m_recentFilesMenu; QSignalMapper* m_bandsAddSignalsMap; diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index b57ea88..785640a 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1065,6 +1065,7 @@ void DialogDescriber::setDescription(const QByteArray &description) void ScriptEngineContext::addDialog(const QString& name, const QByteArray& description) { m_dialogs.push_back(DialogDescriber::create(name,description)); + emit dialogAdded(name); } bool ScriptEngineContext::changeDialog(const QString& name, const QByteArray& description) @@ -1072,6 +1073,37 @@ bool ScriptEngineContext::changeDialog(const QString& name, const QByteArray& de foreach( DialogDescriber::Ptr describer, m_dialogs){ if (describer->name().compare(name) == 0){ describer->setDescription(description); + { + QList::Iterator it = m_createdDialogs.begin(); + while(it!=m_createdDialogs.end()){ + if ((*it)->objectName()==name){ + it = m_createdDialogs.erase(it); + } else { + ++it; + } + } + } + return true; + } + } + return false; +} + +bool ScriptEngineContext::changeDialogName(const QString& oldName, const QString& newName) +{ + foreach( DialogDescriber::Ptr describer, m_dialogs){ + if (describer->name().compare(oldName) == 0){ + describer->setName(newName); + { + QList::Iterator it = m_createdDialogs.begin(); + while(it!=m_createdDialogs.end()){ + if ((*it)->objectName()==oldName){ + it = m_createdDialogs.erase(it); + } else { + ++it; + } + } + } return true; } } @@ -1106,6 +1138,7 @@ void ScriptEngineContext::deleteDialog(const QString& dialogName) while(it!=m_dialogs.end()){ if ((*it)->name()==dialogName){ it = m_dialogs.erase(it); + emit dialogDeleted(dialogName); } else { ++it; } @@ -1188,6 +1221,10 @@ QDialog* ScriptEngineContext::createDialog(DialogDescriber* cont) buffer.open(QIODevice::ReadOnly); QDialog* dialog = dynamic_cast(loader.load(&buffer)); m_createdDialogs.push_back(QSharedPointer(dialog)); + if (cont->name().compare(dialog->objectName())){ + cont->setName(dialog->objectName()); + emit dialogNameChanged(dialog->objectName()); + } return dialog; } @@ -1225,6 +1262,18 @@ QDialog* ScriptEngineContext::getDialog(const QString& dialogName) } return 0; } + +QString ScriptEngineContext::getNewDialogName() +{ + QString result = "Dialog"; + int index = m_dialogs.size() - 1; + while (containsDialog(result)){ + index++; + result = QString("Dialog%1").arg(index); + } + return result; +} + #endif QString ScriptEngineContext::initScript() const { diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index af97b63..235599a 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -146,15 +146,21 @@ public: #ifdef HAVE_UI_LOADER void addDialog(const QString& name, const QByteArray& description); bool changeDialog(const QString& name, const QByteArray &description); + bool changeDialogName(const QString& oldName, const QString& newName); bool previewDialog(const QString& dialogName); bool containsDialog(const QString& dialogName); const QVector& dialogDescribers(){return m_dialogs;} void deleteDialog(const QString& dialogName); QDialog *getDialog(const QString &dialogName); + QString getNewDialogName(); #endif void clear(); QString initScript() const; void setInitScript(const QString& initScript); +signals: + void dialogNameChanged(QString dialogName); + void dialogDeleted(QString dialogName); + void dialogAdded(QString dialogName); protected: QObject* createElement(const QString& collectionName,const QString& elementType); int elementsCount(const QString& collectionName); diff --git a/limereport/report.qrc b/limereport/report.qrc index 6548420..1e7c5d6 100644 --- a/limereport/report.qrc +++ b/limereport/report.qrc @@ -175,5 +175,7 @@ images/addBand2.png images/edit_control_4_24.png images/logo_32x32_1.png + images/addDialog.png + images/deleteDialog.png diff --git a/limereport/scriptbrowser/lrscriptbrowser.cpp b/limereport/scriptbrowser/lrscriptbrowser.cpp index 1bd052d..1ef6b73 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.cpp +++ b/limereport/scriptbrowser/lrscriptbrowser.cpp @@ -59,6 +59,7 @@ void ScriptBrowser::setReportEditor(ReportDesignWidget* report) m_report=report; connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); connect(m_report,SIGNAL(loaded()),this,SLOT(slotUpdate())); + connect(m_report->scriptContext(), SIGNAL(dialogAdded(QString)), this, SLOT(slotDialogAdded(QString))); updateFunctionTree(); } @@ -138,6 +139,11 @@ void ScriptBrowser::slotUpdate() updateFunctionTree(); } +void ScriptBrowser::slotDialogAdded(QString) +{ + updateDialogsTree(); +} + #ifdef HAVE_UI_LOADER void ScriptBrowser::on_tbAddDialog_clicked() { @@ -157,7 +163,7 @@ void ScriptBrowser::on_tbAddDialog_clicked() if (!m_report->scriptContext()->containsDialog(dialog->objectName())){ file.seek(0); m_report->scriptContext()->addDialog(dialog->objectName(),file.readAll()); - updateDialogsTree(); + //updateDialogsTree(); } else { QMessageBox::critical(this,tr("Error"),tr("Dialog with name: %1 already exists").arg(dialog->objectName())); } diff --git a/limereport/scriptbrowser/lrscriptbrowser.h b/limereport/scriptbrowser/lrscriptbrowser.h index 3214617..dd7d9ae 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.h +++ b/limereport/scriptbrowser/lrscriptbrowser.h @@ -62,6 +62,7 @@ protected: private slots: void slotClear(); void slotUpdate(); + void slotDialogAdded(QString); #ifdef HAVE_UI_LOADER void on_tbAddDialog_clicked(); void on_tbRunDialog_clicked();