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).
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()));
- 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)));
QtUi::registerNotificationBackend(new KNotificationBackend(this));
#endif /* HAVE_KDE */
QtUi::registerNotificationBackend(new KNotificationBackend(this));
#endif /* HAVE_KDE */
+ setDisconnectedState(); // Disable menus and stuff
+
- 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 {
+
+}
+
+void MainWin::aboutToQuit() {
- 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() {
+/********************************************************************************************************/
+
+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;
-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) {
}
hide();
systemTray()->setIconVisible();
}
hide();
systemTray()->setIconVisible();
}
void MainWin::toggleMinimizedToTray() {
}
void MainWin::toggleMinimizedToTray() {
show();
raise();
activateWindow();
show();
raise();
activateWindow();
}
void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
}
void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
void MainWin::saveStateToSession(const QString &sessionId) {
return;
SessionSettings s(sessionId);
void MainWin::saveStateToSession(const QString &sessionId) {
return;
SessionSettings s(sessionId);
s.setValue("MainWinState", saveState());
}
s.setValue("MainWinState", saveState());
}
void MainWin::saveStateToSessionSettings(SessionSettings & s)
{
s.setValue("MainWinSize", size());
void MainWin::saveStateToSessionSettings(SessionSettings & s)
{
s.setValue("MainWinSize", size());
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);
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();
void connectOrDisconnectFromNet();
void saveStatusBarStatus(bool enabled);
void connectOrDisconnectFromNet();
void saveStatusBarStatus(bool enabled);
void loadLayout();
void saveLayout();
void loadLayout();
void saveLayout();
QToolBar *_mainToolBar, *_chatViewToolBar, *_nickToolBar;
QWidget *_awayLog;
QToolBar *_mainToolBar, *_chatViewToolBar, *_nickToolBar;
QWidget *_awayLog;
+
+ 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
};
SystemTray *MainWin::systemTray() const {
};
SystemTray *MainWin::systemTray() const {