forked from qt-creator/qt-creator
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:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user