summaryrefslogtreecommitdiff
path: root/src/plugins/python/pythonlanguageclient.cpp
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2022-06-07 17:36:24 +0200
committerDavid Schulz <david.schulz@qt.io>2022-06-10 12:40:43 +0000
commited22ef78543a41e334687b4c70493b8bd21ed7b3 (patch)
tree0f62b66edb8f1386ebf4bd51a7c66c3b64883f5b /src/plugins/python/pythonlanguageclient.cpp
parente42ff3f14eb497d37ac26082d17efce683e0de16 (diff)
downloadqt-creator-ed22ef78543a41e334687b4c70493b8bd21ed7b3.tar.gz
Python: globalize Python language server settings
Change-Id: I84fcee6462064f0c788492fcfa12a77379af2bd7 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/python/pythonlanguageclient.cpp')
-rw-r--r--src/plugins/python/pythonlanguageclient.cpp218
1 files changed, 15 insertions, 203 deletions
diff --git a/src/plugins/python/pythonlanguageclient.cpp b/src/plugins/python/pythonlanguageclient.cpp
index f40cc8689c..b689792620 100644
--- a/src/plugins/python/pythonlanguageclient.cpp
+++ b/src/plugins/python/pythonlanguageclient.cpp
@@ -53,7 +53,6 @@
#include <QCheckBox>
#include <QComboBox>
-#include <QDialogButtonBox>
#include <QFutureWatcher>
#include <QGridLayout>
#include <QGroupBox>
@@ -164,154 +163,6 @@ static PythonLanguageServerState checkPythonLanguageServer(const FilePath &pytho
return {PythonLanguageServerState::CanNotBeInstalled, FilePath()};
}
-static const QStringList &plugins()
-{
- static const QStringList plugins{"flake8",
- "jedi_completion",
- "jedi_definition",
- "jedi_hover",
- "jedi_references",
- "jedi_signature_help",
- "jedi_symbols",
- "mccabe",
- "pycodestyle",
- "pydocstyle",
- "pyflakes",
- "pylint",
- "rope_completion",
- "yapf"};
- return plugins;
-}
-
-class PylsConfigureDialog : public QDialog
-{
- Q_DECLARE_TR_FUNCTIONS(PylsConfigureDialog)
-public:
- PylsConfigureDialog()
- : QDialog(Core::ICore::dialogParent())
- , m_editor(jsonEditor())
- , m_advancedLabel(new QLabel)
- , m_pluginsGroup(new QGroupBox(tr("Plugins:")))
- {
- auto mainLayout = new QVBoxLayout;
-
- auto pluginsLayout = new QGridLayout;
- m_pluginsGroup->setLayout(pluginsLayout);
- int i = 0;
- for (const QString &plugin : plugins()) {
- auto checkBox = new QCheckBox(plugin, this);
- connect(checkBox, &QCheckBox::toggled, this, [this, plugin](bool enabled) {
- updatePluginEnabled(enabled, plugin);
- });
- m_checkBoxes[plugin] = checkBox;
- pluginsLayout->addWidget(checkBox, i / 4, i % 4);
- ++i;
- }
- mainLayout->addWidget(m_pluginsGroup);
-
- const QString labelText = tr(
- "For a complete list of avilable options, consult the <a "
- "href=\"https://github.com/python-lsp/python-lsp-server/blob/develop/"
- "CONFIGURATION.md\">Python LSP Server configuration documentation</a>.");
-
- m_advancedLabel->setText(labelText);
- m_advancedLabel->setOpenExternalLinks(true);
- mainLayout->addWidget(m_advancedLabel);
- mainLayout->addWidget(m_editor->editorWidget(), 1);
-
- setAdvanced(false);
-
- mainLayout->addStretch();
-
- auto buttons = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
-
- auto advanced = new QPushButton(tr("Advanced"));
- advanced->setCheckable(true);
- advanced->setChecked(false);
- buttons->addButton(advanced, QDialogButtonBox::ActionRole);
-
- connect(advanced,
- &QPushButton::toggled,
- this,
- &PylsConfigureDialog::setAdvanced);
-
- connect(buttons->button(QDialogButtonBox::Cancel),
- &QPushButton::clicked,
- this,
- &QDialog::reject);
-
- connect(buttons->button(QDialogButtonBox::Ok),
- &QPushButton::clicked,
- this,
- &QDialog::accept);
-
- mainLayout->addWidget(buttons);
- setLayout(mainLayout);
-
- resize(640, 480);
- }
-
- void setConfiguration(const QString &configuration)
- {
- m_editor->textDocument()->setPlainText(configuration);
- updateCheckboxes();
- }
-
- QString configuration() const { return m_editor->textDocument()->plainText(); }
-
-private:
- void setAdvanced(bool advanced)
- {
- m_editor->editorWidget()->setVisible(advanced);
- m_advancedLabel->setVisible(advanced);
- m_pluginsGroup->setVisible(!advanced);
- updateCheckboxes();
- }
-
- void updateCheckboxes()
- {
- const QJsonDocument document = QJsonDocument::fromJson(
- m_editor->textDocument()->plainText().toUtf8());
- if (document.isObject()) {
- const QJsonObject pluginsObject
- = document.object()["pylsp"].toObject()["plugins"].toObject();
- for (const QString &plugin : plugins()) {
- auto checkBox = m_checkBoxes[plugin];
- if (!checkBox)
- continue;
- const QJsonValue enabled = pluginsObject[plugin].toObject()["enabled"];
- if (!enabled.isBool())
- checkBox->setCheckState(Qt::PartiallyChecked);
- else
- checkBox->setCheckState(enabled.toBool(false) ? Qt::Checked : Qt::Unchecked);
- }
- }
- }
-
- void updatePluginEnabled(bool enabled, const QString &plugin)
- {
- QJsonDocument document = QJsonDocument::fromJson(
- m_editor->textDocument()->plainText().toUtf8());
- if (document.isNull())
- return;
- QJsonObject config = document.object();
- QJsonObject pylsp = config["pylsp"].toObject();
- QJsonObject plugins = pylsp["plugins"].toObject();
- QJsonObject pluginValue = plugins[plugin].toObject();
- pluginValue.insert("enabled", enabled);
- plugins.insert(plugin, pluginValue);
- pylsp.insert("plugins", plugins);
- config.insert("pylsp", pylsp);
- document.setObject(config);
- m_editor->textDocument()->setPlainText(QString::fromUtf8(document.toJson()));
- }
-
- QMap<QString, QCheckBox *> m_checkBoxes;
- TextEditor::BaseTextEditor *m_editor = nullptr;
- QLabel *m_advancedLabel = nullptr;
- QGroupBox *m_pluginsGroup = nullptr;
-};
-
class PyLSSettingsWidget : public QWidget
{
Q_DECLARE_TR_FUNCTIONS(PyLSSettingsWidget)
@@ -321,7 +172,6 @@ public:
, m_name(new QLineEdit(settings->m_name, this))
, m_interpreter(new QComboBox(this))
, m_configure(new QPushButton(tr("Configure..."), this))
- , m_configuration(settings->m_configuration)
{
int row = 0;
auto *mainLayout = new QGridLayout;
@@ -345,7 +195,7 @@ public:
this,
&PyLSSettingsWidget::updateInterpreters);
- connect(m_configure, &QPushButton::clicked, this, &PyLSSettingsWidget::showConfigureDialog);
+ connect(m_configure, &QPushButton::clicked, this, &PyLSSettingsWidget::switchToPylsConfigurePage);
}
void updateInterpreters(const QList<Interpreter> &interpreters, const QString &defaultId)
@@ -367,21 +217,16 @@ public:
QString name() const { return m_name->text(); }
QString interpreterId() const { return m_interpreter->currentData().toString(); }
- QString configuration() const { return m_configuration; }
private:
- void showConfigureDialog()
+ void switchToPylsConfigurePage()
{
- PylsConfigureDialog dialog;
- dialog.setConfiguration(m_configuration);
- if (dialog.exec() == QDialog::Accepted)
- m_configuration = dialog.configuration();
+ Core::ICore::showOptionsDialog(Constants::C_PYLSCONFIGURATION_PAGE_ID);
}
QLineEdit *m_name = nullptr;
QComboBox *m_interpreter = nullptr;
QPushButton *m_configure = nullptr;
- QString m_configuration;
};
PyLSSettings::PyLSSettings()
@@ -392,8 +237,6 @@ PyLSSettings::PyLSSettings()
m_languageFilter.mimeTypes = QStringList()
<< Constants::C_PY_MIMETYPE << Constants::C_PY3_MIMETYPE;
m_arguments = "-m pylsp";
- const QJsonDocument config(defaultConfiguration());
- m_configuration = QString::fromUtf8(config.toJson());
}
bool PyLSSettings::isValid() const
@@ -413,10 +256,6 @@ QVariantMap PyLSSettings::toMap() const
void PyLSSettings::fromMap(const QVariantMap &map)
{
StdIOSettings::fromMap(map);
- if (m_configuration.isEmpty()) {
- const QJsonDocument config(defaultConfiguration());
- m_configuration = QString::fromUtf8(config.toJson());
- }
m_languageFilter.mimeTypes = QStringList()
<< Constants::C_PY_MIMETYPE << Constants::C_PY3_MIMETYPE;
setInterpreter(map[interpreterKey].toString());
@@ -433,15 +272,6 @@ bool PyLSSettings::applyFromSettingsWidget(QWidget *widget)
changed |= m_interpreterId != pylswidget->interpreterId();
setInterpreter(pylswidget->interpreterId());
- if (m_configuration != pylswidget->configuration()) {
- m_configuration = pylswidget->configuration();
- if (!changed) { // if only the settings configuration changed just send an update
- const QList<Client *> clients = LanguageClientManager::clientsForSetting(this);
- for (Client *client : clients)
- client->updateConfiguration(configuration());
- }
- }
-
return changed;
}
@@ -493,6 +323,18 @@ PyLSClient::PyLSClient(BaseClientInterface *interface)
: Client(interface)
, m_extraCompilerOutputDir(static_cast<PyLSInterface *>(interface)->m_extraPythonPath.path())
{
+ connect(this, &Client::initialized, this, &PyLSClient::updateConfiguration);
+ connect(PythonSettings::instance(), &PythonSettings::pylsConfigurationChanged,
+ this, &PyLSClient::updateConfiguration);
+}
+
+void PyLSClient::updateConfiguration()
+{
+ const auto doc = QJsonDocument::fromJson(PythonSettings::pyLSConfiguration().toUtf8());
+ if (doc.isArray())
+ Client::updateConfiguration(doc.array());
+ else if (doc.isObject())
+ Client::updateConfiguration(doc.object());
}
void PyLSClient::openDocument(TextEditor::TextDocument *document)
@@ -583,36 +425,6 @@ Client *PyLSSettings::createClient(BaseClientInterface *interface) const
return new PyLSClient(interface);
}
-QJsonObject PyLSSettings::defaultConfiguration()
-{
- static QJsonObject configuration;
- if (configuration.isEmpty()) {
- QJsonObject enabled;
- enabled.insert("enabled", true);
- QJsonObject disabled;
- disabled.insert("enabled", false);
- QJsonObject plugins;
- plugins.insert("flake8", disabled);
- plugins.insert("jedi_completion", enabled);
- plugins.insert("jedi_definition", enabled);
- plugins.insert("jedi_hover", enabled);
- plugins.insert("jedi_references", enabled);
- plugins.insert("jedi_signature_help", enabled);
- plugins.insert("jedi_symbols", enabled);
- plugins.insert("mccabe", disabled);
- plugins.insert("pycodestyle", disabled);
- plugins.insert("pydocstyle", disabled);
- plugins.insert("pyflakes", enabled);
- plugins.insert("pylint", disabled);
- plugins.insert("rope_completion", enabled);
- plugins.insert("yapf", enabled);
- QJsonObject pylsp;
- pylsp.insert("plugins", plugins);
- configuration.insert("pylsp", pylsp);
- }
- return configuration;
-}
-
PyLSConfigureAssistant *PyLSConfigureAssistant::instance()
{
static auto *instance = new PyLSConfigureAssistant(PythonPlugin::instance());