diff --git a/src/plugins/texteditor/textdocumentlayout.cpp b/src/plugins/texteditor/textdocumentlayout.cpp index f82d9c446dd677a6932c06803f5aec4f5d5d84c8..f413b5c363acf1238d2690660b4b9eb58600765b 100644 --- a/src/plugins/texteditor/textdocumentlayout.cpp +++ b/src/plugins/texteditor/textdocumentlayout.cpp @@ -655,34 +655,27 @@ void TextDocumentLayout::FoldValidator::process(QTextBlock block) if (!previous.isValid()) return; - if ((TextDocumentLayout::isFolded(previous) - && !TextDocumentLayout::canFold(previous)) - || (!TextDocumentLayout::isFolded(previous) - && TextDocumentLayout::canFold(previous) - && previous.isVisible() - && !block.isVisible())) { - TextDocumentLayout::setFolded(previous, !TextDocumentLayout::isFolded(previous)); - } - - if (TextDocumentLayout::isFolded(previous) && !m_insideFold) - m_insideFold = TextDocumentLayout::foldingIndent(block); - - bool toggleVisibility = false; - if (m_insideFold) { - if (TextDocumentLayout::foldingIndent(block) >= m_insideFold) { - if (block.isVisible()) - toggleVisibility = true; - } else { + const bool preIsFolded = isFolded(previous); + const bool preCanFold = canFold(previous); + const bool isVisible = block.isVisible(); + + if (preIsFolded && !preCanFold) + setFolded(previous, false); + else if (!preIsFolded && preCanFold && previous.isVisible() && !isVisible) + setFolded(previous, true); + + if (isFolded(previous) && !m_insideFold) + m_insideFold = foldingIndent(block); + + bool shouldBeVisible = m_insideFold == 0; + if (!shouldBeVisible) { + shouldBeVisible = foldingIndent(block) < m_insideFold; + if (shouldBeVisible) m_insideFold = 0; - if (!block.isVisible()) - toggleVisibility = true; - } - } else if (!block.isVisible()) { - toggleVisibility = true; } - if (toggleVisibility) { - block.setVisible(!block.isVisible()); + if (shouldBeVisible != isVisible) { + block.setVisible(shouldBeVisible); block.setLineCount(block.isVisible() ? qMax(1, block.layout()->lineCount()) : 0); m_requestDocUpdate = true; }