aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2019-07-16 12:29:20 +0200
committerDavid Schulz <david.schulz@qt.io>2019-07-18 08:34:18 +0000
commit3fbb5ddba873e65855e8cf4d9b404170746fc511 (patch)
tree9641577431600b11c635ec33f8085663d145dba5 /src/plugins
parent3ae169f8ac3c4176e57399ae13f02fb778ced4ad (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.cpp5
-rw-r--r--src/plugins/texteditor/ioutlinewidget.h2
-rw-r--r--src/plugins/texteditor/outlinefactory.cpp21
-rw-r--r--src/plugins/texteditor/outlinefactory.h6
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