UnifiedDiffEditor: Refactor internal data

This is a preparation step before making diff showing more
interactive.

Change-Id: I149b76466c3ccce05d823bac91fe89ac806b9130
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Jarek Kobus
2022-09-22 11:00:38 +02:00
parent c369e1cc6e
commit 8d284c222c
4 changed files with 132 additions and 105 deletions

View File

@@ -213,7 +213,7 @@ void DiffEditorWidgetController::addCodePasterAction(QMenu *menu, int fileIndex,
if (ExtensionSystem::PluginManager::getObject<CodePaster::Service>()) { if (ExtensionSystem::PluginManager::getObject<CodePaster::Service>()) {
// optional code pasting service // optional code pasting service
QAction *sendChunkToCodePasterAction = menu->addAction(tr("Send Chunk to CodePaster...")); QAction *sendChunkToCodePasterAction = menu->addAction(tr("Send Chunk to CodePaster..."));
connect(sendChunkToCodePasterAction, &QAction::triggered, this, [this, fileIndex, chunkIndex]() { connect(sendChunkToCodePasterAction, &QAction::triggered, this, [this, fileIndex, chunkIndex] {
sendChunkToCodePaster(fileIndex, chunkIndex); sendChunkToCodePaster(fileIndex, chunkIndex);
}); });
} }
@@ -257,7 +257,7 @@ bool DiffEditorWidgetController::fileNamesAreDifferent(int fileIndex) const
void DiffEditorWidgetController::addApplyAction(QMenu *menu, int fileIndex, int chunkIndex) void DiffEditorWidgetController::addApplyAction(QMenu *menu, int fileIndex, int chunkIndex)
{ {
QAction *applyAction = menu->addAction(tr("Apply Chunk...")); QAction *applyAction = menu->addAction(tr("Apply Chunk..."));
connect(applyAction, &QAction::triggered, this, [this, fileIndex, chunkIndex]() { connect(applyAction, &QAction::triggered, this, [this, fileIndex, chunkIndex] {
patch(false, fileIndex, chunkIndex); patch(false, fileIndex, chunkIndex);
}); });
applyAction->setEnabled(chunkExists(fileIndex, chunkIndex) && fileNamesAreDifferent(fileIndex)); applyAction->setEnabled(chunkExists(fileIndex, chunkIndex) && fileNamesAreDifferent(fileIndex));
@@ -266,7 +266,7 @@ void DiffEditorWidgetController::addApplyAction(QMenu *menu, int fileIndex, int
void DiffEditorWidgetController::addRevertAction(QMenu *menu, int fileIndex, int chunkIndex) void DiffEditorWidgetController::addRevertAction(QMenu *menu, int fileIndex, int chunkIndex)
{ {
QAction *revertAction = menu->addAction(tr("Revert Chunk...")); QAction *revertAction = menu->addAction(tr("Revert Chunk..."));
connect(revertAction, &QAction::triggered, this, [this, fileIndex, chunkIndex]() { connect(revertAction, &QAction::triggered, this, [this, fileIndex, chunkIndex] {
patch(true, fileIndex, chunkIndex); patch(true, fileIndex, chunkIndex);
}); });
revertAction->setEnabled(chunkExists(fileIndex, chunkIndex)); revertAction->setEnabled(chunkExists(fileIndex, chunkIndex));
@@ -293,7 +293,7 @@ void DiffEditorWidgetController::updateCannotDecodeInfo()
tr("<b>Error:</b> Could not decode \"%1\" with \"%2\"-encoding.") tr("<b>Error:</b> Could not decode \"%1\" with \"%2\"-encoding.")
.arg(m_document->displayName(), .arg(m_document->displayName(),
QString::fromLatin1(m_document->codec()->name()))); QString::fromLatin1(m_document->codec()->name())));
info.addCustomButton(tr("Select Encoding"), [this]() { m_document->selectEncoding(); }); info.addCustomButton(tr("Select Encoding"), [this] { m_document->selectEncoding(); });
infoBar->addInfo(info); infoBar->addInfo(info);
} else { } else {
infoBar->removeInfo(selectEncodingId); infoBar->removeInfo(selectEncodingId);
@@ -318,5 +318,16 @@ void DiffEditorWidgetController::sendChunkToCodePaster(int fileIndex, int chunkI
pasteService->postText(patch, Constants::DIFF_EDITOR_MIMETYPE); pasteService->postText(patch, Constants::DIFF_EDITOR_MIMETYPE);
} }
DiffEditorInput::DiffEditorInput(DiffEditorWidgetController *controller)
: m_contextFileData(controller->m_contextFileData)
, m_fileLineFormat(&controller->m_fileLineFormat)
, m_chunkLineFormat(&controller->m_chunkLineFormat)
, m_leftLineFormat(&controller->m_leftLineFormat)
, m_rightLineFormat(&controller->m_rightLineFormat)
, m_leftCharFormat(&controller->m_leftCharFormat)
, m_rightCharFormat(&controller->m_rightCharFormat)
{ }
} // namespace Internal } // namespace Internal
} // namespace DiffEditor } // namespace DiffEditor

View File

@@ -74,5 +74,18 @@ private:
QTimer m_timer; QTimer m_timer;
}; };
class DiffEditorInput
{
public:
DiffEditorInput(DiffEditorWidgetController *controller);
QList<FileData> m_contextFileData;
QTextCharFormat *m_fileLineFormat = nullptr;
QTextCharFormat *m_chunkLineFormat = nullptr;
QTextCharFormat *m_leftLineFormat = nullptr;
QTextCharFormat *m_rightLineFormat = nullptr;
QTextCharFormat *m_leftCharFormat = nullptr;
QTextCharFormat *m_rightCharFormat = nullptr;
};
} // namespace Internal } // namespace Internal
} // namespace DiffEditor } // namespace DiffEditor

