diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index d5ed52f199eb243dad6947563a49b0f901f1f649..764d7879d879a1d1ac4d2c2a1c98cf64c0fae552 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -798,6 +798,7 @@ void PluginManagerPrivate::nextDelayedInitialize() if (delayedInitializeQueue.isEmpty()) { delete delayedInitializeTimer; delayedInitializeTimer = 0; + emit q->initializationDone(); } else { delayedInitializeTimer->start(); } diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index 9e1cdcde87e1047dda038749982c93c0e958dff4..c1dfd861b9e6fd43b6ad24d75f190fe7f56e9edb 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -135,6 +135,7 @@ signals: void aboutToRemoveObject(QObject *obj); void pluginsChanged(); + void initializationDone(); public slots: void remoteArguments(const QString &serializedArguments); diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index 7d1fb44f8ac35718f615a5194c1f05e3ca770ef1..ba6c8c72925dc84c50154e17f0adf92b6da0f6b3 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -542,6 +542,8 @@ void SettingsDialog::done(int val) settings->setValue(QLatin1String(categoryKeyC), m_currentCategory); settings->setValue(QLatin1String(pageKeyC), m_currentPage); + ICore::saveSettings(); // save all settings + // exit all additional event loops, see comment in execDialog() QListIterator<QEventLoop *> it(m_eventLoops); it.toBack(); diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 54762d9bc5a1ed9008993c6e14462da679422f86..c0d9eeced8aa0e5efb54bbe579e7e4cec817d37d 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1506,6 +1506,9 @@ void EditorManager::autoSave() if (!errors.isEmpty()) QMessageBox::critical(ICore::mainWindow(), tr("File Error"), errors.join(QLatin1String("\n"))); + + // Also save settings while accessing the disk anyway: + ICore::saveSettings(); } MakeWritableResult EditorManager::makeFileWritable(IDocument *document) diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index b9ad7f93015103ab4953d845026d8bbc87549e2e..0e1bca0846165197b4989ae0f2656a79ba25c5ac 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -30,6 +30,8 @@ #include "icore.h" +#include <extensionsystem/pluginmanager.h> + /*! \namespace Core \brief The Core namespace contains all classes that make up the Core plugin @@ -373,6 +375,9 @@ ICore::ICore(MainWindow *mainwindow) { m_instance = this; m_mainwindow = mainwindow; + // Save settings once after all plugins are initialized: + connect(ExtensionSystem::PluginManager::instance(), SIGNAL(initializationDone()), + this, SIGNAL(saveSettingsRequested())); } ICore::~ICore() @@ -553,4 +558,12 @@ void ICore::emitNewItemsDialogRequested() emit m_instance->newItemsDialogRequested(); } +void ICore::saveSettings() +{ + emit m_instance->saveSettingsRequested(); + + ICore::settings(QSettings::SystemScope)->sync(); + ICore::settings(QSettings::UserScope)->sync(); +} + } // namespace Core diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h index a954b6f76a1b93896f1f87b0f828281b2ea2e085..a7be701e214132effbeb6cb381533583c0952b60 100644 --- a/src/plugins/coreplugin/icore.h +++ b/src/plugins/coreplugin/icore.h @@ -134,6 +134,8 @@ public: static void emitNewItemsDialogRequested(); + static void saveSettings(); + signals: void coreAboutToOpen(); void coreOpened(); diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 03ea45e3d7e9102c423980edfacdf80660d4bbf5..fffab92b842d44c33485dcd3d8c9c0f8498585cc 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -233,11 +233,6 @@ MainWindow::MainWindow() : #if defined(Q_OS_MAC) MacFullScreen::addFullScreen(this); #endif - - m_autoSaveSessionTimer = new QTimer(this); - m_autoSaveSessionTimer->setInterval(10000); - connect(m_autoSaveSessionTimer, SIGNAL(timeout()), - m_coreImpl, SIGNAL(saveSettingsRequested())); } void MainWindow::setSidebarVisible(bool visible) @@ -377,13 +372,11 @@ void MainWindow::extensionsInitialized() emit m_coreImpl->coreAboutToOpen(); show(); emit m_coreImpl->coreOpened(); - m_autoSaveSessionTimer->start(); } void MainWindow::closeEvent(QCloseEvent *event) { - m_autoSaveSessionTimer->stop(); - emit m_coreImpl->saveSettingsRequested(); + ICore::saveSettings(); // Save opened files bool cancelled; @@ -979,7 +972,6 @@ bool MainWindow::showOptionsDialog(const QString &category, void MainWindow::saveAll() { DocumentManager::saveModifiedDocumentsSilently(DocumentManager::modifiedDocuments()); - emit m_coreImpl->saveSettingsRequested(); } void MainWindow::exit() diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h index 8a6c5ef35021491082a46c06ccd60e286fc77088..fcfc7fab5ee5777fe18f7cb57d04f38bf6867d83 100644 --- a/src/plugins/coreplugin/mainwindow.h +++ b/src/plugins/coreplugin/mainwindow.h @@ -229,7 +229,6 @@ private: QColor m_overrideColor; QStringList m_filesToOpenDelayed; - QTimer *m_autoSaveSessionTimer; }; } // namespace Internal