Commit b9b69bac authored by Marco Bubke's avatar Marco Bubke

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's avatarDavid Schulz <david.schulz@qt.io>
parent 19cdb75a
......@@ -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<QTextCharFormat> formatChanges;
QTextBlock currentBlock;
bool rehighlightPending;
bool inReformatBlocks;
bool rehighlightPending = false;
bool inReformatBlocks = false;
TextDocumentLayout::FoldValidator foldValidator;
QVector<QTextCharFormat> formats;
QVector<std::pair<int,TextStyle>> 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<TextDocumentLayout *>(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
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment