From 8138b5b86c73399bce65d8f64dd46859c114f69e Mon Sep 17 00:00:00 2001 From: xavierqet Date: Thu, 4 Oct 2007 12:19:01 +0000 Subject: [PATCH] L'application verifie desormais les fenetres cachees avant de quitter lors de la fermeture de la derniere fenetre visible git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@155 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- qetapp.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++---- qetapp.h | 4 +++- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/qetapp.cpp b/qetapp.cpp index 1a1a225fa..2fb7c52eb 100644 --- a/qetapp.cpp +++ b/qetapp.cpp @@ -34,7 +34,7 @@ QETApp::QETApp(int &argc, char **argv) : QApplication(argc, argv) { reduce_appli -> setToolTip(tr("R\351duire QElectroTech dans le systray")); restore_appli -> setToolTip(tr("Restaurer QElectroTech")); - connect(quitter_qet, SIGNAL(triggered()), this, SLOT(closeEveryEditor())); + connect(quitter_qet, SIGNAL(triggered()), this, SLOT(quitQET())); connect(reduce_appli, SIGNAL(triggered()), this, SLOT(reduceEveryEditor())); connect(restore_appli, SIGNAL(triggered()), this, SLOT(restoreEveryEditor())); connect(reduce_diagrams, SIGNAL(triggered()), this, SLOT(reduceDiagramEditors())); @@ -53,6 +53,9 @@ QETApp::QETApp(int &argc, char **argv) : QApplication(argc, argv) { connect(qsti, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(systray(QSystemTrayIcon::ActivationReason))); qsti -> setContextMenu(menu_systray); qsti -> show(); + + setQuitOnLastWindowClosed(false); + connect(this, SIGNAL(lastWindowClosed()), this, SLOT(checkRemainingWindows())); } // Creation et affichage d'un editeur de schema @@ -238,12 +241,19 @@ QString QETApp::languagesPath() { /** Ferme tous les editeurs + @return true si l'utilisateur a accepte toutes les fermetures, false sinon */ -void QETApp::closeEveryEditor() { +bool QETApp::closeEveryEditor() { // s'assure que toutes les fenetres soient visibles avant de quitter restoreEveryEditor(); - foreach(QETDiagramEditor *e, diagramEditors()) e -> close(); - foreach(QETElementEditor *e, elementEditors()) e -> close(); + bool every_window_closed = true; + foreach(QETDiagramEditor *e, diagramEditors()) { + every_window_closed = every_window_closed && e -> close(); + } + foreach(QETElementEditor *e, elementEditors()) { + every_window_closed = every_window_closed && e -> close(); + } + return(every_window_closed); } /** @@ -310,6 +320,36 @@ void QETApp::invertMainWindowVisibility(QWidget *window) { if (QMainWindow *w = qobject_cast(window)) setMainWindowVisible(w, !w -> isVisible()); } +/** + Demande la fermeture de toutes les fenetres ; si l'utilisateur les accepte, + l'application quitte +*/ +void QETApp::quitQET() { + if (closeEveryEditor()) { + quit(); + } +} + +/** + Verifie s'il reste des fenetres (cachees ou non) et quitte s'il n'en reste + plus. +*/ +void QETApp::checkRemainingWindows() { + /* petite bidouille : le slot se rappelle apres 500 ms d'attente + afin de compenser le fait que certaines fenetres peuvent encore + paraitre vivantes alors qu'elles viennent d'etre fermees + */ + static bool sleep = true; + if (sleep) { + QTimer::singleShot(500, this, SLOT(checkRemainingWindows())); + } else { + if (!diagramEditors().count() && !elementEditors().count()) { + quit(); + } + } + sleep = !sleep; +} + /** @param window fenetre dont il faut trouver les barres d'outils et dock flottants @return les barres d'outils et dock flottants de la fenetre diff --git a/qetapp.h b/qetapp.h index a08e54928..90b71c6b0 100644 --- a/qetapp.h +++ b/qetapp.h @@ -64,9 +64,11 @@ class QETApp : public QApplication { void restoreElementEditors(); void newDiagramEditor(); void newElementEditor(); - void closeEveryEditor(); + bool closeEveryEditor(); void setMainWindowVisible(QMainWindow *, bool); void invertMainWindowVisibility(QWidget *); + void quitQET(); + void checkRemainingWindows(); // methodes privees private slots: