Improve MainWindow state save/restore
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 14 Jul 2009 20:20:05 +0000 (22:20 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 14 Jul 2009 20:58:22 +0000 (22:58 +0200)
Rather than tracking the visibility manually, we now make sure that the window state is saved
before the window is hidden, i.e. not in aboutToQuit() which is already too late for that.
Instead of calling QApplication::quit(), we use our new slot MainWin::quit() which saves the window
layout first.

For KDEified Quassel, we now use KMainWindow's autosave feature rather than using QMainWindow::restoreState().
This might fix some issues with multiple desktops etc, though I haven't tested that. In any case it's cleaner
as it saves additional properties (e.g. toolbar state).

src/common/quassel.cpp
src/common/quassel.h
src/qtui/mainwin.cpp
src/qtui/mainwin.h
src/qtui/qtuiapplication.cpp
src/qtui/qtuiapplication.h

index 33b6cbd..a43a707 100644 (file)
@@ -49,8 +49,12 @@ QStringList Quassel::_dataDirPaths;
 bool Quassel::_initialized = false;
 bool Quassel::DEBUG = false;
 QString Quassel::_coreDumpFileName;
+Quassel *Quassel::_instance = 0;
 
 Quassel::Quassel() {
+  Q_ASSERT(!_instance);
+  _instance = this;
+
   // We catch SIGTERM and SIGINT (caused by Ctrl+C) to graceful shutdown Quassel.
   signal(SIGTERM, handleSignal);
   signal(SIGINT, handleSignal);
@@ -108,6 +112,10 @@ bool Quassel::init() {
   return true;
 }
 
+void Quassel::quit() {
+  QCoreApplication::quit();
+}
+
 //! Register our custom types with Qt's Meta Object System.
 /**  This makes them available for QVariant and in signals/slots, among other things.
 *
@@ -207,7 +215,10 @@ void Quassel::handleSignal(int sig) {
   case SIGTERM:
   case SIGINT:
     qWarning("%s", qPrintable(QString("Caught signal %1 - exiting.").arg(sig)));
-    QCoreApplication::quit();
+    if(_instance)
+      _instance->quit();
+    else
+      QCoreApplication::quit();
     break;
   case SIGABRT:
   case SIGSEGV:
index 53d9e0b..4b9c5a9 100644 (file)
@@ -106,6 +106,7 @@ public:
 protected:
   Quassel();
   virtual bool init();
+  virtual void quit();
 
   inline void setRunMode(RunMode mode);
   inline void setDataDirPaths(const QStringList &paths);
@@ -117,6 +118,7 @@ private:
   static void handleSignal(int signal);
   static void logBacktrace(const QString &filename);
 
+  static Quassel *_instance;
   static BuildInfo _buildInfo;
   static AbstractCliParser *_cliParser;
   static RunMode _runMode;
index f31354c..1e74e18 100644 (file)
@@ -133,13 +133,9 @@ MainWin::MainWin(QWidget *parent)
   updateIcon();
 
   installEventFilter(new JumpKeyHandler(this));
-
-  QtUiApplication* app = qobject_cast<QtUiApplication*> qApp;
-  connect(app, SIGNAL(aboutToQuit()), SLOT(aboutToQuit()));
 }
 
 void MainWin::init() {
-  connect(QApplication::instance(), SIGNAL(aboutToQuit()), SLOT(saveLayout()));
   connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(clientNetworkCreated(NetworkId)));
   connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(clientNetworkRemoved(NetworkId)));
   connect(Client::messageModel(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
@@ -183,6 +179,10 @@ void MainWin::init() {
 
   setDisconnectedState();  // Disable menus and stuff
 
+#ifdef HAVE_KDE
+  setAutoSaveSettings();
+#endif
+
   // restore mainwin state
   QtUiSettings s;
   restoreStateFromSettings(s);
@@ -201,9 +201,11 @@ MainWin::~MainWin() {
 
 }
 
-void MainWin::aboutToQuit() {
+void MainWin::quit() {
   QtUiSettings s;
   saveStateToSettings(s);
+  saveLayout();
+  QApplication::quit();
 }
 
 void MainWin::saveStateToSettings(UiSettings &s) {
@@ -213,7 +215,11 @@ void MainWin::saveStateToSettings(UiSettings &s) {
   s.setValue("MainWinGeometry", saveGeometry());
   s.setValue("MainWinMinimized", isMinimized());
   s.setValue("MainWinMaximized", isMaximized());
-  s.setValue("MainWinHidden", _isHidden);
+  s.setValue("MainWinHidden", !isVisible());
+
+#ifdef HAVE_KDE
+  saveAutoSaveSettings();
+#endif
 }
 
 void MainWin::restoreStateFromSettings(UiSettings &s) {
@@ -221,6 +227,7 @@ void MainWin::restoreStateFromSettings(UiSettings &s) {
   _normalPos = s.value("MainWinPos", pos()).toPoint();
   bool maximized = s.value("MainWinMaximized", false).toBool();
 
+#ifndef HAVE_KDE
   restoreGeometry(s.value("MainWinGeometry").toByteArray());
 
   if(maximized) {
@@ -231,7 +238,10 @@ void MainWin::restoreStateFromSettings(UiSettings &s) {
 
   restoreState(s.value("MainWinState").toByteArray());
 
-  _isHidden = false;
+#else
+  move(_normalPos);
+#endif
+
   if(s.value("MainWinHidden").toBool())
     hideToTray();
   else if(s.value("MainWinMinimized").toBool())
@@ -270,7 +280,7 @@ void MainWin::setupActions() {
   coll->addAction("ConfigureNetworks", new Action(SmallIcon("configure"), tr("Configure &Networks..."), coll,
                                               this, SLOT(on_actionConfigureNetworks_triggered())));
   coll->addAction("Quit", new Action(SmallIcon("application-exit"), tr("&Quit"), coll,
-                                      qApp, SLOT(quit()), tr("Ctrl+Q")));
+                                      this, SLOT(quit()), tr("Ctrl+Q")));
 
   // View
   coll->addAction("ConfigureBufferViews", new Action(tr("&Configure Buffer Views..."), coll,
@@ -851,7 +861,7 @@ void MainWin::closeEvent(QCloseEvent *event) {
     event->ignore();
   } else {
     event->accept();
-    QApplication::quit();
+    quit();
   }
 }
 
@@ -871,7 +881,6 @@ void MainWin::hideToTray() {
   }
   hide();
   systemTray()->setIconVisible();
-  _isHidden = true;
 }
 
 void MainWin::toggleMinimizedToTray() {
@@ -913,7 +922,6 @@ void MainWin::forceActivated() {
   show();
   raise();
   activateWindow();
-  _isHidden = false;
 }
 
 void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
index c905e08..dd0459c 100644 (file)
@@ -91,6 +91,9 @@ class MainWin
     //! Bring window to front and focus it
     void forceActivated();
 
+    //! Quit application
+    void quit();
+
   protected:
     void closeEvent(QCloseEvent *event);
     void changeEvent(QEvent *event);
@@ -136,7 +139,6 @@ class MainWin
     void connectOrDisconnectFromNet();
 
     void saveStatusBarStatus(bool enabled);
-    void aboutToQuit();
 
     void loadLayout();
     void saveLayout();
@@ -191,7 +193,6 @@ class MainWin
 
     QSize _normalSize; //!< Size of the non-maximized window
     QPoint _normalPos; //!< Position of the non-maximized window
-    bool _isHidden;
 
 #ifdef Q_WS_WIN
     DWORD dwTickCount;
index 9d1b1ba..2aa1789 100644 (file)
@@ -124,6 +124,10 @@ QtUiApplication::~QtUiApplication() {
   Client::destroy();
 }
 
+void QtUiApplication::quit() {
+  QtUi::mainWindow()->quit();
+}
+
 void QtUiApplication::commitData(QSessionManager &manager) {
   Q_UNUSED(manager)
   _aboutToQuit = true;
index 4d34683..7478875 100644 (file)
@@ -53,6 +53,9 @@ public:
 
   inline bool isAboutToQuit() const { return _aboutToQuit; }
 
+protected:
+  virtual void quit();
+
 private:
   bool _aboutToQuit;
 };