CppEditor: Enable/disable outline dynamically

The "outline enabled" property is not static: E.g. the user might switch
on/off clangd support, and then we should hide/show our outline,
respectively.
This also eliminates the danger of null pointer accesses.
Amends c0a44be27b.

Fixes: QTCREATORBUG-25963
Change-Id: I508b9700ba1a99204ea8315546db089486b5d122
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2021-07-06 15:50:50 +02:00
parent 50f9180cd2
commit eff5cbeb86

View File

@@ -49,6 +49,7 @@
#include <cpptools/cppcanonicalsymbol.h> #include <cpptools/cppcanonicalsymbol.h>
#include <cpptools/cppchecksymbols.h> #include <cpptools/cppchecksymbols.h>
#include <cpptools/cppcodeformatter.h> #include <cpptools/cppcodeformatter.h>
#include <cpptools/cppcodemodelsettings.h>
#include <cpptools/cppcompletionassistprovider.h> #include <cpptools/cppcompletionassistprovider.h>
#include <cpptools/cppeditoroutline.h> #include <cpptools/cppeditoroutline.h>
#include <cpptools/cppmodelmanager.h> #include <cpptools/cppmodelmanager.h>
@@ -114,11 +115,15 @@ class CppEditorWidgetPrivate
public: public:
CppEditorWidgetPrivate(CppEditorWidget *q); CppEditorWidgetPrivate(CppEditorWidget *q);
bool shouldOfferOutline() const { return CppModelManager::supportsOutline(m_cppEditorDocument); }
public: public:
QPointer<CppModelManager> m_modelManager; QPointer<CppModelManager> m_modelManager;
CppEditorDocument *m_cppEditorDocument; CppEditorDocument *m_cppEditorDocument;
CppEditorOutline *m_cppEditorOutline = nullptr; CppEditorOutline *m_cppEditorOutline = nullptr;
QAction *m_outlineAction = nullptr;
QTimer m_outlineTimer;
QTimer m_updateFunctionDeclDefLinkTimer; QTimer m_updateFunctionDeclDefLinkTimer;
SemanticInfo m_lastSemanticInfo; SemanticInfo m_lastSemanticInfo;
@@ -159,11 +164,11 @@ void CppEditorWidget::finalizeInitialization()
// clang-format off // clang-format off
// function combo box sorting // function combo box sorting
if (CppModelManager::supportsOutline(d->m_cppEditorDocument)) { d->m_cppEditorOutline = new CppEditorOutline(this);
d->m_cppEditorOutline = new CppEditorOutline(this);
connect(CppEditorPlugin::instance(), &CppEditorPlugin::outlineSortingChanged, // TODO: Nobody emits this signal... Remove?
outline(), &CppEditorOutline::setSorted); connect(CppEditorPlugin::instance(), &CppEditorPlugin::outlineSortingChanged,
} outline(), &CppEditorOutline::setSorted);
connect(d->m_cppEditorDocument, &CppEditorDocument::codeWarningsUpdated, connect(d->m_cppEditorDocument, &CppEditorDocument::codeWarningsUpdated,
this, &CppEditorWidget::onCodeWarningsUpdated); this, &CppEditorWidget::onCodeWarningsUpdated);
@@ -197,10 +202,10 @@ void CppEditorWidget::finalizeInitialization()
}); });
connect(&d->m_localRenaming, &CppLocalRenaming::processKeyPressNormally, connect(&d->m_localRenaming, &CppLocalRenaming::processKeyPressNormally,
this, &CppEditorWidget::processKeyNormally); this, &CppEditorWidget::processKeyNormally);
if (d->m_cppEditorOutline) { connect(this, &QPlainTextEdit::cursorPositionChanged, this, [this] {
connect(this, &QPlainTextEdit::cursorPositionChanged, if (d->shouldOfferOutline())
d->m_cppEditorOutline, &CppEditorOutline::updateIndex); d->m_cppEditorOutline->updateIndex();
} });
connect(cppEditorDocument(), &CppEditorDocument::preprocessorSettingsChanged, this, connect(cppEditorDocument(), &CppEditorDocument::preprocessorSettingsChanged, this,
[this](bool customSettings) { [this](bool customSettings) {
@@ -236,8 +241,8 @@ void CppEditorWidget::finalizeInitialization()
}); });
// Toolbar: Outline/Overview combo box // Toolbar: Outline/Overview combo box
if (d->m_cppEditorOutline) d->m_outlineAction = insertExtraToolBarWidget(TextEditorWidget::Left,
insertExtraToolBarWidget(TextEditorWidget::Left, d->m_cppEditorOutline->widget()); d->m_cppEditorOutline->widget());
// clang-format on // clang-format on
// Toolbar: '#' Button // Toolbar: '#' Button
@@ -261,6 +266,20 @@ void CppEditorWidget::finalizeInitialization()
}); });
connect(&cppEditorDocument()->minimizableInfoBars(), &MinimizableInfoBars::showAction, connect(&cppEditorDocument()->minimizableInfoBars(), &MinimizableInfoBars::showAction,
this, &CppEditorWidget::onShowInfoBarAction); this, &CppEditorWidget::onShowInfoBarAction);
d->m_outlineTimer.setInterval(5000);
d->m_outlineTimer.setSingleShot(true);
connect(&d->m_outlineTimer, &QTimer::timeout, this, [this] {
d->m_outlineAction->setVisible(d->shouldOfferOutline());
if (d->m_outlineAction->isVisible()) {
d->m_cppEditorOutline->update();
d->m_cppEditorOutline->updateIndex();
}
});
connect(&ClangdSettings::instance(), &ClangdSettings::changed,
&d->m_outlineTimer, qOverload<>(&QTimer::start));
connect(d->m_cppEditorDocument, &CppEditorDocument::changed,
&d->m_outlineTimer, qOverload<>(&QTimer::start));
} }
void CppEditorWidget::finalizeInitializationAfterDuplication(TextEditorWidget *other) void CppEditorWidget::finalizeInitializationAfterDuplication(TextEditorWidget *other)
@@ -271,7 +290,7 @@ void CppEditorWidget::finalizeInitializationAfterDuplication(TextEditorWidget *o
if (cppEditorWidget->isSemanticInfoValidExceptLocalUses()) if (cppEditorWidget->isSemanticInfoValidExceptLocalUses())
updateSemanticInfo(cppEditorWidget->semanticInfo()); updateSemanticInfo(cppEditorWidget->semanticInfo());
if (d->m_cppEditorOutline) if (d->shouldOfferOutline())
d->m_cppEditorOutline->update(); d->m_cppEditorOutline->update();
const Id selectionKind = CodeWarningsSelection; const Id selectionKind = CodeWarningsSelection;
setExtraSelections(selectionKind, cppEditorWidget->extraSelections(selectionKind)); setExtraSelections(selectionKind, cppEditorWidget->extraSelections(selectionKind));
@@ -331,7 +350,7 @@ void CppEditorWidget::selectAll()
void CppEditorWidget::onCppDocumentUpdated() void CppEditorWidget::onCppDocumentUpdated()
{ {
if (d->m_cppEditorOutline) if (d->shouldOfferOutline())
d->m_cppEditorOutline->update(); d->m_cppEditorOutline->update();
} }