aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/diffeditor
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2017-09-29 11:20:01 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2017-10-05 14:29:38 +0000
commit0be824000262882023b2b48b5eab0786f3db379b (patch)
treeca5ec65f91274f350b0d14a4338f08ae4c87e4b6 /src/plugins/diffeditor
parent7842a309cea2f6f542cce7c502a9b5ee490747dd (diff)
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.cpp25
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);