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

View File

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