forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
@@ -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()
|
||||||
|
Reference in New Issue
Block a user