void JSEdit::unfold(int line) { QTextBlock startBlock = document()->findBlockByNumber(line - 1); int endPos = findClosingConstruct(startBlock); QTextBlock block = startBlock.next(); while (block.isValid() && !block.isVisible()) { block.setVisible(true); block.setLineCount(block.layout()->lineCount()); endPos = block.position() + block.length(); block = block.next(); } document()->markContentsDirty(startBlock.position(), endPos - startBlock.position() + 1); updateSidebar(); update(); JSDocLayout *layout = reinterpret_cast<JSDocLayout*>(document()->documentLayout()); layout->forceUpdate(); }
void BaseTextDocumentLayout::FoldValidator::process(QTextBlock block) { if (!m_layout) return; const QTextBlock &previous = block.previous(); if (!previous.isValid()) return; if ((BaseTextDocumentLayout::isFolded(previous) && !BaseTextDocumentLayout::canFold(previous)) || (!BaseTextDocumentLayout::isFolded(previous) && BaseTextDocumentLayout::canFold(previous) && !block.isVisible())) { BaseTextDocumentLayout::setFolded(previous, !BaseTextDocumentLayout::isFolded(previous)); } if (BaseTextDocumentLayout::isFolded(previous) && !m_insideFold) m_insideFold = BaseTextDocumentLayout::foldingIndent(block); bool toggleVisibility = false; if (m_insideFold) { if (BaseTextDocumentLayout::foldingIndent(block) >= m_insideFold) { if (block.isVisible()) toggleVisibility = true; } else { m_insideFold = 0; if (!block.isVisible()) toggleVisibility = true; } } else if (!block.isVisible()) { toggleVisibility = true; } if (toggleVisibility) { block.setVisible(!block.isVisible()); block.setLineCount(block.isVisible() ? qMax(1, block.layout()->lineCount()) : 0); m_requestDocUpdate = true; } }
void NCEdit::fold(int line) { QTextBlock startBlock = document()->findBlockByNumber(line - 1); int endPos = findClosingConstruct(startBlock); if (endPos < 0) return; QTextBlock endBlock = document()->findBlock(endPos); QTextBlock block = startBlock.next(); while (block.isValid() && block != endBlock) { block.setVisible(false); block.setLineCount(0); block = block.next(); } document()->markContentsDirty(startBlock.position(), endPos - startBlock.position() + 1); updateSidebar(); update(); NCDocLayout *layout = reinterpret_cast<NCDocLayout*>(document()->documentLayout()); layout->forceUpdate(); }
void BaseTextDocumentLayout::doFoldOrUnfold(const QTextBlock& block, bool unfold) { if (!canFold(block)) return; QTextBlock b = block.next(); int indent = foldingIndent(block); while (b.isValid() && foldingIndent(b) > indent && (unfold || b.next().isValid())) { b.setVisible(unfold); b.setLineCount(unfold? qMax(1, b.layout()->lineCount()) : 0); if (unfold) { // do not unfold folded sub-blocks if (isFolded(b) && b.next().isValid()) { int jndent = foldingIndent(b); b = b.next(); while (b.isValid() && foldingIndent(b) > jndent) b = b.next(); continue; } } b = b.next(); } setFolded(block, !unfold); }
void TextBlockUserData::doCollapse(const QTextBlock& block, bool visible) { QTextBlock info = block; if (block.userData() && static_cast<TextBlockUserData*>(block.userData())->collapseMode() == CollapseAfter) ; else if (block.next().userData() && static_cast<TextBlockUserData*>(block.next().userData())->collapseMode() == TextBlockUserData::CollapseThis) info = block.next(); else { if (visible && !block.next().isVisible()) { // no match, at least unfold! QTextBlock b = block.next(); while (b.isValid() && !b.isVisible()) { b.setVisible(true); b.setLineCount(visible ? qMax(1, b.layout()->lineCount()) : 0); b = b.next(); } } return; } int pos = static_cast<TextBlockUserData*>(info.userData())->collapseAtPos(); if (pos < 0) return; QTextCursor cursor(info); cursor.setPosition(cursor.position() + pos); if (matchCursorForward(&cursor) != Match) { if (visible) { // no match, at least unfold! QTextBlock b = block.next(); while (b.isValid() && !b.isVisible()) { b.setVisible(true); b.setLineCount(visible ? qMax(1, b.layout()->lineCount()) : 0); b = b.next(); } } return; } QTextBlock b = block.next(); while (b < cursor.block()) { b.setVisible(visible); b.setLineCount(visible ? qMax(1, b.layout()->lineCount()) : 0); if (visible) { TextBlockUserData *data = canCollapse(b); if (data && data->collapsed()) { QTextBlock end = testCollapse(b); if (data->collapseIncludesClosure()) end = end.next(); if (end.isValid()) { b = end; continue; } } } b = b.next(); } bool collapseIncludesClosure = hasClosingCollapseAtEnd(b); if (collapseIncludesClosure) { b.setVisible(visible); b.setLineCount(visible ? qMax(1, b.layout()->lineCount()) : 0); } static_cast<TextBlockUserData*>(info.userData())->setCollapseIncludesClosure(collapseIncludesClosure); static_cast<TextBlockUserData*>(info.userData())->setCollapsed(!block.next().isVisible()); }