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 { namespace DiffEditor {
enum DiffSide {
LeftSide,
RightSide,
SideCount // Use only in array declarations
};
class DIFFEDITOR_EXPORT DiffFileInfo { class DIFFEDITOR_EXPORT DiffFileInfo {
public: public:
enum PatchBehaviour { enum PatchBehaviour {

View File

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

View File

@@ -40,15 +40,13 @@ public:
class UnifiedDiffData class UnifiedDiffData
{ {
public: public:
UnifiedDiffOutput showDiff(QFutureInterface<void> &fi, int progressMin, int progressMax, UnifiedDiffOutput setDiff(QFutureInterface<void> &fi, int progressMin, int progressMax,
const DiffEditorInput &input); const DiffEditorInput &input);
// block number, visual line number, chunk row number // block number, visual line number, chunk row number
QMap<int, QPair<int, int>> m_leftLineNumbers; using LineNumbers = QMap<int, QPair<int, int>>;
QMap<int, QPair<int, int>> m_rightLineNumbers; std::array<LineNumbers, SideCount> m_lineNumbers{};
std::array<int, SideCount> m_lineNumberDigits{1, 1};
int m_leftLineNumberDigits = 1;
int m_rightLineNumberDigits = 1;
// block number, visual line number. // block number, visual line number.
QMap<int, QPair<DiffFileInfo, DiffFileInfo>> m_fileInfo; QMap<int, QPair<DiffFileInfo, DiffFileInfo>> m_fileInfo;
@@ -56,11 +54,10 @@ public:
QMap<int, QPair<int, int>> m_chunkInfo; QMap<int, QPair<int, int>> m_chunkInfo;
private: private:
void setLeftLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk); void setLineNumber(DiffSide side, 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 setFileInfo(int blockNumber, const DiffFileInfo &leftInfo, const DiffFileInfo &rightInfo);
void setChunkIndex(int startBlockNumber, int blockCount, int chunkIndex); void setChunkIndex(int startBlockNumber, int blockCount, int chunkIndex);
QString showChunk(const DiffEditorInput &input, const ChunkData &chunkData, bool lastChunk, QString setChunk(const DiffEditorInput &input, const ChunkData &chunkData, bool lastChunk,
int *blockNumber, int *charNumber, int *blockNumber, int *charNumber,
QMap<int, QList<DiffSelection>> *selections); QMap<int, QList<DiffSelection>> *selections);
}; };