From 66c18d95a756ef9ee80c75573ef63b1ba3645621 Mon Sep 17 00:00:00 2001 From: Michael Mandl Date: Sat, 29 Sep 2018 13:31:23 +0200 Subject: [PATCH 1/2] Fixed #10: ask to save modified data when exiting --- source/DataModel.cpp | 18 +++++++++++++ source/DataModel.h | 3 +++ source/mainwindow.cpp | 61 +++++++++++++++++++++++++++++++++++++++++-- source/mainwindow.h | 5 ++++ 4 files changed, 85 insertions(+), 2 deletions(-) diff --git a/source/DataModel.cpp b/source/DataModel.cpp index 3b38543..d96b868 100644 --- a/source/DataModel.cpp +++ b/source/DataModel.cpp @@ -64,45 +64,63 @@ void DataModel::read(const QJsonObject &source) void DataModel::pluralModelChanged() { m_results.setPluralResult(m_plural.getPoints()); + + emit modelChanged(); } void DataModel::metaDataChanged() { m_results.setAge(m_metaData.getAge()); + + emit modelChanged(); } void DataModel::genusModelChanged() { m_results.setGenusResult(m_genus.getPoints()); + + emit modelChanged(); } void DataModel::verbEndModelChanged() { m_results.setVerbEndResult(m_verbEnd.getPoints()); + + emit modelChanged(); } void DataModel::akkusativModelChanged() { m_results.setAkkusativResult(m_akkusativ.getPoints()); + + emit modelChanged(); } void DataModel::dativModelChanged() { m_results.setDativResult(m_dativ.getPoints()); + + emit modelChanged(); } void DataModel::v2SvkModelChanged() { m_results.setV2Result(m_v2Svk.getV2Points()); m_results.setSvkResult(m_v2Svk.getSvkPoints()); + + emit modelChanged(); } void DataModel::passivModelChanged() { m_results.setPassivResult(m_passiv.getPoints()); + + emit modelChanged(); } void DataModel::genitivModelChanged() { m_results.setGenitivResult(m_genitiv.getPoints()); + + emit modelChanged(); } diff --git a/source/DataModel.h b/source/DataModel.h index f226712..20d1b31 100644 --- a/source/DataModel.h +++ b/source/DataModel.h @@ -37,6 +37,9 @@ public: void write(QJsonObject &target) const; void read(const QJsonObject &source); +signals: + void modelChanged(); + private: template void write( diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 8f13afa..40375a3 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -8,6 +8,9 @@ #include #include #include +#include +#include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -38,12 +41,17 @@ void MainWindow::newFile() ui->akkusativDativWidget->setAkkusativModel(&m_dataModel->m_akkusativ); ui->akkusativDativWidget->setDativModel(&m_dataModel->m_dativ); ui->v2SvkWidget->setV2SvkModel(&m_dataModel->m_v2Svk); - ui->lateSkillsWidget->setPassivModel(&m_dataModel->m_passiv); - ui->lateSkillsWidget->setGenitivModel(&m_dataModel->m_genitiv); + ui->lateSkillsWidget->setPassivModel(&m_dataModel->m_passiv); + ui->lateSkillsWidget->setGenitivModel(&m_dataModel->m_genitiv); ui->resultWidget->setModel(&m_dataModel->m_results); + connect(&*m_dataModel, &DataModel::modelChanged, this, &MainWindow::dataModelChanged); + + setWindowModified(false); + setWindowTitle("untitled[*]"); m_filename = ""; + m_saveOnClose = false; } void MainWindow::openFile() @@ -67,6 +75,9 @@ void MainWindow::openFile() m_dataModel->read(loadDoc.object()); + setWindowModified(false); + setWindowTitle(filename + "[*]"); + m_saveOnClose = false; m_filename = filename; ui->metaDataWidget->toFirst(); @@ -96,6 +107,49 @@ void MainWindow::saveFileAs() saveFile(filename); } +void MainWindow::dataModelChanged() +{ + qDebug() << "data model changed"; + + m_saveOnClose = true; + setWindowModified(true); +} + +void MainWindow::closeEvent(QCloseEvent *event) +{ + if (m_saveOnClose == false) + { + event->accept(); + return; + } + + QMessageBox msgBox; + msgBox.setText("The document has been modified."); + msgBox.setInformativeText("Do you want to save your changes?"); + msgBox.setStandardButtons( + QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Save); + int ret = msgBox.exec(); + + switch (ret) + { + case QMessageBox::Save: + saveFile(); + if (m_saveOnClose == true) + { + event->ignore(); + break; + } + case QMessageBox::Discard: + event->accept(); + break; + case QMessageBox::Cancel: + default: + event->ignore(); + break; + } +} + void MainWindow::saveFile(const QString &filename) { QJsonObject saveData; @@ -108,5 +162,8 @@ void MainWindow::saveFile(const QString &filename) saveFile.write(saveDoc.toJson()); saveFile.close(); + setWindowTitle(filename + "[*]"); + setWindowModified(false); m_filename = filename; + m_saveOnClose = false; } diff --git a/source/mainwindow.h b/source/mainwindow.h index 8d04176..5c6d31f 100644 --- a/source/mainwindow.h +++ b/source/mainwindow.h @@ -19,6 +19,7 @@ private: Ui::MainWindow *ui; std::unique_ptr m_dataModel; QString m_filename; + bool m_saveOnClose = false; public: MainWindow(QWidget *parent = nullptr); @@ -29,6 +30,10 @@ public slots: void openFile(); void saveFile(); void saveFileAs(); + void dataModelChanged(); + +protected: + void closeEvent(QCloseEvent *event) override; private: void saveFile(const QString &filename); From 4fc514e2ebc5b4b7701e298c2cbd45cc5fb3f0fc Mon Sep 17 00:00:00 2001 From: Michael Mandl Date: Sat, 29 Sep 2018 13:42:38 +0200 Subject: [PATCH 2/2] Updated connect()s to new syntax --- source/mainwindow.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 40375a3..9b07977 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -18,10 +18,12 @@ MainWindow::MainWindow(QWidget *parent) { ui->setupUi(this); - connect(ui->actionNew, SIGNAL(triggered()), this, SLOT(newFile())); - connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(openFile())); - connect(ui->actionSave, SIGNAL(triggered()), this, SLOT(saveFile())); - connect(ui->actionSave_as, SIGNAL(triggered()), this, SLOT(saveFileAs())); + connect(ui->actionNew, &QAction::triggered, this, &MainWindow::newFile); + connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::openFile); + connect(ui->actionSave, &QAction::triggered, this, + qOverload<>(&MainWindow::saveFile)); + connect( + ui->actionSave_as, &QAction::triggered, this, &MainWindow::saveFileAs); newFile(); } @@ -46,7 +48,8 @@ void MainWindow::newFile() ui->resultWidget->setModel(&m_dataModel->m_results); - connect(&*m_dataModel, &DataModel::modelChanged, this, &MainWindow::dataModelChanged); + connect(&*m_dataModel, &DataModel::modelChanged, this, + &MainWindow::dataModelChanged); setWindowModified(false); setWindowTitle("untitled[*]");