LanguageClient: Allow clients to provide extra tabs for inspector

Change-Id: I530eca50393289dbf85fb0088d2a62c2729d28b2
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2021-11-16 12:27:23 +01:00
parent 5967dd52ed
commit 78562d4925
2 changed files with 50 additions and 16 deletions

View File

@@ -62,6 +62,7 @@
#include <QTextCursor> #include <QTextCursor>
#include <unordered_map> #include <unordered_map>
#include <utility>
namespace Core { class IDocument; } namespace Core { class IDocument; }
namespace ProjectExplorer { class Project; } namespace ProjectExplorer { class Project; }
@@ -72,6 +73,10 @@ class TextDocument;
class TextEditorWidget; class TextEditorWidget;
} }
QT_BEGIN_NAMESPACE
class QWidget;
QT_END_NAMESPACE
namespace LanguageClient { namespace LanguageClient {
class BaseClientInterface; class BaseClientInterface;
@@ -196,6 +201,11 @@ public:
void log(const LanguageServerProtocol::ResponseError<Error> &responseError) const void log(const LanguageServerProtocol::ResponseError<Error> &responseError) const
{ log(responseError.toString()); } { log(responseError.toString()); }
// Caller takes ownership.
using CustomInspectorTab = std::pair<QWidget *, QString>;
using CustomInspectorTabs = QList<CustomInspectorTab>;
virtual const CustomInspectorTabs createCustomInspectorTabs() { return {}; }
signals: signals:
void initialized(const LanguageServerProtocol::ServerCapabilities &capabilities); void initialized(const LanguageServerProtocol::ServerCapabilities &capabilities);
void capabilitiesChanged(const DynamicCapabilities &capabilities); void capabilitiesChanged(const DynamicCapabilities &capabilities);

View File

@@ -25,6 +25,9 @@
#include "lspinspector.h" #include "lspinspector.h"
#include "client.h"
#include "languageclientmanager.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/minisplitter.h> #include <coreplugin/minisplitter.h>
#include <languageserverprotocol/jsonkeys.h> #include <languageserverprotocol/jsonkeys.h>
@@ -343,10 +346,13 @@ private:
void addMessage(const QString &clientName, const LspLogMessage &message); void addMessage(const QString &clientName, const LspLogMessage &message);
void updateCapabilities(const QString &clientName); void updateCapabilities(const QString &clientName);
void currentClientChanged(const QString &clientName); void currentClientChanged(const QString &clientName);
LspLogWidget *log() const;
LspCapabilitiesWidget *capabilities() const;
LspInspector *m_inspector = nullptr; LspInspector * const m_inspector = nullptr;
LspLogWidget *m_log = nullptr; QTabWidget * const m_tabWidget;
LspCapabilitiesWidget *m_capabilities = nullptr;
enum class TabIndex { Log, Capabilities, Custom };
QListWidget *m_clients = nullptr; QListWidget *m_clients = nullptr;
}; };
@@ -398,7 +404,7 @@ QList<QString> LspInspector::clients() const
} }
LspInspectorWidget::LspInspectorWidget(LspInspector *inspector) LspInspectorWidget::LspInspectorWidget(LspInspector *inspector)
: m_inspector(inspector) : m_inspector(inspector), m_tabWidget(new QTabWidget(this))
{ {
setWindowTitle(tr("Language Client Inspector")); setWindowTitle(tr("Language Client Inspector"));
@@ -411,19 +417,15 @@ LspInspectorWidget::LspInspectorWidget(LspInspector *inspector)
m_clients->addItems(inspector->clients()); m_clients->addItems(inspector->clients());
m_clients->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::MinimumExpanding); m_clients->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::MinimumExpanding);
auto tabWidget = new QTabWidget;
auto mainLayout = new QVBoxLayout; auto mainLayout = new QVBoxLayout;
auto mainSplitter = new Core::MiniSplitter; auto mainSplitter = new Core::MiniSplitter;
mainSplitter->setOrientation(Qt::Horizontal); mainSplitter->setOrientation(Qt::Horizontal);
mainSplitter->addWidget(m_clients); mainSplitter->addWidget(m_clients);
mainSplitter->addWidget(tabWidget); mainSplitter->addWidget(m_tabWidget);
mainSplitter->setStretchFactor(0, 0); mainSplitter->setStretchFactor(0, 0);
mainSplitter->setStretchFactor(1, 1); mainSplitter->setStretchFactor(1, 1);
m_log = new LspLogWidget; m_tabWidget->addTab(new LspLogWidget, tr("Log"));
m_capabilities = new LspCapabilitiesWidget; m_tabWidget->addTab(new LspCapabilitiesWidget, tr("Capabilities"));
tabWidget->addTab(m_log, tr("Log"));
tabWidget->addTab(m_capabilities, tr("Capabilities"));
mainLayout->addWidget(mainSplitter); mainLayout->addWidget(mainSplitter);
auto buttonBox = new QDialogButtonBox(this); auto buttonBox = new QDialogButtonBox(this);
@@ -443,7 +445,7 @@ LspInspectorWidget::LspInspectorWidget(LspInspector *inspector)
&LspInspectorWidget::currentClientChanged); &LspInspectorWidget::currentClientChanged);
// save // save
connect(buttonBox, &QDialogButtonBox::accepted, m_log, &LspLogWidget::saveLog); connect(buttonBox, &QDialogButtonBox::accepted, log(), &LspLogWidget::saveLog);
// close // close
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
@@ -464,7 +466,7 @@ void LspInspectorWidget::addMessage(const QString &clientName, const LspLogMessa
m_clients->addItem(clientName); m_clients->addItem(clientName);
if (const QListWidgetItem *currentItem = m_clients->currentItem(); if (const QListWidgetItem *currentItem = m_clients->currentItem();
currentItem && currentItem->text() == clientName) { currentItem && currentItem->text() == clientName) {
m_log->addMessage(message); log()->addMessage(message);
} }
} }
@@ -474,14 +476,36 @@ void LspInspectorWidget::updateCapabilities(const QString &clientName)
m_clients->addItem(clientName); m_clients->addItem(clientName);
if (const QListWidgetItem *currentItem = m_clients->currentItem(); if (const QListWidgetItem *currentItem = m_clients->currentItem();
currentItem && clientName == currentItem->text()) { currentItem && clientName == currentItem->text()) {
m_capabilities->setCapabilities(m_inspector->capabilities(clientName)); capabilities()->setCapabilities(m_inspector->capabilities(clientName));
} }
} }
void LspInspectorWidget::currentClientChanged(const QString &clientName) void LspInspectorWidget::currentClientChanged(const QString &clientName)
{ {
m_log->setMessages(m_inspector->messages(clientName)); log()->setMessages(m_inspector->messages(clientName));
m_capabilities->setCapabilities(m_inspector->capabilities(clientName)); capabilities()->setCapabilities(m_inspector->capabilities(clientName));
for (int i = m_tabWidget->count() - 1; i >= int(TabIndex::Custom); --i) {
QWidget * const w = m_tabWidget->widget(i);
m_tabWidget->removeTab(i);
delete w;
}
for (Client * const c : LanguageClientManager::clients()) {
if (c->name() != clientName)
continue;
for (const Client::CustomInspectorTab &tab : c->createCustomInspectorTabs())
m_tabWidget->addTab(tab.first, tab.second);
break;
}
}
LspLogWidget *LspInspectorWidget::log() const
{
return static_cast<LspLogWidget *>(m_tabWidget->widget(int(TabIndex::Log)));
}
LspCapabilitiesWidget *LspInspectorWidget::capabilities() const
{
return static_cast<LspCapabilitiesWidget *>(m_tabWidget->widget(int(TabIndex::Capabilities)));
} }
MessageDetailWidget::MessageDetailWidget() MessageDetailWidget::MessageDetailWidget()