diff options
author | David Schulz <david.schulz@qt.io> | 2019-07-16 12:29:20 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2019-07-18 08:34:18 +0000 |
commit | 3fbb5ddba873e65855e8cf4d9b404170746fc511 (patch) | |
tree | 9641577431600b11c635ec33f8085663d145dba5 /src/plugins | |
parent | 3ae169f8ac3c4176e57399ae13f02fb778ced4ad (diff) |
LanguageClient: Show outline after server start
If the server was started by opening a document the outline factory and
client was not properly initialized in the time the outline was
requested. Update the outline after the client is fully initialized.
Fixes: QTCREATORBUG-22695
Change-Id: I84dc56eead9774d80ed6baf7792daff930a7cb8e
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/languageclient/client.cpp | 5 | ||||
-rw-r--r-- | src/plugins/texteditor/ioutlinewidget.h | 2 | ||||
-rw-r--r-- | src/plugins/texteditor/outlinefactory.cpp | 21 | ||||
-rw-r--r-- | src/plugins/texteditor/outlinefactory.h | 6 |
4 files changed, 31 insertions, 3 deletions
diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 3acea15080..dba6f93cc2 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -43,6 +43,7 @@ #include <texteditor/textdocument.h> #include <texteditor/texteditor.h> #include <texteditor/textmark.h> +#include <texteditor/ioutlinewidget.h> #include <utils/mimetypes/mimedatabase.h> #include <utils/qtcprocess.h> #include <utils/synchronousprocess.h> @@ -1139,6 +1140,10 @@ void Client::intializeCallback(const InitializeRequest::Response &initResponse) if (auto textEditor = qobject_cast<TextEditor::BaseTextEditor *>(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 875181d8f0..ff0efa37b5 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 96011f4154..038cd58cab 100644 --- a/src/plugins/texteditor/outlinefactory.cpp +++ b/src/plugins/texteditor/outlinefactory.cpp @@ -30,6 +30,7 @@ #include <coreplugin/editormanager/ieditor.h> #include <utils/utilsicons.h> +#include <utils/qtcassert.h> #include <QToolButton> #include <QLabel> @@ -40,6 +41,7 @@ namespace TextEditor { static QList<IOutlineWidgetFactory *> g_outlineWidgetFactories; +static QPointer<Internal::OutlineFactory> 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 00a5732c83..375caf02ac 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 |