From 8cad94534f97849081bd595da458670d168d6b63 Mon Sep 17 00:00:00 2001 From: jkobus Date: Thu, 13 Feb 2014 16:43:28 +0100 Subject: Implement unified diff editor Change-Id: I93e0bfd71a8a650afbe2ca9e0f1f3dbfc9d57db0 Reviewed-by: Jarek Kobus --- src/plugins/diffeditor/diffeditorcontroller.cpp | 105 ++++++++++++++++++++++-- 1 file changed, 98 insertions(+), 7 deletions(-) (limited to 'src/plugins/diffeditor/diffeditorcontroller.cpp') diff --git a/src/plugins/diffeditor/diffeditorcontroller.cpp b/src/plugins/diffeditor/diffeditorcontroller.cpp index fae78efbcb..b815961cf1 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorcontroller.cpp @@ -29,12 +29,28 @@ #include "diffeditorcontroller.h" +#include + +static const char settingsGroupC[] = "DiffEditor"; +static const char contextLineNumbersKeyC[] = "ContextLineNumbers"; +static const char ignoreWhitespaceKeyC[] = "IgnoreWhitespace"; + namespace DiffEditor { DiffEditorController::DiffEditorController(QObject *parent) : QObject(parent), - m_descriptionEnabled(false) + m_descriptionEnabled(false), + m_contextLinesNumber(3), + m_ignoreWhitespace(true) { + QSettings *s = Core::ICore::settings(); + s->beginGroup(QLatin1String(settingsGroupC)); + m_contextLinesNumber = s->value(QLatin1String(contextLineNumbersKeyC), + m_contextLinesNumber).toInt(); + m_ignoreWhitespace = s->value(QLatin1String(ignoreWhitespaceKeyC), + m_ignoreWhitespace).toBool(); + s->endGroup(); + clear(); } @@ -48,9 +64,9 @@ QString DiffEditorController::clearMessage() const return m_clearMessage; } -QList DiffEditorController::diffContents() const +QList DiffEditorController::diffFiles() const { - return m_diffFileList; + return m_diffFiles; } QString DiffEditorController::workingDirectory() const @@ -68,6 +84,43 @@ bool DiffEditorController::isDescriptionEnabled() const return m_descriptionEnabled; } +int DiffEditorController::contextLinesNumber() const +{ + return m_contextLinesNumber; +} + +bool DiffEditorController::isIgnoreWhitespace() const +{ + return m_ignoreWhitespace; +} + +QString DiffEditorController::makePatch(int diffFileIndex, + int chunkIndex, + bool revert) const +{ + if (diffFileIndex < 0 || chunkIndex < 0) + return QString(); + + if (diffFileIndex >= m_diffFiles.count()) + return QString(); + + const FileData fileData = m_diffFiles.at(diffFileIndex); + if (chunkIndex >= fileData.chunks.count()) + return QString(); + + const ChunkData chunkData = fileData.chunks.at(chunkIndex); + const bool lastChunk = (chunkIndex == fileData.chunks.count() - 1); + + const QString fileName = revert + ? fileData.rightFileInfo.fileName + : fileData.leftFileInfo.fileName; + + return DiffUtils::makePatch(chunkData, + fileName, + fileName, + lastChunk && fileData.lastChunkAtTheEndOfFile); +} + void DiffEditorController::clear() { clear(tr("No difference")); @@ -75,16 +128,18 @@ void DiffEditorController::clear() void DiffEditorController::clear(const QString &message) { + setDescription(QString()); + setDiffFiles(QList()); m_clearMessage = message; emit cleared(message); } -void DiffEditorController::setDiffContents(const QList &diffFileList, - const QString &workingDirectory) +void DiffEditorController::setDiffFiles(const QList &diffFileList, + const QString &workingDirectory) { - m_diffFileList = diffFileList; + m_diffFiles = diffFileList; m_workingDirectory = workingDirectory; - emit diffContentsChanged(diffFileList, workingDirectory); + emit diffFilesChanged(diffFileList, workingDirectory); } void DiffEditorController::setDescription(const QString &description) @@ -105,4 +160,40 @@ void DiffEditorController::setDescriptionEnabled(bool on) emit descriptionEnablementChanged(on); } +void DiffEditorController::setContextLinesNumber(int lines) +{ + const int l = qMax(lines, 1); + if (m_contextLinesNumber == l) + return; + + m_contextLinesNumber = l; + + QSettings *s = Core::ICore::settings(); + s->beginGroup(QLatin1String(settingsGroupC)); + s->setValue(QLatin1String(contextLineNumbersKeyC), m_contextLinesNumber); + s->endGroup(); + + emit contextLinesNumberChanged(l); +} + +void DiffEditorController::setIgnoreWhitespace(bool ignore) +{ + if (m_ignoreWhitespace == ignore) + return; + + m_ignoreWhitespace = ignore; + + QSettings *s = Core::ICore::settings(); + s->beginGroup(QLatin1String(settingsGroupC)); + s->setValue(QLatin1String(ignoreWhitespaceKeyC), m_ignoreWhitespace); + s->endGroup(); + + emit ignoreWhitespaceChanged(ignore); +} + +void DiffEditorController::requestReload() +{ + emit reloadRequested(); +} + } // namespace DiffEditor -- cgit v1.2.1