From 0be824000262882023b2b48b5eab0786f3db379b Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 29 Sep 2017 11:20:01 +0200 Subject: Add folding to Unified diff editor Add folding for files and chunks. Change-Id: I0dd278d0bc69208a0c9c116b94e4ead7aec5fede Reviewed-by: Jarek Kobus --- src/plugins/diffeditor/unifieddiffeditorwidget.cpp | 25 +++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/plugins/diffeditor/unifieddiffeditorwidget.cpp') diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp index c2b75c9495..61b62d9b51 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp @@ -29,6 +29,7 @@ #include "diffeditordocument.h" #include "diffutils.h" +#include #include #include #include @@ -58,7 +59,6 @@ UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent) settings.m_textWrapping = false; settings.m_displayLineNumbers = true; settings.m_highlightCurrentLine = false; - settings.m_displayFoldingMarkers = true; settings.m_markTextChanges = false; settings.m_highlightBlocks = false; SelectableTextEditorWidget::setDisplaySettings(settings); @@ -82,6 +82,7 @@ UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent) m_context->setWidget(this); m_context->setContext(Core::Context(Constants::UNIFIED_VIEW_ID)); Core::ICore::addContextObject(m_context); + setCodeFoldingSupported(true); } UnifiedDiffEditorWidget::~UnifiedDiffEditorWidget() @@ -131,6 +132,7 @@ void UnifiedDiffEditorWidget::setDisplaySettings(const DisplaySettings &ds) { DisplaySettings settings = displaySettings(); settings.m_visualizeWhitespace = ds.m_visualizeWhitespace; + settings.m_displayFoldingMarkers = ds.m_displayFoldingMarkers; SelectableTextEditorWidget::setDisplaySettings(settings); } @@ -449,6 +451,13 @@ QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData, return diffText; } + +static void setFoldingIndent(const QTextBlock &block, int indent) +{ + if (TextEditor::TextBlockUserData *userData = TextEditor::TextDocumentLayout::userData(block)) + userData->setFoldingIndent(indent); +} + void UnifiedDiffEditorWidget::showDiff() { QString diffText; @@ -456,6 +465,11 @@ void UnifiedDiffEditorWidget::showDiff() int blockNumber = 0; int charNumber = 0; + // 'foldingIndent' is populated with and folding indentation + // value where 1 indicates start of new file and 2 indicates a diff chunk. + // Remaining lines (diff contents) are assigned 3. + QHash foldingIndent; + QMap > selections; for (const FileData &fileData : m_controller.m_contextFileData) { @@ -465,7 +479,9 @@ void UnifiedDiffEditorWidget::showDiff() + fileData.rightFileInfo.fileName + QLatin1Char('\n'); setFileInfo(blockNumber, fileData.leftFileInfo, fileData.rightFileInfo); selections[blockNumber].append(DiffSelection(&m_controller.m_fileLineFormat)); + foldingIndent.insert(blockNumber, 1); blockNumber++; + foldingIndent.insert(blockNumber, 1); selections[blockNumber].append(DiffSelection(&m_controller.m_fileLineFormat)); blockNumber++; @@ -474,6 +490,7 @@ void UnifiedDiffEditorWidget::showDiff() charNumber += leftFileInfo.count() + rightFileInfo.count(); if (fileData.binaryFiles) { + foldingIndent.insert(blockNumber, 2); selections[blockNumber].append(DiffSelection(&m_controller.m_chunkLineFormat)); blockNumber++; const QString binaryLine = QLatin1String("Binary files ") @@ -486,6 +503,7 @@ void UnifiedDiffEditorWidget::showDiff() } else { for (int j = 0; j < fileData.chunks.count(); j++) { const int oldBlockNumber = blockNumber; + foldingIndent.insert(blockNumber, 2); diffText += showChunk(fileData.chunks.at(j), (j == fileData.chunks.count() - 1) && fileData.lastChunkAtTheEndOfFile, @@ -508,6 +526,11 @@ void UnifiedDiffEditorWidget::showDiff() const bool oldIgnore = m_controller.m_ignoreCurrentIndexChange; m_controller.m_ignoreCurrentIndexChange = true; setPlainText(diffText); + + QTextBlock block = document()->firstBlock(); + for (int b = 0; block.isValid(); block = block.next(), ++b) + setFoldingIndent(block, foldingIndent.value(b, 3)); + m_controller.m_ignoreCurrentIndexChange = oldIgnore; setSelections(selections); -- cgit v1.2.1