From 1819a02d506c535b47132a83ffc59cc60cd5e559 Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Sun, 15 May 2016 16:15:32 -0400 Subject: [PATCH] Properly handle close events. --- glabels/File.cpp | 39 ++--------------------------- glabels/MainWindow.cpp | 57 ++++++++++++++++++++++++++++++++++++++++-- glabels/MainWindow.h | 2 ++ 3 files changed, 59 insertions(+), 39 deletions(-) diff --git a/glabels/File.cpp b/glabels/File.cpp index 4153c29..9ba0540 100644 --- a/glabels/File.cpp +++ b/glabels/File.cpp @@ -195,42 +195,7 @@ void File::print( MainWindow *window ) /// void File::close( MainWindow *window ) { - bool closeFlag = true; - - if ( !window->isEmpty() ) - { - QMessageBox msgBox; - msgBox.setText( tr("The document ") + window->model()->shortName() + tr(" has been modified.") ); - msgBox.setInformativeText( tr("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: - // Save was clicked - closeFlag = save( window ); - break; - case QMessageBox::Discard: - // Don't Save was clicked - closeFlag = true; - break; - case QMessageBox::Cancel: - // Cancel was clicked - closeFlag = false; - break; - default: - // should never be reached - closeFlag = false; - break; - } - } - - if ( closeFlag ) - { - window->close(); - } + window->close(); } @@ -241,6 +206,6 @@ void File::exit() { foreach ( MainWindow* window, MainWindow::windowList() ) { - close( window ); + window->close(); } } diff --git a/glabels/MainWindow.cpp b/glabels/MainWindow.cpp index ba8c2fe..52167a3 100644 --- a/glabels/MainWindow.cpp +++ b/glabels/MainWindow.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include "libglabels/Db.h" @@ -221,8 +222,15 @@ QList MainWindow::windowList() /// void MainWindow::closeEvent( QCloseEvent *event ) { - writeSettings(); - event->accept(); + if ( isOkToClose() ) + { + writeSettings(); + event->accept(); + } + else + { + event->ignore(); + } } @@ -921,6 +929,51 @@ void MainWindow::writeSettings() } +/// +/// Is it ok to close window? +/// +bool MainWindow::isOkToClose() +{ + bool ok = true; + + if ( !this->isEmpty() ) + { + if ( mModel->isModified() ) + { + QString msg = tr("Save changes to project \"%1\" before closing?").arg( mModel->shortName() ); + QString info = tr("Your changes will be lost if you don't save them."); + + int ret = QMessageBox::warning( this, + tr( "Save project?" ), + "" + msg + "

" + info + "

", + (QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel), + QMessageBox::Save ); + + switch (ret) { + case QMessageBox::Save: + // Save was clicked + ok = File::save( this ); + break; + case QMessageBox::Discard: + // Don't Save was clicked + ok = true; + break; + case QMessageBox::Cancel: + // Cancel was clicked + ok = false; + break; + default: + // should never be reached + ok = false; + break; + } + } + } + + return ok; +} + + /// /// Change page /// diff --git a/glabels/MainWindow.h b/glabels/MainWindow.h index ca0633b..c9d72ec 100644 --- a/glabels/MainWindow.h +++ b/glabels/MainWindow.h @@ -179,6 +179,8 @@ private: void readSettings(); void writeSettings(); + bool isOkToClose(); + ///////////////////////////////////// // Private Data