View File

@@ -178,8 +178,8 @@ void UnifiedDiffEditorWidget::contextMenuEvent(QContextMenuEvent *e)
if (currentChunkIndex > chunkIndex) if (currentChunkIndex > chunkIndex)
break; break;
const int leftRow = m_leftLineNumbers.value(i, qMakePair(-1, -1)).second; const int leftRow = m_data.m_leftLineNumbers.value(i, qMakePair(-1, -1)).second;
const int rightRow = m_rightLineNumbers.value(i, qMakePair(-1, -1)).second; const int rightRow = m_data.m_rightLineNumbers.value(i, qMakePair(-1, -1)).second;
if (leftRow >= 0) if (leftRow >= 0)
leftSelection.append(leftRow); leftSelection.append(leftRow);
@@ -212,13 +212,8 @@ void UnifiedDiffEditorWidget::addContextMenuActions(QMenu *menu,
void UnifiedDiffEditorWidget::clear(const QString &message) void UnifiedDiffEditorWidget::clear(const QString &message)
{ {
m_leftLineNumberDigits = 1; m_data = {};
m_rightLineNumberDigits = 1; setSelections({});
m_leftLineNumbers.clear();
m_rightLineNumbers.clear();
m_fileInfo.clear();
m_chunkInfo.clear();
setSelections(QMap<int, QList<DiffSelection> >());
const GuardLocker locker(m_controller.m_ignoreChanges); const GuardLocker locker(m_controller.m_ignoreChanges);
SelectableTextEditorWidget::clear(); SelectableTextEditorWidget::clear();
@@ -230,22 +225,22 @@ QString UnifiedDiffEditorWidget::lineNumber(int blockNumber) const
{ {
QString lineNumberString; QString lineNumberString;
const bool leftLineExists = m_leftLineNumbers.contains(blockNumber); const bool leftLineExists = m_data.m_leftLineNumbers.contains(blockNumber);
const bool rightLineExists = m_rightLineNumbers.contains(blockNumber); const bool rightLineExists = m_data.m_rightLineNumbers.contains(blockNumber);
if (leftLineExists || rightLineExists) { if (leftLineExists || rightLineExists) {
const QString leftLine = leftLineExists const QString leftLine = leftLineExists
? QString::number(m_leftLineNumbers.value(blockNumber).first) ? QString::number(m_data.m_leftLineNumbers.value(blockNumber).first)
: QString(); : QString();
lineNumberString += QString(m_leftLineNumberDigits - leftLine.count(), lineNumberString += QString(m_data.m_leftLineNumberDigits - leftLine.count(),
' ') + leftLine; ' ') + leftLine;
lineNumberString += '|'; lineNumberString += '|';
const QString rightLine = rightLineExists const QString rightLine = rightLineExists
? QString::number(m_rightLineNumbers.value(blockNumber).first) ? QString::number(m_data.m_rightLineNumbers.value(blockNumber).first)
: QString(); : QString();
lineNumberString += QString(m_rightLineNumberDigits - rightLine.count(), lineNumberString += QString(m_data.m_rightLineNumberDigits - rightLine.count(),
' ') + rightLine; ' ') + rightLine;
} }
return lineNumberString; return lineNumberString;
@@ -253,37 +248,30 @@ QString UnifiedDiffEditorWidget::lineNumber(int blockNumber) const
int UnifiedDiffEditorWidget::lineNumberDigits() const int UnifiedDiffEditorWidget::lineNumberDigits() const
{ {
return m_leftLineNumberDigits + m_rightLineNumberDigits + 1; return m_data.m_leftLineNumberDigits + m_data.m_rightLineNumberDigits + 1;
} }
void UnifiedDiffEditorWidget::setLeftLineNumber(int blockNumber, int lineNumber, void UnifiedDiffData::setLeftLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk)
int rowNumberInChunk)
{ {
const QString lineNumberString = QString::number(lineNumber); const QString lineNumberString = QString::number(lineNumber);
m_leftLineNumbers.insert(blockNumber, qMakePair(lineNumber, rowNumberInChunk)); m_leftLineNumbers.insert(blockNumber, qMakePair(lineNumber, rowNumberInChunk));
m_leftLineNumberDigits = qMax(m_leftLineNumberDigits, m_leftLineNumberDigits = qMax(m_leftLineNumberDigits, lineNumberString.count());
lineNumberString.count());
} }
void UnifiedDiffEditorWidget::setRightLineNumber(int blockNumber, int lineNumber, void UnifiedDiffData::setRightLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk)
int rowNumberInChunk)
{ {
const QString lineNumberString = QString::number(lineNumber); const QString lineNumberString = QString::number(lineNumber);
m_rightLineNumbers.insert(blockNumber, qMakePair(lineNumber, rowNumberInChunk)); m_rightLineNumbers.insert(blockNumber, qMakePair(lineNumber, rowNumberInChunk));
m_rightLineNumberDigits = qMax(m_rightLineNumberDigits, m_rightLineNumberDigits = qMax(m_rightLineNumberDigits, lineNumberString.count());
lineNumberString.count());
} }
void UnifiedDiffEditorWidget::setFileInfo(int blockNumber, void UnifiedDiffData::setFileInfo(int blockNumber, const DiffFileInfo &leftInfo,
const DiffFileInfo &leftFileInfo, const DiffFileInfo &rightInfo)
const DiffFileInfo &rightFileInfo)
{ {
m_fileInfo[blockNumber] = qMakePair(leftFileInfo, rightFileInfo); m_fileInfo[blockNumber] = qMakePair(leftInfo, rightInfo);
} }
void UnifiedDiffEditorWidget::setChunkIndex(int startBlockNumber, void UnifiedDiffData::setChunkIndex(int startBlockNumber, int blockCount, int chunkIndex)
int blockCount,
int chunkIndex)
{ {
m_chunkInfo.insert(startBlockNumber, qMakePair(blockCount, chunkIndex)); m_chunkInfo.insert(startBlockNumber, qMakePair(blockCount, chunkIndex));
} }
@@ -296,10 +284,8 @@ void UnifiedDiffEditorWidget::setDiff(const QList<FileData> &diffFileList)
showDiff(); showDiff();
} }
QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData, QString UnifiedDiffData::showChunk(const DiffEditorInput &input, const ChunkData &chunkData,
bool lastChunk, bool lastChunk, int *blockNumber, int *charNumber,
int *blockNumber,
int *charNumber,
QMap<int, QList<DiffSelection>> *selections) QMap<int, QList<DiffSelection>> *selections)
{ {
if (chunkData.contextChunk) if (chunkData.contextChunk)
@@ -313,7 +299,7 @@ QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData,
QList<TextLineData> leftBuffer, rightBuffer; QList<TextLineData> leftBuffer, rightBuffer;
QList<int> leftRowsBuffer, rightRowsBuffer; QList<int> leftRowsBuffer, rightRowsBuffer;
(*selections)[*blockNumber].append(DiffSelection(&m_controller.m_chunkLineFormat)); (*selections)[*blockNumber].append(DiffSelection(input.m_chunkLineFormat));
int lastEqualRow = -1; int lastEqualRow = -1;
if (lastChunk) { if (lastChunk) {
@@ -346,7 +332,7 @@ QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData,
const int blockDelta = line.count('\n'); // no new line const int blockDelta = line.count('\n'); // no new line
// could have been added // could have been added
for (int k = 0; k < blockDelta; k++) for (int k = 0; k < blockDelta; k++)
(*selections)[*blockNumber + blockCount + 1 + k].append(&m_controller.m_leftLineFormat); (*selections)[*blockNumber + blockCount + 1 + k].append(input.m_leftLineFormat);
for (auto it = lineData.changedPositions.cbegin(), for (auto it = lineData.changedPositions.cbegin(),
end = lineData.changedPositions.cend(); it != end; ++it) { end = lineData.changedPositions.cend(); it != end; ++it) {
@@ -355,7 +341,7 @@ QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData,
const int endPos = it.value() < 0 const int endPos = it.value() < 0
? it.value() : it.value() + 1; ? it.value() : it.value() + 1;
(*selections)[*blockNumber + blockCount + 1].append( (*selections)[*blockNumber + blockCount + 1].append(
DiffSelection(startPos, endPos, &m_controller.m_leftCharFormat)); DiffSelection(startPos, endPos, input.m_leftCharFormat));
} }
if (!line.isEmpty()) { if (!line.isEmpty()) {
@@ -388,7 +374,7 @@ QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData,
// could have been added // could have been added
for (int k = 0; k < blockDelta; k++) for (int k = 0; k < blockDelta; k++)
(*selections)[*blockNumber + blockCount + 1 + k].append(&m_controller.m_rightLineFormat); (*selections)[*blockNumber + blockCount + 1 + k].append(input.m_rightLineFormat);
for (auto it = lineData.changedPositions.cbegin(), for (auto it = lineData.changedPositions.cbegin(),
end = lineData.changedPositions.cend(); it != end; ++it) { end = lineData.changedPositions.cend(); it != end; ++it) {
@@ -397,7 +383,7 @@ QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData,
const int endPos = it.value() < 0 const int endPos = it.value() < 0
? it.value() : it.value() + 1; ? it.value() : it.value() + 1;
(*selections)[*blockNumber + blockCount + 1].append (*selections)[*blockNumber + blockCount + 1].append
(DiffSelection(startPos, endPos, &m_controller.m_rightCharFormat)); (DiffSelection(startPos, endPos, input.m_rightCharFormat));
} }
if (!line.isEmpty()) { if (!line.isEmpty()) {
@@ -471,93 +457,93 @@ QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData,
return diffText; return diffText;
} }
void UnifiedDiffEditorWidget::showDiff() UnifiedDiffOutput UnifiedDiffData::showDiff(const DiffEditorInput &input)
{ {
QString diffText; UnifiedDiffOutput output;
int blockNumber = 0; int blockNumber = 0;
int charNumber = 0; int charNumber = 0;
// 'foldingIndent' is populated with <block number> and folding indentation for (const FileData &fileData : qAsConst(input.m_contextFileData)) {
// 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 : qAsConst(m_controller.m_contextFileData)) {
const QString leftFileInfo = "--- " + fileData.leftFileInfo.fileName + '\n'; const QString leftFileInfo = "--- " + fileData.leftFileInfo.fileName + '\n';
const QString rightFileInfo = "+++ " + fileData.rightFileInfo.fileName + '\n'; const QString rightFileInfo = "+++ " + fileData.rightFileInfo.fileName + '\n';
setFileInfo(blockNumber, fileData.leftFileInfo, fileData.rightFileInfo); setFileInfo(blockNumber, fileData.leftFileInfo, fileData.rightFileInfo);
foldingIndent.insert(blockNumber, 1); output.foldingIndent.insert(blockNumber, 1);
selections[blockNumber].append(DiffSelection(&m_controller.m_fileLineFormat)); output.selections[blockNumber].append(DiffSelection(input.m_fileLineFormat));
blockNumber++; blockNumber++;
foldingIndent.insert(blockNumber, 1); output.foldingIndent.insert(blockNumber, 1);
selections[blockNumber].append(DiffSelection(&m_controller.m_fileLineFormat)); output.selections[blockNumber].append(DiffSelection(input.m_fileLineFormat));
blockNumber++; blockNumber++;
diffText += leftFileInfo; output.diffText += leftFileInfo;
diffText += rightFileInfo; output.diffText += rightFileInfo;
charNumber += leftFileInfo.count() + rightFileInfo.count(); charNumber += leftFileInfo.count() + rightFileInfo.count();
if (fileData.binaryFiles) { if (fileData.binaryFiles) {
foldingIndent.insert(blockNumber, 2); output.foldingIndent.insert(blockNumber, 2);
selections[blockNumber].append(DiffSelection(&m_controller.m_chunkLineFormat)); output.selections[blockNumber].append(DiffSelection(input.m_chunkLineFormat));
blockNumber++; blockNumber++;
const QString binaryLine = "Binary files " const QString binaryLine = "Binary files "
+ fileData.leftFileInfo.fileName + fileData.leftFileInfo.fileName
+ " and " + " and "
+ fileData.rightFileInfo.fileName + fileData.rightFileInfo.fileName
+ " differ\n"; + " differ\n";
diffText += binaryLine; output.diffText += binaryLine;
charNumber += binaryLine.count(); charNumber += binaryLine.count();
} 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); output.foldingIndent.insert(blockNumber, 2);
diffText += showChunk(fileData.chunks.at(j), output.diffText += showChunk(input, fileData.chunks.at(j),
(j == fileData.chunks.count() - 1) (j == fileData.chunks.count() - 1)
&& fileData.lastChunkAtTheEndOfFile, && fileData.lastChunkAtTheEndOfFile,
&blockNumber, &blockNumber,
&charNumber, &charNumber,
&selections); &output.selections);
if (!fileData.chunks.at(j).contextChunk) if (!fileData.chunks.at(j).contextChunk)
setChunkIndex(oldBlockNumber, blockNumber - oldBlockNumber, j); setChunkIndex(oldBlockNumber, blockNumber - oldBlockNumber, j);
} }
} }
} }
if (diffText.isEmpty()) { output.diffText.replace('\r', ' ');
return output;
}
void UnifiedDiffEditorWidget::showDiff()
{
const DiffEditorInput input = {&m_controller};
const UnifiedDiffOutput output = m_data.showDiff(input);
if (output.diffText.isEmpty()) {
setPlainText(tr("No difference.")); setPlainText(tr("No difference."));
return; return;
} }
diffText.replace('\r', ' ');
{ {
const GuardLocker locker(m_controller.m_ignoreChanges); const GuardLocker locker(m_controller.m_ignoreChanges);
setPlainText(diffText); setPlainText(output.diffText);
QTextBlock block = document()->firstBlock(); QTextBlock block = document()->firstBlock();
for (int b = 0; block.isValid(); block = block.next(), ++b) for (int b = 0; block.isValid(); block = block.next(), ++b)
setFoldingIndent(block, foldingIndent.value(b, 3)); setFoldingIndent(block, output.foldingIndent.value(b, 3));
} }
setSelections(selections); setSelections(output.selections);
} }
int UnifiedDiffEditorWidget::blockNumberForFileIndex(int fileIndex) const int UnifiedDiffEditorWidget::blockNumberForFileIndex(int fileIndex) const
{ {
if (fileIndex < 0 || fileIndex >= m_fileInfo.count()) if (fileIndex < 0 || fileIndex >= m_data.m_fileInfo.count())
return -1; return -1;
return std::next(m_fileInfo.constBegin(), fileIndex).key(); return std::next(m_data.m_fileInfo.constBegin(), fileIndex).key();
} }
int UnifiedDiffEditorWidget::fileIndexForBlockNumber(int blockNumber) const int UnifiedDiffEditorWidget::fileIndexForBlockNumber(int blockNumber) const
{ {
int i = -1; int i = -1;
for (auto it = m_fileInfo.cbegin(), end = m_fileInfo.cend(); it != end; ++it, ++i) { for (auto it = m_data.m_fileInfo.cbegin(), end = m_data.m_fileInfo.cend(); it != end; ++it, ++i) {
if (it.key() > blockNumber) if (it.key() > blockNumber)
break; break;
} }
@@ -567,11 +553,11 @@ int UnifiedDiffEditorWidget::fileIndexForBlockNumber(int blockNumber) const
int UnifiedDiffEditorWidget::chunkIndexForBlockNumber(int blockNumber) const int UnifiedDiffEditorWidget::chunkIndexForBlockNumber(int blockNumber) const
{ {
if (m_chunkInfo.isEmpty()) if (m_data.m_chunkInfo.isEmpty())
return -1; return -1;
auto it = m_chunkInfo.upperBound(blockNumber); auto it = m_data.m_chunkInfo.upperBound(blockNumber);
if (it == m_chunkInfo.constBegin()) if (it == m_data.m_chunkInfo.constBegin())
return -1; return -1;
--it; --it;
@@ -584,7 +570,7 @@ int UnifiedDiffEditorWidget::chunkIndexForBlockNumber(int blockNumber) const
void UnifiedDiffEditorWidget::jumpToOriginalFile(const QTextCursor &cursor) void UnifiedDiffEditorWidget::jumpToOriginalFile(const QTextCursor &cursor)
{ {
if (m_fileInfo.isEmpty()) if (m_data.m_fileInfo.isEmpty())
return; return;
const int blockNumber = cursor.blockNumber(); const int blockNumber = cursor.blockNumber();
@@ -598,13 +584,13 @@ void UnifiedDiffEditorWidget::jumpToOriginalFile(const QTextCursor &cursor)
const int columnNumber = cursor.positionInBlock() - 1; // -1 for the first character in line const int columnNumber = cursor.positionInBlock() - 1; // -1 for the first character in line
const int rightLineNumber = m_rightLineNumbers.value(blockNumber, qMakePair(-1, 0)).first; const int rightLineNumber = m_data.m_rightLineNumbers.value(blockNumber, qMakePair(-1, 0)).first;
if (rightLineNumber >= 0) { if (rightLineNumber >= 0) {
m_controller.jumpToOriginalFile(rightFileName, rightLineNumber, columnNumber); m_controller.jumpToOriginalFile(rightFileName, rightLineNumber, columnNumber);
return; return;
} }
const int leftLineNumber = m_leftLineNumbers.value(blockNumber, qMakePair(-1, 0)).first; const int leftLineNumber = m_data.m_leftLineNumbers.value(blockNumber, qMakePair(-1, 0)).first;
if (leftLineNumber >= 0) { if (leftLineNumber >= 0) {
if (leftFileName == rightFileName) { if (leftFileName == rightFileName) {
for (const ChunkData &chunkData : fileData.chunks) { for (const ChunkData &chunkData : fileData.chunks) {

View File

@@ -23,6 +23,45 @@ namespace Internal {
class DiffEditorDocument; class DiffEditorDocument;
class UnifiedDiffOutput
{
public:
QString diffText;
// '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;
};
class UnifiedDiffData
{
public:
UnifiedDiffOutput showDiff(const DiffEditorInput &input);
// block number, visual line number, chunk row number
QMap<int, QPair<int, int>> m_leftLineNumbers;
QMap<int, QPair<int, int>> m_rightLineNumbers;
int m_leftLineNumberDigits = 1;
int m_rightLineNumberDigits = 1;
// block number, visual line number.
QMap<int, QPair<DiffFileInfo, DiffFileInfo>> m_fileInfo;
// start block number, block count of a chunk, chunk index inside a file.
QMap<int, QPair<int, int>> m_chunkInfo;
private:
void setLeftLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk);
void setRightLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk);
void setFileInfo(int blockNumber, const DiffFileInfo &leftInfo, const DiffFileInfo &rightInfo);
void setChunkIndex(int startBlockNumber, int blockCount, int chunkIndex);
QString showChunk(const DiffEditorInput &input, const ChunkData &chunkData, bool lastChunk,
int *blockNumber, int *charNumber,
QMap<int, QList<DiffSelection>> *selections);
};
class UnifiedDiffEditorWidget final : public SelectableTextEditorWidget class UnifiedDiffEditorWidget final : public SelectableTextEditorWidget
{ {
Q_OBJECT Q_OBJECT
@@ -58,18 +97,7 @@ private:
void slotCursorPositionChangedInEditor(); void slotCursorPositionChangedInEditor();
void setLeftLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk);
void setRightLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk);
void setFileInfo(int blockNumber,
const DiffFileInfo &leftFileInfo,
const DiffFileInfo &rightFileInfo);
void setChunkIndex(int startBlockNumber, int blockCount, int chunkIndex);
void showDiff(); void showDiff();
QString showChunk(const ChunkData &chunkData,
bool lastChunk,
int *blockNumber,
int *charNumber,
QMap<int, QList<DiffSelection> > *selections);
int blockNumberForFileIndex(int fileIndex) const; int blockNumberForFileIndex(int fileIndex) const;
int fileIndexForBlockNumber(int blockNumber) const; int fileIndexForBlockNumber(int blockNumber) const;
int chunkIndexForBlockNumber(int blockNumber) const; int chunkIndexForBlockNumber(int blockNumber) const;
@@ -79,19 +107,8 @@ private:
int chunkIndex, int chunkIndex,
const ChunkSelection &selection); const ChunkSelection &selection);
// block number, visual line number, chunk row number UnifiedDiffData m_data;
QMap<int, QPair<int, int> > m_leftLineNumbers;
QMap<int, QPair<int, int> > m_rightLineNumbers;
DiffEditorWidgetController m_controller; DiffEditorWidgetController m_controller;
int m_leftLineNumberDigits = 1;
int m_rightLineNumberDigits = 1;
// block number, visual line number.
QMap<int, QPair<DiffFileInfo, DiffFileInfo> > m_fileInfo;
// start block number, block count of a chunk, chunk index inside a file.
QMap<int, QPair<int, int> > m_chunkInfo;
QByteArray m_state; QByteArray m_state;
}; };