Properly save and restore the mainwindow state
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 13 May 2009 21:16:27 +0000 (23:16 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 13 May 2009 21:16:27 +0000 (23:16 +0200)
We now save size, position, maximize, minimize and hidden-to-tray on exit
and restore it at next start. Since Qt's restoreState() has some issues, I had
to workaround things a bit, so please test on your system and report if there are
still problems with the current implementation!

Fixes #677, fixes #452 (since the state is remembered, so just quit Quassel using the
tray context menu while it's hidden).

src/qtui/mainwin.cpp
src/qtui/mainwin.h

index 3a3a3fe..122b476 100644 (file)
@@ -134,15 +134,10 @@ MainWin::MainWin(QWidget *parent)
   QtUiApplication* app = qobject_cast<QtUiApplication*> qApp;
   connect(app, SIGNAL(saveStateToSession(const QString&)), SLOT(saveStateToSession(const QString&)));
   connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), SLOT(saveStateToSessionSettings(SessionSettings&)));
   QtUiApplication* app = qobject_cast<QtUiApplication*> qApp;
   connect(app, SIGNAL(saveStateToSession(const QString&)), SLOT(saveStateToSession(const QString&)));
   connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), SLOT(saveStateToSessionSettings(SessionSettings&)));
+  connect(app, SIGNAL(aboutToQuit()), SLOT(aboutToQuit()));
 }
 
 void MainWin::init() {
 }
 
 void MainWin::init() {
-  QtUiSettings s;
-  if(s.value("MainWinSize").isValid())
-    resize(s.value("MainWinSize").toSize());
-  else
-    resize(QSize(800, 500));
-
   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(QApplication::instance(), SIGNAL(aboutToQuit()), SLOT(saveLayout()));
   connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(clientNetworkCreated(NetworkId)));
   connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(clientNetworkRemoved(NetworkId)));
@@ -184,16 +179,15 @@ void MainWin::init() {
   QtUi::registerNotificationBackend(new KNotificationBackend(this));
 #endif /* HAVE_KDE */
 
   QtUi::registerNotificationBackend(new KNotificationBackend(this));
 #endif /* HAVE_KDE */
 
+  setDisconnectedState();  // Disable menus and stuff
+
   // restore mainwin state
   // restore mainwin state
-  restoreState(s.value("MainWinState").toByteArray());
+  QtUiSettings s;
+  restoreStateFromSettings(s);
 
   // restore locked state of docks
   QtUi::actionCollection("General")->action("LockLayout")->setChecked(s.value("LockLayout", false).toBool());
 
 
   // restore locked state of docks
   QtUi::actionCollection("General")->action("LockLayout")->setChecked(s.value("LockLayout", false).toBool());
 
-  setDisconnectedState();  // Disable menus and stuff
-
-  show();
-
   if(Quassel::runMode() != Quassel::Monolithic) {
     showCoreConnectionDlg(true); // autoconnect if appropriate
   } else {
   if(Quassel::runMode() != Quassel::Monolithic) {
     showCoreConnectionDlg(true); // autoconnect if appropriate
   } else {
@@ -202,10 +196,40 @@ void MainWin::init() {
 }
 
 MainWin::~MainWin() {
 }
 
 MainWin::~MainWin() {
+
+}
+
+void MainWin::aboutToQuit() {
   QtUiSettings s;
   QtUiSettings s;
-  s.setValue("MainWinSize", size());
-  s.setValue("MainWinPos", pos());
+  saveStateToSettings(s);
+}
+
+void MainWin::saveStateToSettings(UiSettings &s) {
+  s.setValue("MainWinSize", _normalSize);
+  s.setValue("MainWinPos", _normalPos);
   s.setValue("MainWinState", saveState());
   s.setValue("MainWinState", saveState());
+  s.setValue("MainWinGeometry", saveGeometry());
+  s.setValue("MainWinMinimized", isMinimized());
+  s.setValue("MainWinHidden", _isHidden);
+}
+
+void MainWin::restoreStateFromSettings(UiSettings &s) {
+  restoreGeometry(s.value("MainWinGeometry").toByteArray());
+  if(isMaximized()) {
+    // restoreGeometry() fails if the windows was maximized, so we resize and position explicitly
+    resize(s.value("MainWinSize", QSize(800, 500)).toSize());
+    move(s.value("MainWinPos").toPoint());
+  }
+
+  restoreState(s.value("MainWinState").toByteArray());
+
+  _isHidden = false;
+  if(s.value("MainWinHidden").toBool())
+    hideToTray();
+  else if(s.value("MainWinMinimized").toBool())
+    showMinimized();
+  else
+    show();
 }
 
 void MainWin::updateIcon() {
 }
 
 void MainWin::updateIcon() {
@@ -773,6 +797,28 @@ void MainWin::showShortcutsDlg() {
 }
 #endif
 
 }
 #endif
 
+/********************************************************************************************************/
+
+bool MainWin::event(QEvent *event) {
+  if(event->type() == QEvent::WindowActivate)
+    QtUi::closeNotifications();
+  return QMainWindow::event(event);
+}
+
+void MainWin::moveEvent(QMoveEvent *event) {
+  if(!(windowState() & Qt::WindowMaximized))
+    _normalPos = event->pos();
+
+  event->ignore();
+}
+
+void MainWin::resizeEvent(QResizeEvent *event) {
+  if(!(windowState() & Qt::WindowMaximized))
+    _normalSize = event->size();
+
+  event->ignore();
+}
+
 void MainWin::closeEvent(QCloseEvent *event) {
   QtUiSettings s;
   QtUiApplication* app = qobject_cast<QtUiApplication*> qApp;
 void MainWin::closeEvent(QCloseEvent *event) {
   QtUiSettings s;
   QtUiApplication* app = qobject_cast<QtUiApplication*> qApp;
@@ -786,12 +832,6 @@ void MainWin::closeEvent(QCloseEvent *event) {
   }
 }
 
   }
 }
 
-bool MainWin::event(QEvent *event) {
-  if(event->type() == QEvent::WindowActivate)
-    QtUi::closeNotifications();
-  return QMainWindow::event(event);
-}
-
 void MainWin::changeEvent(QEvent *event) {
   if(event->type() == QEvent::WindowStateChange) {
     if(windowState() & Qt::WindowMinimized) {
 void MainWin::changeEvent(QEvent *event) {
   if(event->type() == QEvent::WindowStateChange) {
     if(windowState() & Qt::WindowMinimized) {
@@ -819,6 +859,7 @@ void MainWin::hideToTray() {
   }
   hide();
   systemTray()->setIconVisible();
   }
   hide();
   systemTray()->setIconVisible();
+  _isHidden = true;
 }
 
 void MainWin::toggleMinimizedToTray() {
 }
 
 void MainWin::toggleMinimizedToTray() {
@@ -859,6 +900,7 @@ void MainWin::forceActivated() {
   show();
   raise();
   activateWindow();
   show();
   raise();
   activateWindow();
+  _isHidden = false;
 }
 
 void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
 }
 
 void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
@@ -1006,6 +1048,7 @@ void MainWin::on_actionDebugLog_triggered() {
   logWidget->show();
 }
 
   logWidget->show();
 }
 
+// FIXME
 void MainWin::saveStateToSession(const QString &sessionId) {
   return;
   SessionSettings s(sessionId);
 void MainWin::saveStateToSession(const QString &sessionId) {
   return;
   SessionSettings s(sessionId);
@@ -1015,6 +1058,7 @@ void MainWin::saveStateToSession(const QString &sessionId) {
   s.setValue("MainWinState", saveState());
 }
 
   s.setValue("MainWinState", saveState());
 }
 
+// FIXME
 void MainWin::saveStateToSessionSettings(SessionSettings & s)
 {
   s.setValue("MainWinSize", size());
 void MainWin::saveStateToSessionSettings(SessionSettings & s)
 {
   s.setValue("MainWinSize", size());
index 86c8de0..13b5466 100644 (file)
@@ -79,6 +79,9 @@ class MainWin
     static void flagRemoteCoreOnly(QObject *object) { object->setProperty("REMOTE_CORE_ONLY", true); }
     static bool isRemoteCoreOnly(QObject *object) { return object->property("REMOTE_CORE_ONLY").toBool(); }
 
     static void flagRemoteCoreOnly(QObject *object) { object->setProperty("REMOTE_CORE_ONLY", true); }
     static bool isRemoteCoreOnly(QObject *object) { return object->property("REMOTE_CORE_ONLY").toBool(); }
 
+    void saveStateToSettings(UiSettings &);
+    void restoreStateFromSettings(UiSettings &);
+
   public slots:
     void saveStateToSession(const QString &sessionId);
     void saveStateToSessionSettings(SessionSettings &s);
   public slots:
     void saveStateToSession(const QString &sessionId);
     void saveStateToSessionSettings(SessionSettings &s);
@@ -92,6 +95,8 @@ class MainWin
   protected:
     void closeEvent(QCloseEvent *event);
     void changeEvent(QEvent *event);
   protected:
     void closeEvent(QCloseEvent *event);
     void changeEvent(QEvent *event);
+    void moveEvent(QMoveEvent *event);
+    void resizeEvent(QResizeEvent *event);
 
   protected slots:
     void connectedToCore();
 
   protected slots:
     void connectedToCore();
@@ -130,6 +135,7 @@ class MainWin
     void connectOrDisconnectFromNet();
 
     void saveStatusBarStatus(bool enabled);
     void connectOrDisconnectFromNet();
 
     void saveStatusBarStatus(bool enabled);
+    void aboutToQuit();
 
     void loadLayout();
     void saveLayout();
 
     void loadLayout();
     void saveLayout();
@@ -180,11 +186,16 @@ class MainWin
     QToolBar *_mainToolBar, *_chatViewToolBar, *_nickToolBar;
 
     QWidget *_awayLog;
     QToolBar *_mainToolBar, *_chatViewToolBar, *_nickToolBar;
 
     QWidget *_awayLog;
-    friend class QtUi;
+
+    QSize _normalSize; //!< Size of the non-maximized window
+    QPoint _normalPos; //!< Position of the non-maximized window
+    bool _isHidden;
 
 #ifdef Q_WS_WIN
     DWORD dwTickCount;
 #endif
 
 #ifdef Q_WS_WIN
     DWORD dwTickCount;
 #endif
+
+    friend class QtUi;
 };
 
 SystemTray *MainWin::systemTray() const {
 };
 
 SystemTray *MainWin::systemTray() const {