forked from qt-creator/qt-creator
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:
@@ -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 {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user