forked from qt-creator/qt-creator
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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,11 +284,9 @@ 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,
|
QMap<int, QList<DiffSelection>> *selections)
|
||||||
int *charNumber,
|
|
||||||
QMap<int, QList<DiffSelection> > *selections)
|
|
||||||
{
|
{
|
||||||
if (chunkData.contextChunk)
|
if (chunkData.contextChunk)
|
||||||
return QString();
|
return QString();
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user