forked from qt-creator/qt-creator
Add folding to Unified diff editor
Add folding for files and chunks. Change-Id: I0dd278d0bc69208a0c9c116b94e4ead7aec5fede Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user