diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-09-29 11:20:01 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-10-05 14:29:38 +0000 |
commit | 0be824000262882023b2b48b5eab0786f3db379b (patch) | |
tree | ca5ec65f91274f350b0d14a4338f08ae4c87e4b6 /src/plugins/diffeditor | |
parent | 7842a309cea2f6f542cce7c502a9b5ee490747dd (diff) | |
download | qt-creator-0be824000262882023b2b48b5eab0786f3db379b.tar.gz |
Add folding to Unified diff editor
Add folding for files and chunks.
Change-Id: I0dd278d0bc69208a0c9c116b94e4ead7aec5fede
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Diffstat (limited to 'src/plugins/diffeditor')
-rw-r--r-- | src/plugins/diffeditor/unifieddiffeditorwidget.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
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 <QHash> #include <QMenu> #include <QPainter> #include <QScrollBar> @@ -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 <block number> 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<int, int> foldingIndent; + QMap<int, QList<DiffSelection> > 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); |