From df08e1ee3d1f1b9021ecfa61664ffd450be46029 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 18 Sep 2018 12:28:48 +0200 Subject: LSP: Store settings in the settingspage ... and keep just a copy of it in the model. This way we can easily reset the setting model content to a preedit state without rereading it from the user settings file. Change-Id: Id2f094caade7c56eff48fd9abce00d687e607a39 Reviewed-by: Christian Stenger --- .../languageclient/languageclientsettings.cpp | 140 ++++++++++++--------- .../languageclient/languageclientsettings.h | 15 ++- 2 files changed, 87 insertions(+), 68 deletions(-) (limited to 'src') diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index 6b23f38e7c..5fcd7b683e 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -59,6 +59,7 @@ class LanguageClientSettingsModel : public QAbstractTableModel { public: LanguageClientSettingsModel() = default; + ~LanguageClientSettingsModel(); // QAbstractItemModel interface int rowCount(const QModelIndex &/*parent*/ = QModelIndex()) const override { return m_settings.count(); } @@ -70,10 +71,8 @@ public: bool setData(const QModelIndex &index, const QVariant &value, int role) override; Qt::ItemFlags flags(const QModelIndex &index) const override; - void toSettings(QSettings *settings) const; - void fromSettings(QSettings *settings); - - void applyChanges(); + void reset(const QList &settings); + QList settings() const { return m_settings; } enum Columns { DisplayNameColumn = 0, @@ -85,7 +84,7 @@ public: }; private: - QList m_settings; + QList m_settings; // owned }; class LanguageClientSettingsPageWidget : public QWidget @@ -115,7 +114,8 @@ public: void finish() override; private: - LanguageClientSettingsModel m_settings; + LanguageClientSettingsModel m_model; + QList m_settings; // owned QPointer m_widget; }; @@ -209,30 +209,67 @@ LanguageClientSettingsPage::~LanguageClientSettingsPage() { if (m_widget) delete m_widget; + qDeleteAll(m_settings); } void LanguageClientSettingsPage::init() { - m_settings.fromSettings(Core::ICore::settings()); - m_settings.applyChanges(); + m_model.reset(LanguageClientSettings::fromSettings(Core::ICore::settings())); + apply(); } QWidget *LanguageClientSettingsPage::widget() { if (!m_widget) - m_widget = new LanguageClientSettingsPageWidget(m_settings); + m_widget = new LanguageClientSettingsPageWidget(m_model); return m_widget; } void LanguageClientSettingsPage::apply() { - m_settings.toSettings(Core::ICore::settings()); - m_settings.applyChanges(); + qDeleteAll(m_settings); + m_settings = Utils::transform(m_model.settings(), [](const BaseSettings *other){ + return new BaseSettings(*other); + }); + LanguageClientSettings::toSettings(Core::ICore::settings(), m_settings); + + const QVector interfaces(LanguageClientManager::clients()); + QVector toShutdown; + QList toStart = m_settings; + // check currently registered interfaces + for (auto interface : interfaces) { + auto setting = Utils::findOr(m_settings, nullptr, + [interface](const BaseSettings *setting){ + return interface->matches(setting); + }); + if (setting && setting->isValid() && setting->m_enabled) { + toStart.removeAll(setting); + if (!interface->isSupportedMimeType(setting->m_mimeType)) + interface->setSupportedMimeType({setting->m_mimeType}); + } else { + toShutdown << interface; + } + } + for (auto interface : toShutdown) { + if (interface->reachable()) + interface->shutdown(); + else + LanguageClientManager::deleteClient(interface); + } + for (auto setting : toStart) { + if (setting && setting->isValid() && setting->m_enabled) + LanguageClientManager::startClient(setting->createClient()); + } } void LanguageClientSettingsPage::finish() { - m_settings.fromSettings(Core::ICore::settings()); + m_model.reset(m_settings); +} + +LanguageClientSettingsModel::~LanguageClientSettingsModel() +{ + qDeleteAll(m_settings); } QVariant LanguageClientSettingsModel::data(const QModelIndex &index, int role) const @@ -326,58 +363,14 @@ Qt::ItemFlags LanguageClientSettingsModel::flags(const QModelIndex &index) const return defaultFlags; } -void LanguageClientSettingsModel::toSettings(QSettings *settings) const +void LanguageClientSettingsModel::reset(const QList &settings) { - settings->beginGroup(settingsGroupKey); - settings->setValue(clientsKey, Utils::transform(m_settings, - [](const BaseSettings *setting){ - return QVariant(setting->toMap()); - })); - settings->endGroup(); -} - -void LanguageClientSettingsModel::fromSettings(QSettings *settings) -{ - settings->beginGroup(settingsGroupKey); - auto variants = settings->value(clientsKey).toList(); - m_settings.reserve(variants.size()); - m_settings = Utils::transform(variants, [](const QVariant& var){ - auto settings = new BaseSettings(); - settings->fromMap(var.toMap()); - return settings; + beginResetModel(); + qDeleteAll(m_settings); + m_settings = Utils::transform(settings, [](const BaseSettings *setting){ + return new BaseSettings(*setting); }); - settings->endGroup(); -} - -void LanguageClientSettingsModel::applyChanges() -{ - const QVector interfaces(LanguageClientManager::clients()); - QVector toShutdown; - QList toStart = m_settings; - // check currently registered interfaces - for (auto interface : interfaces) { - auto setting = Utils::findOr(m_settings, nullptr, - [interface](const BaseSettings *setting){ - return interface->matches(setting); - }); - if (setting && setting->isValid() && setting->m_enabled) { - toStart.removeAll(setting); - if (!interface->isSupportedMimeType(setting->m_mimeType)) - interface->setSupportedMimeType({setting->m_mimeType}); - } else { - toShutdown << interface; - } - } - for (auto interface : toShutdown) { - if (interface->reachable()) - interface->shutdown(); - else - LanguageClientManager::deleteClient(interface); - } - for (auto setting : toStart) { - if (setting && setting->isValid() && setting->m_enabled) - LanguageClientManager::startClient(setting->createClient()); - } + endResetModel(); } bool BaseSettings::isValid() @@ -420,4 +413,27 @@ void LanguageClientSettings::init() settingsPage.init(); } +QList LanguageClientSettings::fromSettings(QSettings *settingsIn) +{ + settingsIn->beginGroup(settingsGroupKey); + auto variants = settingsIn->value(clientsKey).toList(); + auto settings = Utils::transform(variants, [](const QVariant& var){ + auto settings = new BaseSettings(); + settings->fromMap(var.toMap()); + return settings; + }); + settingsIn->endGroup(); + return settings; +} + +void LanguageClientSettings::toSettings(QSettings *settings, const QList &languageClientSettings) +{ + settings->beginGroup(settingsGroupKey); + settings->setValue(clientsKey, Utils::transform(languageClientSettings, + [](const BaseSettings *setting){ + return QVariant(setting->toMap()); + })); + settings->endGroup(); +} + } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientsettings.h b/src/plugins/languageclient/languageclientsettings.h index 0671092928..00cc3d68f0 100644 --- a/src/plugins/languageclient/languageclientsettings.h +++ b/src/plugins/languageclient/languageclientsettings.h @@ -37,12 +37,6 @@ constexpr char noLanguageFilter[] = "No Filter"; class BaseClient; -class LanguageClientSettings -{ -public: - static void init(); -}; - class BaseSettings { public: @@ -69,4 +63,13 @@ public: void fromMap(const QVariantMap &map); }; +class LanguageClientSettings +{ +public: + static void init(); + static QList fromSettings(QSettings *settings); + static void toSettings(QSettings *settings, const QList &languageClientSettings); + +}; + } // namespace LanguageClient -- cgit v1.2.1