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 <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2018-09-18 12:28:48 +02:00
parent 414c7f9f1e
commit df08e1ee3d
2 changed files with 87 additions and 68 deletions

View File

@@ -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<BaseSettings *> &settings);
QList<BaseSettings *> settings() const { return m_settings; }
enum Columns {
DisplayNameColumn = 0,
@@ -85,7 +84,7 @@ public:
};
private:
QList<BaseSettings *> m_settings;
QList<BaseSettings *> m_settings; // owned
};
class LanguageClientSettingsPageWidget : public QWidget
@@ -115,7 +114,8 @@ public:
void finish() override;
private:
LanguageClientSettingsModel m_settings;
LanguageClientSettingsModel m_model;
QList<BaseSettings *> m_settings; // owned
QPointer<LanguageClientSettingsPageWidget> 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<BaseClient *> interfaces(LanguageClientManager::clients());
QVector<BaseClient *> toShutdown;
QList<BaseSettings *> 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<BaseSettings *> &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<BaseClient *> interfaces(LanguageClientManager::clients());
QVector<BaseClient *> toShutdown;
QList<BaseSettings *> 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<BaseSettings *> 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<BaseSettings *> &languageClientSettings)
{
settings->beginGroup(settingsGroupKey);
settings->setValue(clientsKey, Utils::transform(languageClientSettings,
[](const BaseSettings *setting){
return QVariant(setting->toMap());
}));
settings->endGroup();
}
} // namespace LanguageClient

View File

@@ -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<BaseSettings *> fromSettings(QSettings *settings);
static void toSettings(QSettings *settings, const QList<BaseSettings *> &languageClientSettings);
};
} // namespace LanguageClient