forked from qt-creator/qt-creator
TextEditor: force rehighlight of next block if state changed
If the user state of a block changes while it gets highlighted the next block will be rehighlighted too. Currently we store the indentation depth in the block user state. So in order to store the indentation depth _and_ the information whether the next block needs to be rehighlighted we bit shift the indentation depth via the brace depth helper functions from TextDocumentLayaout. And we cannot store the struct KSyntaxHighlighting::State in the block user state (int) directly to indicate that the next block also needs a rehighlight so we toggle just the last bit of the user state. Fixes: QTCREATORBUG-22290 Change-Id: I632f4416a725dc5fa1667bcab34fb2701294c9b8 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user