From b9b69bac339adad49bfc0cac94159b87697c94c7 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 18 Jul 2017 17:37:08 +0200 Subject: [PATCH] TextEditor: Disconnect highlighting from text editor content changes The syntax highligher is connected to the content changes of the text editor which is not very useful if the diagnostics been provided by an asynchronous mechanism. So we add a setter to disconnect the changes from the syntax highlighter. Change-Id: Ied4b5fe34000b13bafb1aa177b89befe6620d4d7 Reviewed-by: David Schulz --- src/plugins/texteditor/syntaxhighlighter.cpp | 27 ++++++++++++++------ src/plugins/texteditor/syntaxhighlighter.h | 2 ++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/plugins/texteditor/syntaxhighlighter.cpp b/src/plugins/texteditor/syntaxhighlighter.cpp index ebe2d9aaeb5..13bc6bba30e 100644 --- a/src/plugins/texteditor/syntaxhighlighter.cpp +++ b/src/plugins/texteditor/syntaxhighlighter.cpp @@ -43,11 +43,10 @@ namespace TextEditor { class SyntaxHighlighterPrivate { - SyntaxHighlighter *q_ptr; + SyntaxHighlighter *q_ptr = nullptr; Q_DECLARE_PUBLIC(SyntaxHighlighter) public: - inline SyntaxHighlighterPrivate() - : q_ptr(0), rehighlightPending(false), inReformatBlocks(false) + SyntaxHighlighterPrivate() { updateFormats(TextEditorSettings::fontSettings()); } @@ -70,12 +69,13 @@ public: QVector formatChanges; QTextBlock currentBlock; - bool rehighlightPending; - bool inReformatBlocks; + bool rehighlightPending = false; + bool inReformatBlocks = false; TextDocumentLayout::FoldValidator foldValidator; QVector formats; QVector> formatCategories; QTextCharFormat whitespaceFormat; + bool noAutomaticHighlighting = false; }; static bool adjustRange(QTextLayout::FormatRange &range, int from, int charsRemoved, int charsAdded) { @@ -315,9 +315,11 @@ void SyntaxHighlighter::setDocument(QTextDocument *doc) } d->doc = doc; if (d->doc) { - connect(d->doc, &QTextDocument::contentsChange, this, &SyntaxHighlighter::reformatBlocks); - d->rehighlightPending = true; - QTimer::singleShot(0, this, &SyntaxHighlighter::delayedRehighlight); + if (!d->noAutomaticHighlighting) { + connect(d->doc, &QTextDocument::contentsChange, this, &SyntaxHighlighter::reformatBlocks); + d->rehighlightPending = true; + QTimer::singleShot(0, this, &SyntaxHighlighter::delayedRehighlight); + } d->foldValidator.setup(qobject_cast(doc->documentLayout())); } } @@ -764,6 +766,15 @@ void SyntaxHighlighter::setFontSettings(const FontSettings &fontSettings) Q_D(SyntaxHighlighter); d->updateFormats(fontSettings); } +/*! + The syntax highlighter is not anymore reacting to the text document if \a noAutmatic is + \c true. +*/ +void SyntaxHighlighter::setNoAutomaticHighlighting(bool noAutomatic) +{ + Q_D(SyntaxHighlighter); + d->noAutomaticHighlighting = noAutomatic; +} /*! Creates text format categories for the text styles themselves, so the highlighter can diff --git a/src/plugins/texteditor/syntaxhighlighter.h b/src/plugins/texteditor/syntaxhighlighter.h index 56f526f04b1..629fe29b997 100644 --- a/src/plugins/texteditor/syntaxhighlighter.h +++ b/src/plugins/texteditor/syntaxhighlighter.h @@ -70,6 +70,8 @@ public: // Don't call in constructors of derived classes virtual void setFontSettings(const TextEditor::FontSettings &fontSettings); + void setNoAutomaticHighlighting(bool noAutomatic); + public slots: void rehighlight(); void rehighlightBlock(const QTextBlock &block);