DiffEditor: Introduce DiffSide enum

This should simplify various diff structs.

Change-Id: Ia8c77de558a92a2a64fc13c674a46192521970f0
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Jarek Kobus
2022-09-26 12:58:30 +02:00
parent 054d7d65d2
commit b4390a3a80
3 changed files with 54 additions and 61 deletions

View File

@@ -18,6 +18,12 @@ namespace Utils { class Diff; }
namespace DiffEditor {
enum DiffSide {
LeftSide,
RightSide,
SideCount // Use only in array declarations
};
class DIFFEDITOR_EXPORT DiffFileInfo {
public:
enum PatchBehaviour {

View File

@@ -193,8 +193,8 @@ void UnifiedDiffEditorWidget::contextMenuEvent(QContextMenuEvent *e)
if (currentChunkIndex > chunkIndex)
break;
const int leftRow = m_data.m_leftLineNumbers.value(i, qMakePair(-1, -1)).second;
const int rightRow = m_data.m_rightLineNumbers.value(i, qMakePair(-1, -1)).second;
const int leftRow = m_data.m_lineNumbers[LeftSide].value(i, qMakePair(-1, -1)).second;
const int rightRow = m_data.m_lineNumbers[RightSide].value(i, qMakePair(-1, -1)).second;
if (leftRow >= 0)
leftSelection.append(leftRow);
@@ -246,22 +246,22 @@ QString UnifiedDiffEditorWidget::lineNumber(int blockNumber) const
{
QString lineNumberString;
const bool leftLineExists = m_data.m_leftLineNumbers.contains(blockNumber);
const bool rightLineExists = m_data.m_rightLineNumbers.contains(blockNumber);
const bool leftLineExists = m_data.m_lineNumbers[LeftSide].contains(blockNumber);
const bool rightLineExists = m_data.m_lineNumbers[RightSide].contains(blockNumber);
if (leftLineExists || rightLineExists) {
const QString leftLine = leftLineExists
? QString::number(m_data.m_leftLineNumbers.value(blockNumber).first)
? QString::number(m_data.m_lineNumbers[LeftSide].value(blockNumber).first)
: QString();
lineNumberString += QString(m_data.m_leftLineNumberDigits - leftLine.count(),
lineNumberString += QString(m_data.m_lineNumberDigits[LeftSide] - leftLine.count(),
' ') + leftLine;
lineNumberString += '|';
const QString rightLine = rightLineExists
? QString::number(m_data.m_rightLineNumbers.value(blockNumber).first)
? QString::number(m_data.m_lineNumbers[RightSide].value(blockNumber).first)
: QString();
lineNumberString += QString(m_data.m_rightLineNumberDigits - rightLine.count(),
lineNumberString += QString(m_data.m_lineNumberDigits[RightSide] - rightLine.count(),
' ') + rightLine;
}
return lineNumberString;
@@ -269,21 +269,15 @@ QString UnifiedDiffEditorWidget::lineNumber(int blockNumber) const
int UnifiedDiffEditorWidget::lineNumberDigits() const
{
return m_data.m_leftLineNumberDigits + m_data.m_rightLineNumberDigits + 1;
return m_data.m_lineNumberDigits[LeftSide] + m_data.m_lineNumberDigits[RightSide] + 1;
}
void UnifiedDiffData::setLeftLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk)
void UnifiedDiffData::setLineNumber(DiffSide side, int blockNumber, int lineNumber, int rowNumberInChunk)
{
QTC_ASSERT(side < SideCount, return);
const QString lineNumberString = QString::number(lineNumber);
m_leftLineNumbers.insert(blockNumber, qMakePair(lineNumber, rowNumberInChunk));
m_leftLineNumberDigits = qMax(m_leftLineNumberDigits, lineNumberString.count());
}
void UnifiedDiffData::setRightLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk)
{
const QString lineNumberString = QString::number(lineNumber);
m_rightLineNumbers.insert(blockNumber, qMakePair(lineNumber, rowNumberInChunk));
m_rightLineNumberDigits = qMax(m_rightLineNumberDigits, lineNumberString.count());
m_lineNumbers[side].insert(blockNumber, qMakePair(lineNumber, rowNumberInChunk));
m_lineNumberDigits[side] = qMax(m_lineNumberDigits[side], lineNumberString.count());
}
void UnifiedDiffData::setFileInfo(int blockNumber, const DiffFileInfo &leftInfo,
@@ -305,9 +299,9 @@ void UnifiedDiffEditorWidget::setDiff(const QList<FileData> &diffFileList)
showDiff();
}
QString UnifiedDiffData::showChunk(const DiffEditorInput &input, const ChunkData &chunkData,
bool lastChunk, int *blockNumber, int *charNumber,
QMap<int, QList<DiffSelection>> *selections)
QString UnifiedDiffData::setChunk(const DiffEditorInput &input, const ChunkData &chunkData,
bool lastChunk, int *blockNumber, int *charNumber,
QMap<int, QList<DiffSelection>> *selections)
{
if (chunkData.contextChunk)
return QString();
@@ -366,10 +360,10 @@ QString UnifiedDiffData::showChunk(const DiffEditorInput &input, const ChunkData
}
if (!line.isEmpty()) {
setLeftLineNumber(*blockNumber + blockCount + 1,
chunkData.leftStartingLineNumber
+ leftLineCount + 1,
leftRowsBuffer.at(j));
setLineNumber(LeftSide,
*blockNumber + blockCount + 1,
chunkData.leftStartingLineNumber + leftLineCount + 1,
leftRowsBuffer.at(j));
blockCount += blockDelta;
++leftLineCount;
}
@@ -408,10 +402,10 @@ QString UnifiedDiffData::showChunk(const DiffEditorInput &input, const ChunkData
}
if (!line.isEmpty()) {
setRightLineNumber(*blockNumber + blockCount + 1,
chunkData.rightStartingLineNumber
+ rightLineCount + 1,
rightRowsBuffer.at(j));
setLineNumber(RightSide,
*blockNumber + blockCount + 1,
chunkData.rightStartingLineNumber + rightLineCount + 1,
rightRowsBuffer.at(j));
blockCount += blockDelta;
++rightLineCount;
}
@@ -430,14 +424,10 @@ QString UnifiedDiffData::showChunk(const DiffEditorInput &input, const ChunkData
i == chunkData.rows.count() - 1);
if (!line.isEmpty()) {
setLeftLineNumber(*blockNumber + blockCount + 1,
chunkData.leftStartingLineNumber
+ leftLineCount + 1,
i);
setRightLineNumber(*blockNumber + blockCount + 1,
chunkData.rightStartingLineNumber
+ rightLineCount + 1,
i);
setLineNumber(LeftSide, *blockNumber + blockCount + 1,
chunkData.leftStartingLineNumber + leftLineCount + 1, i);
setLineNumber(RightSide, *blockNumber + blockCount + 1,
chunkData.rightStartingLineNumber + rightLineCount + 1, i);
blockCount += line.count('\n');
++leftLineCount;
++rightLineCount;
@@ -491,8 +481,8 @@ static int interpolate(int x, int x1, int x2, int y1, int y2)
return qRound((double)numerator / denominator);
}
UnifiedDiffOutput UnifiedDiffData::showDiff(QFutureInterface<void> &fi, int progressMin,
int progressMax, const DiffEditorInput &input)
UnifiedDiffOutput UnifiedDiffData::setDiff(QFutureInterface<void> &fi, int progressMin,
int progressMax, const DiffEditorInput &input)
{
UnifiedDiffOutput output;
@@ -531,12 +521,12 @@ UnifiedDiffOutput UnifiedDiffData::showDiff(QFutureInterface<void> &fi, int prog
for (int j = 0; j < fileData.chunks.count(); j++) {
const int oldBlockNumber = blockNumber;
output.foldingIndent.insert(blockNumber, 2);
output.diffText += showChunk(input, fileData.chunks.at(j),
(j == fileData.chunks.count() - 1)
&& fileData.lastChunkAtTheEndOfFile,
&blockNumber,
&charNumber,
&output.selections);
output.diffText += setChunk(input, fileData.chunks.at(j),
(j == fileData.chunks.count() - 1)
&& fileData.lastChunkAtTheEndOfFile,
&blockNumber,
&charNumber,
&output.selections);
if (!fileData.chunks.at(j).contextChunk)
setChunkIndex(oldBlockNumber, blockNumber - oldBlockNumber, j);
}
@@ -598,7 +588,7 @@ void UnifiedDiffEditorWidget::showDiff()
futureInterface.setProgressValue(0);
QFutureInterface<void> fi = futureInterface;
UnifiedDiffData diffData;
const UnifiedDiffOutput output = diffData.showDiff(fi, 0, firstPartMax, input);
const UnifiedDiffOutput output = diffData.setDiff(fi, 0, firstPartMax, input);
if (futureInterface.isCanceled())
return;
@@ -687,13 +677,13 @@ void UnifiedDiffEditorWidget::jumpToOriginalFile(const QTextCursor &cursor)
const int columnNumber = cursor.positionInBlock() - 1; // -1 for the first character in line
const int rightLineNumber = m_data.m_rightLineNumbers.value(blockNumber, qMakePair(-1, 0)).first;
const int rightLineNumber = m_data.m_lineNumbers[RightSide].value(blockNumber, qMakePair(-1, 0)).first;
if (rightLineNumber >= 0) {
m_controller.jumpToOriginalFile(rightFileName, rightLineNumber, columnNumber);
return;
}
const int leftLineNumber = m_data.m_leftLineNumbers.value(blockNumber, qMakePair(-1, 0)).first;
const int leftLineNumber = m_data.m_lineNumbers[LeftSide].value(blockNumber, qMakePair(-1, 0)).first;
if (leftLineNumber >= 0) {
if (leftFileName == rightFileName) {
for (const ChunkData &chunkData : fileData.chunks) {

View File

@@ -40,15 +40,13 @@ public:
class UnifiedDiffData
{
public:
UnifiedDiffOutput showDiff(QFutureInterface<void> &fi, int progressMin, int progressMax,
const DiffEditorInput &input);
UnifiedDiffOutput setDiff(QFutureInterface<void> &fi, int progressMin, int progressMax,
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;
using LineNumbers = QMap<int, QPair<int, int>>;
std::array<LineNumbers, SideCount> m_lineNumbers{};
std::array<int, SideCount> m_lineNumberDigits{1, 1};
// block number, visual line number.
QMap<int, QPair<DiffFileInfo, DiffFileInfo>> m_fileInfo;
@@ -56,13 +54,12 @@ public:
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 setLineNumber(DiffSide side, 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);
QString setChunk(const DiffEditorInput &input, const ChunkData &chunkData, bool lastChunk,
int *blockNumber, int *charNumber,
QMap<int, QList<DiffSelection>> *selections);
};
class UnifiedDiffEditorWidget final : public SelectableTextEditorWidget