diff --git a/app/include/MainWindow.h b/app/include/MainWindow.h index 77c6b09..d16d4f5 100644 --- a/app/include/MainWindow.h +++ b/app/include/MainWindow.h @@ -52,6 +52,7 @@ public slots: protected: void changeEvent(QEvent *e); + void closeEvent(QCloseEvent *event); private: std::unique_ptr m_Ui; diff --git a/app/src/MainWindow.cpp b/app/src/MainWindow.cpp index eda17cd..02ff19c 100644 --- a/app/src/MainWindow.cpp +++ b/app/src/MainWindow.cpp @@ -22,6 +22,7 @@ #include "MainWindow.h" #include "ui_MainWindow.h" +#include #include #include #include @@ -36,9 +37,11 @@ #include #include +#include #include #include #include +#include #include #include #include @@ -74,6 +77,8 @@ public: SqpSettingsDialog *m_SettingsDialog; /// Catalogue dialog. MainWindow has the ownership CatalogueExplorer *m_CatalogExplorer; + + bool checkDataToSave(QWidget *parentWidget); }; MainWindow::MainWindow(QWidget *parent) @@ -364,3 +369,37 @@ void MainWindow::changeEvent(QEvent *e) break; } } + +void MainWindow::closeEvent(QCloseEvent *event) +{ + if (!impl->checkDataToSave(this)) { + event->ignore(); + } + else { + event->accept(); + } +} + +bool MainWindow::MainWindowPrivate::checkDataToSave(QWidget *parentWidget) +{ + auto hasChanges = sqpApp->catalogueController().hasChanges(); + if (hasChanges) { + // There are some unsaved changes + switch (QMessageBox::question( + parentWidget, "Save changes", + tr("The catalogue controller unsaved changes.\nDo you want to save them ?"), + QMessageBox::SaveAll | QMessageBox::Discard | QMessageBox::Cancel, + QMessageBox::SaveAll)) { + case QMessageBox::SaveAll: + sqpApp->catalogueController().saveAll(); + break; + case QMessageBox::Discard: + break; + case QMessageBox::Cancel: + default: + return false; + } + } + + return true; +} diff --git a/core/include/Catalogue/CatalogueController.h b/core/include/Catalogue/CatalogueController.h index b9b2835..4a2007f 100644 --- a/core/include/Catalogue/CatalogueController.h +++ b/core/include/Catalogue/CatalogueController.h @@ -62,6 +62,7 @@ public: void saveCatalogue(std::shared_ptr catalogue); void saveAll(); + bool hasChanges() const; /// Returns the MIME data associated to a list of variables QByteArray mimeDataForEvents(const QVector > &events) const; diff --git a/core/src/Catalogue/CatalogueController.cpp b/core/src/Catalogue/CatalogueController.cpp index b2892b7..653d975 100644 --- a/core/src/Catalogue/CatalogueController.cpp +++ b/core/src/Catalogue/CatalogueController.cpp @@ -249,6 +249,11 @@ void CatalogueController::saveAll() impl->m_EventKeysWithChanges.clear(); } +bool CatalogueController::hasChanges() const +{ + return !impl->m_EventKeysWithChanges.isEmpty(); // TODO: catalogues +} + QByteArray CatalogueController::mimeDataForEvents(const QVector > &events) const {