Git commit 2250385ea794b79d8b89d88a77e48f1c293e20b1 by Jan Kundr?t. Committed on 27/05/2013 at 00:06. Pushed by jkt into branch 'master'.
GUI: enable sizes and positions of various widgets Fully separate settings are maintained for the wide and compact layout modes. Nothing is saved/restored when in the one-at-time mode. M +2 -0 src/Common/SettingsNames.cpp M +1 -0 src/Common/SettingsNames.h M +108 -2 src/Gui/Window.cpp M +11 -1 src/Gui/Window.h http://commits.kde.org/trojita/2250385ea794b79d8b89d88a77e48f1c293e20b1 diff --git a/src/Common/SettingsNames.cpp b/src/Common/SettingsNames.cpp index 8769d0c..e06627f 100644 --- a/src/Common/SettingsNames.cpp +++ b/src/Common/SettingsNames.cpp @@ -82,6 +82,8 @@ QString SettingsNames::guiMainWindowLayoutCompact = QLatin1String("compact"); QString SettingsNames::guiMainWindowLayoutWide = QLatin1String("wide"); QString SettingsNames::guiMainWindowLayoutOneAtTime = QLatin1String("one-at-time"); QString SettingsNames::guiPreferPlaintextRendering = QLatin1String("gui/preferPlaintextRendering"); +QString SettingsNames::guiSizesInMainWinWhenCompact = QLatin1String("gui/sizeInMainWinWhenCompact-%1"); +QString SettingsNames::guiSizesInMainWinWhenWide = QLatin1String("gui/sizeInMainWinWhenWide-%1"); QString SettingsNames::appLoadHomepage = QLatin1String("app.updates.checkEnabled"); QString SettingsNames::knownEmailsKey = QLatin1String("addressBook/knownEmails"); diff --git a/src/Common/SettingsNames.h b/src/Common/SettingsNames.h index 6b17c65..291edcd 100644 --- a/src/Common/SettingsNames.h +++ b/src/Common/SettingsNames.h @@ -45,6 +45,7 @@ struct SettingsNames { static QString guiMailboxListShowOnlySubscribed; static QString guiPreferPlaintextRendering; static QString guiMainWindowLayout, guiMainWindowLayoutCompact, guiMainWindowLayoutWide, guiMainWindowLayoutOneAtTime; + static QString guiSizesInMainWinWhenCompact, guiSizesInMainWinWhenWide; static QString appLoadHomepage; static QString knownEmailsKey; }; diff --git a/src/Gui/Window.cpp b/src/Gui/Window.cpp index 18552af..2dbd02b 100644 --- a/src/Gui/Window.cpp +++ b/src/Gui/Window.cpp @@ -99,7 +99,7 @@ enum { }; MainWindow::MainWindow(): QMainWindow(), model(0), - m_mainHSplitter(0), m_mainVSplitter(0), m_mainStack(0), m_layoutMode(LAYOUT_COMPACT), + m_mainHSplitter(0), m_mainVSplitter(0), m_mainStack(0), m_layoutMode(LAYOUT_COMPACT), m_skipSavingOfUI(true), m_actionSortNone(0), m_ignoreStoredPassword(false) { qRegisterMetaType<QList<QSslCertificate> >(); @@ -134,7 +134,6 @@ MainWindow::MainWindow(): QMainWindow(), model(0), recoverDrafts(); - desktopGeometryChanged(); if (m_actionLayoutWide->isEnabled() && QSettings().value(Common::SettingsNames::guiMainWindowLayout) == Common::SettingsNames::guiMainWindowLayoutWide) { m_actionLayoutWide->trigger(); @@ -155,6 +154,7 @@ MainWindow::MainWindow(): QMainWindow(), model(0), delayedResize->setInterval(3000); connect(delayedResize, SIGNAL(timeout()), this, SLOT(desktopGeometryChanged())); connect(qApp->desktop(), SIGNAL(resized(int)), delayedResize, SLOT(start())); + m_skipSavingOfUI = false; } void MainWindow::defineActions() @@ -203,6 +203,7 @@ void MainWindow::createActions() // new: Ctrl+N m_mainToolbar = addToolBar(tr("Navigation")); + m_mainToolbar->setObjectName(QLatin1String("mainToolbar")); reloadMboxList = new QAction(style()->standardIcon(QStyle::SP_ArrowRight), tr("&Update List of Child Mailboxes"), this); connect(reloadMboxList, SIGNAL(triggered()), this, SLOT(slotReloadMboxList())); @@ -550,6 +551,7 @@ void MainWindow::createWidgets() } allDock = new QDockWidget("Everything", this); + allDock->setObjectName(QLatin1String("allDock")); allTree = new QTreeView(allDock); allDock->hide(); allTree->setUniformRowHeights(true); @@ -557,6 +559,7 @@ void MainWindow::createWidgets() allDock->setWidget(allTree); addDockWidget(Qt::LeftDockWidgetArea, allDock); taskDock = new QDockWidget("IMAP Tasks", this); + taskDock->setObjectName("taskDock"); taskTree = new QTreeView(taskDock); taskDock->hide(); taskTree->setHeaderHidden(true); @@ -564,6 +567,7 @@ void MainWindow::createWidgets() addDockWidget(Qt::LeftDockWidgetArea, taskDock); imapLoggerDock = new QDockWidget(tr("IMAP Protocol"), this); + imapLoggerDock->setObjectName(QLatin1String("imapLoggerDock")); imapLogger = new ProtocolLoggerWidget(imapLoggerDock); imapLoggerDock->hide(); imapLoggerDock->setWidget(imapLogger); @@ -1912,12 +1916,15 @@ void MainWindow::slotUpdateWindowTitle() void MainWindow::slotLayoutCompact() { + saveSizesAndState(); if (!m_mainHSplitter) { m_mainHSplitter = new QSplitter(); + connect(m_mainHSplitter, SIGNAL(splitterMoved(int,int)), this, SLOT(saveSizesAndState())); } if (!m_mainVSplitter) { m_mainVSplitter = new QSplitter(); m_mainVSplitter->setOrientation(Qt::Vertical); + connect(m_mainVSplitter, SIGNAL(splitterMoved(int,int)), this, SLOT(saveSizesAndState())); } m_mainVSplitter->addWidget(msgListWidget); @@ -1943,12 +1950,15 @@ void MainWindow::slotLayoutCompact() m_layoutMode = LAYOUT_COMPACT; QSettings().setValue(Common::SettingsNames::guiMainWindowLayout, Common::SettingsNames::guiMainWindowLayoutCompact); + applySizesAndState(); } void MainWindow::slotLayoutWide() { + saveSizesAndState(); if (!m_mainHSplitter) { m_mainHSplitter = new QSplitter(); + connect(m_mainHSplitter, SIGNAL(splitterMoved(int,int)), this, SLOT(saveSizesAndState())); } m_mainHSplitter->addWidget(mboxTree); @@ -1971,10 +1981,12 @@ void MainWindow::slotLayoutWide() m_layoutMode = LAYOUT_WIDE; QSettings().setValue(Common::SettingsNames::guiMainWindowLayout, Common::SettingsNames::guiMainWindowLayoutWide); + applySizesAndState(); } void MainWindow::slotLayoutOneAtTime() { + saveSizesAndState(); if (m_mainStack) return; @@ -2001,6 +2013,7 @@ void MainWindow::slotLayoutOneAtTime() m_layoutMode = LAYOUT_ONE_AT_TIME; QSettings().setValue(Common::SettingsNames::guiMainWindowLayout, Common::SettingsNames::guiMainWindowLayoutOneAtTime); + applySizesAndState(); } void MainWindow::slotOneAtTimeGoBack() @@ -2052,6 +2065,99 @@ void MainWindow::desktopGeometryChanged() if (m_layoutMode == LAYOUT_WIDE && !m_actionLayoutWide->isEnabled()) { m_actionLayoutCompact->trigger(); } + saveSizesAndState(); +} + +void MainWindow::saveSizesAndState() +{ + saveSizesAndState(m_layoutMode); +} + +QString MainWindow::settingsKeyForLayout(const LayoutMode layout) +{ + switch (layout) { + case LAYOUT_COMPACT: + return Common::SettingsNames::guiSizesInMainWinWhenCompact; + case LAYOUT_WIDE: + return Common::SettingsNames::guiSizesInMainWinWhenWide; + case LAYOUT_ONE_AT_TIME: + // nothing is saved here + break; + } + return QString(); +} + +void MainWindow::saveSizesAndState(const LayoutMode oldMode) +{ + if (m_skipSavingOfUI) + return; + + QRect geometry = qApp->desktop()->availableGeometry(this); + QString key = settingsKeyForLayout(oldMode); + if (key.isEmpty()) + return; + + QList<QByteArray> items; + items << saveGeometry(); + items << saveState(); + items << (m_mainVSplitter ? m_mainVSplitter->saveState() : QByteArray()); + items << (m_mainHSplitter ? m_mainHSplitter->saveState() : QByteArray()); + QByteArray buf; + QDataStream stream(&buf, QIODevice::WriteOnly); + stream << items.size(); + Q_FOREACH(const QByteArray &item, items) { + stream << item; + } + + QSettings s; + s.setValue(key.arg(QString::number(geometry.width())), buf); +} + +void MainWindow::applySizesAndState() +{ + QRect geometry = qApp->desktop()->availableGeometry(this); + QString key = settingsKeyForLayout(m_layoutMode); + if (key.isEmpty()) + return; + + QSettings s; + QByteArray buf = s.value(key.arg(QString::number(geometry.width()))).toByteArray(); + if (buf.isEmpty()) + return; + + int size; + QDataStream stream(&buf, QIODevice::ReadOnly); + stream >> size; + QByteArray item; + + if (size-- && !stream.atEnd()) { + stream >> item; + restoreGeometry(item); + } + + if (size-- && !stream.atEnd()) { + stream >> item; + restoreState(item); + } + + if (size-- && !stream.atEnd()) { + stream >> item; + if (m_mainVSplitter) { + m_mainVSplitter->restoreState(item); + } + } + + if (size-- && !stream.atEnd()) { + stream >> item; + if (m_mainHSplitter) { + m_mainHSplitter->restoreState(item); + } + } +} + +void MainWindow::resizeEvent(QResizeEvent *) +{ + saveSizesAndState(); } } diff --git a/src/Gui/Window.h b/src/Gui/Window.h index 9e7371a..8914079 100644 --- a/src/Gui/Window.h +++ b/src/Gui/Window.h @@ -77,6 +77,8 @@ class MainWindow: public QMainWindow { Q_OBJECT typedef QList<QPair<Composer::RecipientKind,QString> > RecipientsType; + + typedef enum { LAYOUT_COMPACT, LAYOUT_WIDE, LAYOUT_ONE_AT_TIME } LayoutMode; public: MainWindow(); ComposeWidget *invokeComposeDialog(const QString &subject = QString(), const QString &body = QString(), @@ -164,9 +166,14 @@ private slots: void slotLayoutOneAtTime(); void slotOneAtTimeGoBack(); void slotOneAtTimeGoDeeper(); + void saveSizesAndState(const LayoutMode oldMode); + void saveSizesAndState(); void desktopGeometryChanged(); +protected: + void resizeEvent(QResizeEvent *); + private: void defineActions(); void createMenus(); @@ -182,6 +189,8 @@ private: void updateActionsOnlineOffline(bool online); void migrateSettings(); + void applySizesAndState(); + QString settingsKeyForLayout(const LayoutMode layout); void recoverDrafts(); @@ -209,7 +218,8 @@ private: QPointer<QSplitter> m_mainVSplitter; QPointer<QStackedWidget> m_mainStack; - enum { LAYOUT_COMPACT, LAYOUT_WIDE, LAYOUT_ONE_AT_TIME } m_layoutMode; + LayoutMode m_layoutMode; + bool m_skipSavingOfUI; QAction *reloadMboxList; QAction *reloadAllMailboxes;
