From eff5cbeb86d36297d86e55d5c94a9bb767d1095b Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 6 Jul 2021 15:50:50 +0200 Subject: [PATCH] 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 --- src/plugins/cppeditor/cppeditorwidget.cpp | 45 ++++++++++++++++------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp index ee242640bc0..d2abe8699f8 100644 --- a/src/plugins/cppeditor/cppeditorwidget.cpp +++ b/src/plugins/cppeditor/cppeditorwidget.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -114,11 +115,15 @@ class CppEditorWidgetPrivate public: CppEditorWidgetPrivate(CppEditorWidget *q); + bool shouldOfferOutline() const { return CppModelManager::supportsOutline(m_cppEditorDocument); } + public: QPointer m_modelManager; CppEditorDocument *m_cppEditorDocument; CppEditorOutline *m_cppEditorOutline = nullptr; + QAction *m_outlineAction = nullptr; + QTimer m_outlineTimer; QTimer m_updateFunctionDeclDefLinkTimer; SemanticInfo m_lastSemanticInfo; @@ -159,11 +164,11 @@ void CppEditorWidget::finalizeInitialization() // clang-format off // function combo box sorting - if (CppModelManager::supportsOutline(d->m_cppEditorDocument)) { - d->m_cppEditorOutline = new CppEditorOutline(this); - connect(CppEditorPlugin::instance(), &CppEditorPlugin::outlineSortingChanged, - outline(), &CppEditorOutline::setSorted); - } + d->m_cppEditorOutline = new CppEditorOutline(this); + + // TODO: Nobody emits this signal... Remove? + connect(CppEditorPlugin::instance(), &CppEditorPlugin::outlineSortingChanged, + outline(), &CppEditorOutline::setSorted); connect(d->m_cppEditorDocument, &CppEditorDocument::codeWarningsUpdated, this, &CppEditorWidget::onCodeWarningsUpdated); @@ -197,10 +202,10 @@ void CppEditorWidget::finalizeInitialization() }); connect(&d->m_localRenaming, &CppLocalRenaming::processKeyPressNormally, this, &CppEditorWidget::processKeyNormally); - if (d->m_cppEditorOutline) { - connect(this, &QPlainTextEdit::cursorPositionChanged, - d->m_cppEditorOutline, &CppEditorOutline::updateIndex); - } + connect(this, &QPlainTextEdit::cursorPositionChanged, this, [this] { + if (d->shouldOfferOutline()) + d->m_cppEditorOutline->updateIndex(); + }); connect(cppEditorDocument(), &CppEditorDocument::preprocessorSettingsChanged, this, [this](bool customSettings) { @@ -236,8 +241,8 @@ void CppEditorWidget::finalizeInitialization() }); // Toolbar: Outline/Overview combo box - if (d->m_cppEditorOutline) - insertExtraToolBarWidget(TextEditorWidget::Left, d->m_cppEditorOutline->widget()); + d->m_outlineAction = insertExtraToolBarWidget(TextEditorWidget::Left, + d->m_cppEditorOutline->widget()); // clang-format on // Toolbar: '#' Button @@ -261,6 +266,20 @@ void CppEditorWidget::finalizeInitialization() }); connect(&cppEditorDocument()->minimizableInfoBars(), &MinimizableInfoBars::showAction, 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) @@ -271,7 +290,7 @@ void CppEditorWidget::finalizeInitializationAfterDuplication(TextEditorWidget *o if (cppEditorWidget->isSemanticInfoValidExceptLocalUses()) updateSemanticInfo(cppEditorWidget->semanticInfo()); - if (d->m_cppEditorOutline) + if (d->shouldOfferOutline()) d->m_cppEditorOutline->update(); const Id selectionKind = CodeWarningsSelection; setExtraSelections(selectionKind, cppEditorWidget->extraSelections(selectionKind)); @@ -331,7 +350,7 @@ void CppEditorWidget::selectAll() void CppEditorWidget::onCppDocumentUpdated() { - if (d->m_cppEditorOutline) + if (d->shouldOfferOutline()) d->m_cppEditorOutline->update(); }