diff options
-rw-r--r-- | src/plugins/texteditor/highlighter.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/plugins/texteditor/highlighter.cpp b/src/plugins/texteditor/highlighter.cpp index 07ec2fcf96..ee958795ae 100644 --- a/src/plugins/texteditor/highlighter.cpp +++ b/src/plugins/texteditor/highlighter.cpp @@ -274,9 +274,9 @@ void Highlighter::highlightBlock(const QString &text) { if (!definition().isValid()) return; - const QTextBlock block = currentBlock(); + QTextBlock block = currentBlock(); KSyntaxHighlighting::State state; - setCurrentBlockState(qMax(0, previousBlockState())); + TextDocumentLayout::setBraceDepth(block, TextDocumentLayout::braceDepth(block.previous())); if (TextBlockUserData *data = TextDocumentLayout::testUserData(block)) { state = data->syntaxState(); data->setFoldingStartIncluded(false); @@ -298,8 +298,11 @@ void Highlighter::highlightBlock(const QString &text) if (nextBlock.isValid()) { TextBlockUserData *data = TextDocumentLayout::userData(nextBlock); - data->setSyntaxState(state); - data->setFoldingIndent(currentBlockState()); + if (data->syntaxState() != state) { + data->setSyntaxState(state); + setCurrentBlockState(currentBlockState() ^ 1); // force rehighlight of next block + } + data->setFoldingIndent(TextDocumentLayout::braceDepth(block)); } formatSpaces(text); @@ -316,24 +319,24 @@ void Highlighter::applyFolding(int offset, { if (!region.isValid()) return; - const QTextBlock &block = currentBlock(); + QTextBlock block = currentBlock(); const QString &text = block.text(); TextBlockUserData *data = TextDocumentLayout::userData(currentBlock()); const bool fromStart = TabSettings::firstNonSpace(text) == offset; const bool toEnd = (offset + length) == (text.length() - TabSettings::trailingWhitespaces(text)); if (region.type() == KSyntaxHighlighting::FoldingRegion::Begin) { - setCurrentBlockState(currentBlockState() + 1); + TextDocumentLayout::changeBraceDepth(block, 1); // if there is only a folding begin in the line move the current block into the fold if (fromStart && toEnd) { - data->setFoldingIndent(currentBlockState()); + data->setFoldingIndent(TextDocumentLayout::braceDepth(block)); data->setFoldingStartIncluded(true); } } else if (region.type() == KSyntaxHighlighting::FoldingRegion::End) { - setCurrentBlockState(qMax(0, currentBlockState() - 1)); + TextDocumentLayout::changeBraceDepth(block, -1); // if the folding end is at the end of the line move the current block into the fold if (toEnd) data->setFoldingEndIncluded(true); else - data->setFoldingIndent(currentBlockState()); + data->setFoldingIndent(TextDocumentLayout::braceDepth(block)); } } |