From: Manuel Nickschas Date: Wed, 13 May 2009 21:16:27 +0000 (+0200) Subject: Properly save and restore the mainwindow state X-Git-Tag: 0.4.2~6 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=525d0aa9b754a04f3caaf3f00890894ea0208c46 Properly save and restore the mainwindow state 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). --- diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index a4be85d1..c7d1f8b7 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -132,15 +132,10 @@ MainWin::MainWin(QWidget *parent) QtUiApplication* app = qobject_cast 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() { - 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))); @@ -182,16 +177,15 @@ void MainWin::init() { QtUi::registerNotificationBackend(new KNotificationBackend(this)); #endif /* HAVE_KDE */ + setDisconnectedState(); // Disable menus and stuff + // 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()); - setDisconnectedState(); // Disable menus and stuff - - show(); - if(Quassel::runMode() != Quassel::Monolithic) { showCoreConnectionDlg(true); // autoconnect if appropriate } else { @@ -200,10 +194,40 @@ void MainWin::init() { } MainWin::~MainWin() { + +} + +void MainWin::aboutToQuit() { 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("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() { @@ -738,6 +762,28 @@ void MainWin::showShortcutsDlg() { } #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 qApp; @@ -751,12 +797,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) { @@ -784,6 +824,7 @@ void MainWin::hideToTray() { } hide(); systemTray()->setIconVisible(); + _isHidden = true; } void MainWin::toggleMinimizedToTray() { @@ -824,6 +865,7 @@ void MainWin::forceActivated() { show(); raise(); activateWindow(); + _isHidden = false; } void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) { @@ -943,6 +985,7 @@ void MainWin::on_actionDebugLog_triggered() { logWidget->show(); } +// FIXME void MainWin::saveStateToSession(const QString &sessionId) { return; SessionSettings s(sessionId); @@ -952,6 +995,7 @@ void MainWin::saveStateToSession(const QString &sessionId) { s.setValue("MainWinState", saveState()); } +// FIXME void MainWin::saveStateToSessionSettings(SessionSettings & s) { s.setValue("MainWinSize", size()); diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index c6d746a2..ac79a8d7 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -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(); } + void saveStateToSettings(UiSettings &); + void restoreStateFromSettings(UiSettings &); + 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); + void moveEvent(QMoveEvent *event); + void resizeEvent(QResizeEvent *event); protected slots: void connectedToCore(); @@ -129,6 +134,7 @@ class MainWin void connectOrDisconnectFromNet(); void saveStatusBarStatus(bool enabled); + void aboutToQuit(); void loadLayout(); void saveLayout(); @@ -177,11 +183,16 @@ class MainWin 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 + + friend class QtUi; }; SystemTray *MainWin::systemTray() const {