diff options
Diffstat (limited to 'src/plugins/languageclient/languageclientsettings.cpp')
-rw-r--r-- | src/plugins/languageclient/languageclientsettings.cpp | 134 |
1 files changed, 86 insertions, 48 deletions
diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index 38c5a46159..4176918015 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -25,6 +25,7 @@ #include <utils/delegates.h> #include <utils/fancylineedit.h> #include <utils/jsontreeitem.h> +#include <utils/layoutbuilder.h> #include <utils/macroexpander.h> #include <utils/mimeconstants.h> #include <utils/stringutils.h> @@ -39,6 +40,7 @@ #include <QDialogButtonBox> #include <QDir> #include <QFileInfo> +#include <QFormLayout> #include <QGroupBox> #include <QHeaderView> #include <QJsonDocument> @@ -184,6 +186,8 @@ LanguageClientSettingsPageWidget::LanguageClientSettingsPageWidget(LanguageClien auto addMenu = new QMenu(this); addMenu->clear(); for (const ClientType &type : clientTypes()) { + if (!type.userAddable) + continue; auto action = new QAction(type.name, this); connect(action, &QAction::triggered, this, [this, id = type.id]() { addItem(id); }); addMenu->addAction(action); @@ -603,6 +607,27 @@ void LanguageClientSettings::init() LanguageClientManager::applySettings(); } +QList<Utils::Store> LanguageClientSettings::storesBySettingsType(Utils::Id settingsTypeId) +{ + QList<Utils::Store> result; + + QtcSettings *settingsIn = Core::ICore::settings(); + settingsIn->beginGroup(settingsGroupKey); + + for (const QVariantList &varList : + {settingsIn->value(clientsKey).toList(), settingsIn->value(typedClientsKey).toList()}) { + for (const QVariant &var : varList) { + const Store store = storeFromVariant(var); + if (settingsTypeId == Id::fromSetting(store.value(typeIdKey))) + result << store; + } + } + + settingsIn->endGroup(); + + return result; +} + QList<BaseSettings *> LanguageClientSettings::fromSettings(QtcSettings *settingsIn) { settingsIn->beginGroup(settingsGroupKey); @@ -664,10 +689,19 @@ void LanguageClientSettings::toSettings(QtcSettings *settings, auto isStdioSetting = Utils::equal(&BaseSettings::m_settingsTypeId, Utils::Id(Constants::LANGUAGECLIENT_STDIO_SETTINGS_ID)); auto [stdioSettings, typedSettings] = Utils::partition(languageClientSettings, isStdioSetting); - if (!stdioSettings.isEmpty()) - settings->setValue(clientsKey, transform(stdioSettings)); - if (!typedSettings.isEmpty()) - settings->setValue(typedClientsKey, transform(typedSettings)); + settings->setValue(clientsKey, transform(stdioSettings)); + + // write back typed settings for unregistered client types + QVariantList typedSettingsVariant; + for (const QVariant &var : settings->value(typedClientsKey).toList()) { + const Store map = storeFromVariant(var); + Id typeId = Id::fromSetting(map.value(typeIdKey)); + if (typeId.isValid() && !clientTypes().contains(typeId)) + typedSettingsVariant << var; + } + + typedSettingsVariant << transform(typedSettings); + settings->setValue(typedClientsKey, typedSettingsVariant); settings->endGroup(); } @@ -784,71 +818,73 @@ static QString startupBehaviorString(BaseSettings::StartBehavior behavior) return {}; } -BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *parent) +BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *parent, + Layouting::LayoutModifier additionalItems) : QWidget(parent) , m_name(new QLineEdit(settings->m_name, this)) , m_mimeTypes(new QLabel(settings->m_languageFilter.mimeTypes.join(filterSeparator), this)) - , m_filePattern(new QLineEdit(settings->m_languageFilter.filePattern.join(filterSeparator), this)) + , m_filePattern( + new QLineEdit(settings->m_languageFilter.filePattern.join(filterSeparator), this)) , m_startupBehavior(new QComboBox) , m_initializationOptions(new Utils::FancyLineEdit(this)) { - int row = 0; - auto *mainLayout = new QGridLayout; + using namespace Layouting; - mainLayout->addWidget(new QLabel(Tr::tr("Name:")), row, 0); - mainLayout->addWidget(m_name, row, 1); auto chooser = new Utils::VariableChooser(this); chooser->addSupportedWidget(m_name); + chooser->addSupportedWidget(m_initializationOptions); - mainLayout->addWidget(new QLabel(Tr::tr("Language:")), ++row, 0); - auto mimeLayout = new QHBoxLayout; - mimeLayout->addWidget(m_mimeTypes); - mimeLayout->addStretch(); auto addMimeTypeButton = new QPushButton(Tr::tr("Set MIME Types..."), this); - mimeLayout->addWidget(addMimeTypeButton); - mainLayout->addLayout(mimeLayout, row, 1); + connect( + addMimeTypeButton, &QPushButton::pressed, this, &BaseSettingsWidget::showAddMimeTypeDialog); + m_filePattern->setPlaceholderText(Tr::tr("File pattern")); m_filePattern->setToolTip( Tr::tr("List of file patterns.\nExample: *.cpp%1*.h").arg(filterSeparator)); - mainLayout->addWidget(m_filePattern, ++row, 1); - mainLayout->addWidget(new QLabel(Tr::tr("Startup behavior:")), ++row, 0); for (int behavior = 0; behavior < BaseSettings::LastSentinel ; ++behavior) m_startupBehavior->addItem(startupBehaviorString(BaseSettings::StartBehavior(behavior))); m_startupBehavior->setCurrentIndex(settings->m_startBehavior); - mainLayout->addWidget(m_startupBehavior, row, 1); + m_initializationOptions->setValidationFunction( + [](Utils::FancyLineEdit *edit, QString *errorMessage) { + const QString value = Utils::globalMacroExpander()->expand(edit->text()); - connect(addMimeTypeButton, &QPushButton::pressed, - this, &BaseSettingsWidget::showAddMimeTypeDialog); + if (value.isEmpty()) + return true; - mainLayout->addWidget(new QLabel(Tr::tr("Initialization options:")), ++row, 0); - mainLayout->addWidget(m_initializationOptions, row, 1); - chooser->addSupportedWidget(m_initializationOptions); - m_initializationOptions->setValidationFunction([](Utils::FancyLineEdit *edit, QString *errorMessage) { - const QString value = Utils::globalMacroExpander()->expand(edit->text()); + QJsonParseError parseInfo; + const QJsonDocument json = QJsonDocument::fromJson(value.toUtf8(), &parseInfo); - if (value.isEmpty()) + if (json.isNull()) { + if (errorMessage) + *errorMessage = Tr::tr("Failed to parse JSON at %1: %2") + .arg(parseInfo.offset) + .arg(parseInfo.errorString()); + return false; + } return true; - - QJsonParseError parseInfo; - const QJsonDocument json = QJsonDocument::fromJson(value.toUtf8(), &parseInfo); - - if (json.isNull()) { - if (errorMessage) - *errorMessage = Tr::tr("Failed to parse JSON at %1: %2") - .arg(parseInfo.offset) - .arg(parseInfo.errorString()); - return false; - } - return true; - }); + }); m_initializationOptions->setText(settings->m_initializationOptions); m_initializationOptions->setPlaceholderText(Tr::tr("Language server-specific JSON to pass via " "\"initializationOptions\" field of \"initialize\" " "request.")); - setLayout(mainLayout); + // clang-format off + auto form = Form { + Tr::tr("Name:"), m_name, br, + Tr::tr("Language:"), Row { m_mimeTypes, st, addMimeTypeButton }, br, + Tr::tr("File pattern:"), m_filePattern, br, + Tr::tr("Startup behavior:"), m_startupBehavior, br, + Tr::tr("Initialization options:"), m_initializationOptions, br + + }; + + if (additionalItems) + additionalItems(&form); + + form.attachTo(this); + // clang-format on } QString BaseSettingsWidget::name() const @@ -969,15 +1005,17 @@ StdIOSettingsWidget::StdIOSettingsWidget(const StdIOSettings *settings, QWidget , m_executable(new Utils::PathChooser(this)) , m_arguments(new QLineEdit(settings->m_arguments, this)) { - auto mainLayout = qobject_cast<QGridLayout *>(layout()); - QTC_ASSERT(mainLayout, return); - const int baseRows = mainLayout->rowCount(); - mainLayout->addWidget(new QLabel(Tr::tr("Executable:")), baseRows, 0); - mainLayout->addWidget(m_executable, baseRows, 1); - mainLayout->addWidget(new QLabel(Tr::tr("Arguments:")), baseRows + 1, 0); + using namespace Layouting; + m_executable->setExpectedKind(Utils::PathChooser::ExistingCommand); m_executable->setFilePath(settings->m_executable); - mainLayout->addWidget(m_arguments, baseRows + 1, 1); + + auto mainLayout = qobject_cast<QFormLayout *>(layout()); + QTC_ASSERT(mainLayout, return); + int row = mainLayout->rowCount(); + + mainLayout->insertRow(row++, Tr::tr("Executable:"), m_executable); + mainLayout->insertRow(row++, Tr::tr("Arguments:"), m_arguments); auto chooser = new Utils::VariableChooser(this); chooser->addSupportedWidget(m_arguments); |