From b7a96a9342adfdb65469c0f132af54aaeebfef01 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 8 Jul 2019 17:38:28 +0200 Subject: [PATCH] Core: Warn the user if the settings file cannot be read MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Do an initial check and if it fails, warn the user that they cannot expect subsequent operations to succeed. Task-number: QTCREATORBUG-18294 Change-Id: I3bb323cf7b7ed99f97258da94cfd7669f8520717 Reviewed-by: Eike Ziller Reviewed-by: André Hartmann --- src/plugins/coreplugin/coreplugin.cpp | 43 +++++++++++++++++++++++++++ src/plugins/coreplugin/coreplugin.h | 1 + 2 files changed, 44 insertions(+) diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 95398acc295..9145fabf372 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -27,6 +27,7 @@ #include "designmode.h" #include "editmode.h" #include "helpmanager.h" +#include "icore.h" #include "idocument.h" #include "infobar.h" #include "iwizardfactory.h" @@ -63,6 +64,8 @@ #include #include #include +#include +#include #include #include @@ -232,6 +235,7 @@ void CorePlugin::extensionsInitialized() errorOverview->setModal(true); errorOverview->show(); } + checkSettings(); } bool CorePlugin::delayedInitialize() @@ -295,6 +299,45 @@ void CorePlugin::addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QM menu->insertSeparator(firstAction); } +void CorePlugin::checkSettings() +{ + const auto showMsgBox = [this](const QString &msg, QMessageBox::Icon icon) { + connect(ICore::instance(), &ICore::coreOpened, this, [msg, icon]() { + QMessageBox msgBox(ICore::dialogParent()); + msgBox.setWindowTitle(tr("Settings File Error")); + msgBox.setText(msg); + msgBox.setIcon(icon); + msgBox.exec(); + }, Qt::QueuedConnection); + }; + const QSettings * const userSettings = ICore::settings(); + QString errorDetails; + switch (userSettings->status()) { + case QSettings::NoError: { + const QFileInfo fi(userSettings->fileName()); + if (fi.exists() && !fi.isWritable()) { + const QString errorMsg = tr("The settings file \"%1\" is not writable.\n" + "You will not be able to store any %2 settings.") + .arg(QDir::toNativeSeparators(userSettings->fileName()), + QLatin1String(Core::Constants::IDE_DISPLAY_NAME)); + showMsgBox(errorMsg, QMessageBox::Warning); + } + return; + } + case QSettings::AccessError: + errorDetails = tr("The file is not readable."); + break; + case QSettings::FormatError: + errorDetails = tr("The file is invalid."); + break; + } + const QString errorMsg = tr("Error reading settings file \"%1\": %2\n" + "You will likely experience further problems using this instance of %3.") + .arg(QDir::toNativeSeparators(userSettings->fileName()), errorDetails, + QLatin1String(Core::Constants::IDE_DISPLAY_NAME)); + showMsgBox(errorMsg, QMessageBox::Critical); +} + ExtensionSystem::IPlugin::ShutdownFlag CorePlugin::aboutToShutdown() { Find::aboutToShutdown(); diff --git a/src/plugins/coreplugin/coreplugin.h b/src/plugins/coreplugin/coreplugin.h index 23494cbabdb..fee1458eabd 100644 --- a/src/plugins/coreplugin/coreplugin.h +++ b/src/plugins/coreplugin/coreplugin.h @@ -80,6 +80,7 @@ private slots: private: static void addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QMenu *menu); + void checkSettings(); MainWindow *m_mainWindow = nullptr; EditMode *m_editMode = nullptr;