From 4420190192124d8522a9d8eb88a48f887b31ae74 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 11 Feb 2019 13:26:53 +0100 Subject: [PATCH] LSP: Visualize server capabilities in settings page Change-Id: Ib83b8580e9758313285a6145b0925e051268f34b Reviewed-by: Christian Stenger Reviewed-by: David Schulz --- .../languageclient/languageclientsettings.cpp | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index e101db412c7..17ea39f80ed 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -34,9 +34,8 @@ #include #include #include -#include #include -#include +#include #include #include @@ -150,7 +149,6 @@ LanguageClientSettingsPageWidget::LanguageClientSettingsPageWidget(LanguageClien connect(addButton, &QPushButton::pressed, this, &LanguageClientSettingsPageWidget::addItem); auto deleteButton = new QPushButton(LanguageClientSettingsPage::tr("&Delete")); connect(deleteButton, &QPushButton::pressed, this, &LanguageClientSettingsPageWidget::deleteItem); - mainLayout->addLayout(layout); setLayout(mainLayout); layout->addWidget(m_view); @@ -505,6 +503,24 @@ BaseClientInterface *StdIOSettings::createInterface() const return new StdIOClientInterface(m_executable, m_arguments); } +static QWidget *createCapabilitiesView( + const LanguageServerProtocol::ServerCapabilities &capabilities) +{ + auto root = new Utils::JsonTreeItem("Capabilities", QJsonValue(capabilities)); + if (root->canFetchMore()) + root->fetchMore(); + + auto capabilitiesModel = new Utils::TreeModel(root); + capabilitiesModel->setHeader({BaseSettingsWidget::tr("Name"), + BaseSettingsWidget::tr("Value"), + BaseSettingsWidget::tr("Type")}); + auto capabilitiesView = new QTreeView(); + capabilitiesView->setModel(capabilitiesModel); + capabilitiesView->setAlternatingRowColors(true); + capabilitiesView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); + return capabilitiesView; +} + BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *parent) : QWidget(parent) , m_name(new QLineEdit(settings->m_name, this)) @@ -528,6 +544,30 @@ BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *pa connect(addMimeTypeButton, &QPushButton::pressed, this, &BaseSettingsWidget::showAddMimeTypeDialog); + auto createInfoLabel = []() { + return new QLabel(tr("Available after server was initialized")); + }; + + mainLayout->addWidget(new QLabel(tr("Capabilities:")), ++row, 0, Qt::AlignTop); + if (Client *client = settings->m_client.data()) { + if (client->state() == Client::Initialized) + mainLayout->addWidget(createCapabilitiesView(client->capabilities())); + else + mainLayout->addWidget(createInfoLabel(), row, 1); + connect(client, &Client::finished, mainLayout, [mainLayout, row, createInfoLabel]() { + delete mainLayout->itemAtPosition(row, 1)->widget(); + mainLayout->addWidget(createInfoLabel(), row, 1); + }); + connect(client, &Client::initialized, mainLayout, + [mainLayout, row]( + const LanguageServerProtocol::ServerCapabilities &capabilities) { + delete mainLayout->itemAtPosition(row, 1)->widget(); + mainLayout->addWidget(createCapabilitiesView(capabilities), row, 1); + }); + } else { + mainLayout->addWidget(createInfoLabel()); + } + setLayout(mainLayout); }