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 "diffeditordocument.h"
|
||||||
#include "diffutils.h"
|
#include "diffutils.h"
|
||||||
|
|
||||||
|
#include <QHash>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
@@ -58,7 +59,6 @@ UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent)
|
|||||||
settings.m_textWrapping = false;
|
settings.m_textWrapping = false;
|
||||||
settings.m_displayLineNumbers = true;
|
settings.m_displayLineNumbers = true;
|
||||||
settings.m_highlightCurrentLine = false;
|
settings.m_highlightCurrentLine = false;
|
||||||
settings.m_displayFoldingMarkers = true;
|
|
||||||
settings.m_markTextChanges = false;
|
settings.m_markTextChanges = false;
|
||||||
settings.m_highlightBlocks = false;
|
settings.m_highlightBlocks = false;
|
||||||
SelectableTextEditorWidget::setDisplaySettings(settings);
|
SelectableTextEditorWidget::setDisplaySettings(settings);
|
||||||
@@ -82,6 +82,7 @@ UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent)
|
|||||||
m_context->setWidget(this);
|
m_context->setWidget(this);
|
||||||
m_context->setContext(Core::Context(Constants::UNIFIED_VIEW_ID));
|
m_context->setContext(Core::Context(Constants::UNIFIED_VIEW_ID));
|
||||||
Core::ICore::addContextObject(m_context);
|
Core::ICore::addContextObject(m_context);
|
||||||
|
setCodeFoldingSupported(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
UnifiedDiffEditorWidget::~UnifiedDiffEditorWidget()
|
UnifiedDiffEditorWidget::~UnifiedDiffEditorWidget()
|
||||||
@@ -131,6 +132,7 @@ void UnifiedDiffEditorWidget::setDisplaySettings(const DisplaySettings &ds)
|
|||||||
{
|
{
|
||||||
DisplaySettings settings = displaySettings();
|
DisplaySettings settings = displaySettings();
|
||||||
settings.m_visualizeWhitespace = ds.m_visualizeWhitespace;
|
settings.m_visualizeWhitespace = ds.m_visualizeWhitespace;
|
||||||
|
settings.m_displayFoldingMarkers = ds.m_displayFoldingMarkers;
|
||||||
SelectableTextEditorWidget::setDisplaySettings(settings);
|
SelectableTextEditorWidget::setDisplaySettings(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -449,6 +451,13 @@ QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData,
|
|||||||
return diffText;
|
return diffText;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void setFoldingIndent(const QTextBlock &block, int indent)
|
||||||
|
{
|
||||||
|
if (TextEditor::TextBlockUserData *userData = TextEditor::TextDocumentLayout::userData(block))
|
||||||
|
userData->setFoldingIndent(indent);
|
||||||
|
}
|
||||||
|
|
||||||
void UnifiedDiffEditorWidget::showDiff()
|
void UnifiedDiffEditorWidget::showDiff()
|
||||||
{
|
{
|
||||||
QString diffText;
|
QString diffText;
|
||||||
@@ -456,6 +465,11 @@ void UnifiedDiffEditorWidget::showDiff()
|
|||||||
int blockNumber = 0;
|
int blockNumber = 0;
|
||||||
int charNumber = 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;
|
QMap<int, QList<DiffSelection> > selections;
|
||||||
|
|
||||||
for (const FileData &fileData : m_controller.m_contextFileData) {
|
for (const FileData &fileData : m_controller.m_contextFileData) {
|
||||||
@@ -465,7 +479,9 @@ void UnifiedDiffEditorWidget::showDiff()
|
|||||||
+ fileData.rightFileInfo.fileName + QLatin1Char('\n');
|
+ fileData.rightFileInfo.fileName + QLatin1Char('\n');
|
||||||
setFileInfo(blockNumber, fileData.leftFileInfo, fileData.rightFileInfo);
|
setFileInfo(blockNumber, fileData.leftFileInfo, fileData.rightFileInfo);
|
||||||
selections[blockNumber].append(DiffSelection(&m_controller.m_fileLineFormat));
|
selections[blockNumber].append(DiffSelection(&m_controller.m_fileLineFormat));
|
||||||
|
foldingIndent.insert(blockNumber, 1);
|
||||||
blockNumber++;
|
blockNumber++;
|
||||||
|
foldingIndent.insert(blockNumber, 1);
|
||||||
selections[blockNumber].append(DiffSelection(&m_controller.m_fileLineFormat));
|
selections[blockNumber].append(DiffSelection(&m_controller.m_fileLineFormat));
|
||||||
blockNumber++;
|
blockNumber++;
|
||||||
|
|
||||||
@@ -474,6 +490,7 @@ void UnifiedDiffEditorWidget::showDiff()
|
|||||||
charNumber += leftFileInfo.count() + rightFileInfo.count();
|
charNumber += leftFileInfo.count() + rightFileInfo.count();
|
||||||
|
|
||||||
if (fileData.binaryFiles) {
|
if (fileData.binaryFiles) {
|
||||||
|
foldingIndent.insert(blockNumber, 2);
|
||||||
selections[blockNumber].append(DiffSelection(&m_controller.m_chunkLineFormat));
|
selections[blockNumber].append(DiffSelection(&m_controller.m_chunkLineFormat));
|
||||||
blockNumber++;
|
blockNumber++;
|
||||||
const QString binaryLine = QLatin1String("Binary files ")
|
const QString binaryLine = QLatin1String("Binary files ")
|
||||||
@@ -486,6 +503,7 @@ void UnifiedDiffEditorWidget::showDiff()
|
|||||||
} else {
|
} else {
|
||||||
for (int j = 0; j < fileData.chunks.count(); j++) {
|
for (int j = 0; j < fileData.chunks.count(); j++) {
|
||||||
const int oldBlockNumber = blockNumber;
|
const int oldBlockNumber = blockNumber;
|
||||||
|
foldingIndent.insert(blockNumber, 2);
|
||||||
diffText += showChunk(fileData.chunks.at(j),
|
diffText += showChunk(fileData.chunks.at(j),
|
||||||
(j == fileData.chunks.count() - 1)
|
(j == fileData.chunks.count() - 1)
|
||||||
&& fileData.lastChunkAtTheEndOfFile,
|
&& fileData.lastChunkAtTheEndOfFile,
|
||||||
@@ -508,6 +526,11 @@ void UnifiedDiffEditorWidget::showDiff()
|
|||||||
const bool oldIgnore = m_controller.m_ignoreCurrentIndexChange;
|
const bool oldIgnore = m_controller.m_ignoreCurrentIndexChange;
|
||||||
m_controller.m_ignoreCurrentIndexChange = true;
|
m_controller.m_ignoreCurrentIndexChange = true;
|
||||||
setPlainText(diffText);
|
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;
|
m_controller.m_ignoreCurrentIndexChange = oldIgnore;
|
||||||
|
|
||||||
setSelections(selections);
|
setSelections(selections);
|
||||||
|
Reference in New Issue
Block a user