diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 3acea150800..dba6f93cc22 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -1139,6 +1140,10 @@ void Client::intializeCallback(const InitializeRequest::Response &initResponse) if (auto textEditor = qobject_cast(editor)) textEditor->editorWidget()->addHoverHandler(&m_hoverHandler); } + if (m_dynamicCapabilities.isRegistered(DocumentSymbolsRequest::methodName) + .value_or(capabilities().documentSymbolProvider().value_or(false))) { + TextEditor::IOutlineWidgetFactory::updateOutline(); + } emit initialized(m_serverCapabilities); } diff --git a/src/plugins/texteditor/ioutlinewidget.h b/src/plugins/texteditor/ioutlinewidget.h index 875181d8f07..ff0efa37b5e 100644 --- a/src/plugins/texteditor/ioutlinewidget.h +++ b/src/plugins/texteditor/ioutlinewidget.h @@ -56,6 +56,8 @@ public: virtual bool supportsEditor(Core::IEditor *editor) const = 0; virtual IOutlineWidget *createWidget(Core::IEditor *editor) = 0; + + static void updateOutline(); }; } // namespace TextEditor diff --git a/src/plugins/texteditor/outlinefactory.cpp b/src/plugins/texteditor/outlinefactory.cpp index 96011f4154a..038cd58cab4 100644 --- a/src/plugins/texteditor/outlinefactory.cpp +++ b/src/plugins/texteditor/outlinefactory.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -40,6 +41,7 @@ namespace TextEditor { static QList g_outlineWidgetFactories; +static QPointer g_outlineFactory; IOutlineWidgetFactory::IOutlineWidgetFactory() { @@ -51,6 +53,12 @@ IOutlineWidgetFactory::~IOutlineWidgetFactory() g_outlineWidgetFactories.removeOne(this); } +void IOutlineWidgetFactory::updateOutline() +{ + if (QTC_GUARD(!g_outlineFactory.isNull())) + emit g_outlineFactory->updateOutline(); +} + namespace Internal { OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) : @@ -88,8 +96,10 @@ OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) : m_filterButton->setMenu(m_filterMenu); connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged, + this, &OutlineWidgetStack::updateEditor); + connect(factory, &OutlineFactory::updateOutline, this, &OutlineWidgetStack::updateCurrentEditor); - updateCurrentEditor(Core::EditorManager::currentEditor()); + updateCurrentEditor(); } OutlineWidgetStack::~OutlineWidgetStack() = default; @@ -159,7 +169,12 @@ void OutlineWidgetStack::updateFilterMenu() m_filterButton->setVisible(!m_filterMenu->actions().isEmpty()); } -void OutlineWidgetStack::updateCurrentEditor(Core::IEditor *editor) +void OutlineWidgetStack::updateCurrentEditor() +{ + updateEditor(Core::EditorManager::currentEditor()); +} + +void OutlineWidgetStack::updateEditor(Core::IEditor *editor) { IOutlineWidget *newWidget = nullptr; @@ -195,6 +210,8 @@ void OutlineWidgetStack::updateCurrentEditor(Core::IEditor *editor) OutlineFactory::OutlineFactory() { + QTC_CHECK(g_outlineFactory.isNull()); + g_outlineFactory = this; setDisplayName(tr("Outline")); setId("Outline"); setPriority(600); diff --git a/src/plugins/texteditor/outlinefactory.h b/src/plugins/texteditor/outlinefactory.h index 00a5732c83f..375caf02ac5 100644 --- a/src/plugins/texteditor/outlinefactory.h +++ b/src/plugins/texteditor/outlinefactory.h @@ -55,7 +55,8 @@ private: QWidget *dummyWidget() const; void updateFilterMenu(); void toggleCursorSynchronization(); - void updateCurrentEditor(Core::IEditor *editor); + void updateEditor(Core::IEditor *editor); + void updateCurrentEditor(); QStackedWidget *m_widgetStack; OutlineFactory *m_factory; @@ -76,6 +77,9 @@ public: Core::NavigationView createWidget() override; void saveSettings(QSettings *settings, int position, QWidget *widget) override; void restoreSettings(QSettings *settings, int position, QWidget *widget) override; + +signals: + void updateOutline(); }; } // namespace Internal