From d8d7acbe7589626e77411c534efe6452ee1f4ac1 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 20 Aug 2015 16:45:30 +0300 Subject: [PATCH] Git: Scroll to active file on Show invoked from file log Change-Id: I0935bf8b8b30ee78716a14ee0a88c21b9caf62dc Reviewed-by: Jarek Kobus --- src/plugins/diffeditor/diffeditor.cpp | 129 ++++++++++-------- .../diffeditor/diffeditorcontroller.cpp | 10 +- src/plugins/diffeditor/diffeditorcontroller.h | 4 +- src/plugins/diffeditor/diffeditordocument.cpp | 9 +- src/plugins/diffeditor/diffeditordocument.h | 5 +- src/plugins/git/gitclient.cpp | 13 +- 6 files changed, 99 insertions(+), 71 deletions(-) diff --git a/src/plugins/diffeditor/diffeditor.cpp b/src/plugins/diffeditor/diffeditor.cpp index fe4759f44b..7a9d9d0091 100644 --- a/src/plugins/diffeditor/diffeditor.cpp +++ b/src/plugins/diffeditor/diffeditor.cpp @@ -378,69 +378,61 @@ QWidget *DiffEditor::toolBar() void DiffEditor::documentHasChanged() { - int index = 0; - { - Guard guard(&m_ignoreChanges); - const QList diffFileList = m_document->diffFiles(); - - updateDescription(); - currentView()->setDiff(diffFileList, m_document->baseDirectory()); - - m_entriesComboBox->clear(); - const int count = diffFileList.count(); - for (int i = 0; i < count; i++) { - const DiffFileInfo leftEntry = diffFileList.at(i).leftFileInfo; - const DiffFileInfo rightEntry = diffFileList.at(i).rightFileInfo; - const QString leftShortFileName = Utils::FileName::fromString(leftEntry.fileName).fileName(); - const QString rightShortFileName = Utils::FileName::fromString(rightEntry.fileName).fileName(); - QString itemText; - QString itemToolTip; - if (leftEntry.fileName == rightEntry.fileName) { + Guard guard(&m_ignoreChanges); + const QList diffFileList = m_document->diffFiles(); + + updateDescription(); + currentView()->setDiff(diffFileList, m_document->baseDirectory()); + + m_entriesComboBox->clear(); + const int count = diffFileList.count(); + for (int i = 0; i < count; i++) { + const DiffFileInfo leftEntry = diffFileList.at(i).leftFileInfo; + const DiffFileInfo rightEntry = diffFileList.at(i).rightFileInfo; + const QString leftShortFileName = Utils::FileName::fromString(leftEntry.fileName).fileName(); + const QString rightShortFileName = Utils::FileName::fromString(rightEntry.fileName).fileName(); + QString itemText; + QString itemToolTip; + if (leftEntry.fileName == rightEntry.fileName) { + itemText = leftShortFileName; + + if (leftEntry.typeInfo.isEmpty() && rightEntry.typeInfo.isEmpty()) { + itemToolTip = leftEntry.fileName; + } else { + itemToolTip = tr("[%1] vs. [%2] %3") + .arg(leftEntry.typeInfo, + rightEntry.typeInfo, + leftEntry.fileName); + } + } else { + if (leftShortFileName == rightShortFileName) { itemText = leftShortFileName; + } else { + itemText = tr("%1 vs. %2") + .arg(leftShortFileName, + rightShortFileName); + } - if (leftEntry.typeInfo.isEmpty() && rightEntry.typeInfo.isEmpty()) { - itemToolTip = leftEntry.fileName; - } else { - itemToolTip = tr("[%1] vs. [%2] %3") - .arg(leftEntry.typeInfo, - rightEntry.typeInfo, - leftEntry.fileName); - } + if (leftEntry.typeInfo.isEmpty() && rightEntry.typeInfo.isEmpty()) { + itemToolTip = tr("%1 vs. %2") + .arg(leftEntry.fileName, + rightEntry.fileName); } else { - if (leftShortFileName == rightShortFileName) { - itemText = leftShortFileName; - } else { - itemText = tr("%1 vs. %2") - .arg(leftShortFileName, - rightShortFileName); - } - - if (leftEntry.typeInfo.isEmpty() && rightEntry.typeInfo.isEmpty()) { - itemToolTip = tr("%1 vs. %2") - .arg(leftEntry.fileName, - rightEntry.fileName); - } else { - itemToolTip = tr("[%1] %2 vs. [%3] %4") - .arg(leftEntry.typeInfo, - leftEntry.fileName, - rightEntry.typeInfo, - rightEntry.fileName); - } + itemToolTip = tr("[%1] %2 vs. [%3] %4") + .arg(leftEntry.typeInfo, + leftEntry.fileName, + rightEntry.typeInfo, + rightEntry.fileName); } - if (m_currentFileChunk.first == leftEntry.fileName - && m_currentFileChunk.second == rightEntry.fileName) - index = i; - m_entriesComboBox->addItem(itemText); - m_entriesComboBox->setItemData(m_entriesComboBox->count() - 1, - leftEntry.fileName, Qt::UserRole); - m_entriesComboBox->setItemData(m_entriesComboBox->count() - 1, - rightEntry.fileName, Qt::UserRole + 1); - m_entriesComboBox->setItemData(m_entriesComboBox->count() - 1, - itemToolTip, Qt::ToolTipRole); } + m_entriesComboBox->addItem(itemText); + m_entriesComboBox->setItemData(m_entriesComboBox->count() - 1, + leftEntry.fileName, Qt::UserRole); + m_entriesComboBox->setItemData(m_entriesComboBox->count() - 1, + rightEntry.fileName, Qt::UserRole + 1); + m_entriesComboBox->setItemData(m_entriesComboBox->count() - 1, + itemToolTip, Qt::ToolTipRole); } - - setCurrentDiffFileIndex(m_entriesComboBox->count() > 0 ? index : -1); } void DiffEditor::toggleDescription() @@ -521,9 +513,28 @@ void DiffEditor::reloadHasFinished(bool success) if (!currentView()) return; - m_currentFileChunk = qMakePair(QString(), QString()); - currentView()->endOperation(success); + + int index = -1; + const QString startupFile = m_document->startupFile(); + const QList diffFileList = m_document->diffFiles(); + const int count = diffFileList.count(); + for (int i = 0; i < count; i++) { + const DiffFileInfo leftEntry = diffFileList.at(i).leftFileInfo; + const DiffFileInfo rightEntry = diffFileList.at(i).rightFileInfo; + if ((m_currentFileChunk.first.isEmpty() + && m_currentFileChunk.second.isEmpty() + && startupFile.endsWith(rightEntry.fileName)) + || (m_currentFileChunk.first == leftEntry.fileName + && m_currentFileChunk.second == rightEntry.fileName)) { + index = i; + break; + } + } + + m_currentFileChunk = qMakePair(QString(), QString()); + if (index >= 0) + setCurrentDiffFileIndex(index); } void DiffEditor::updateEntryToolTip() diff --git a/src/plugins/diffeditor/diffeditorcontroller.cpp b/src/plugins/diffeditor/diffeditorcontroller.cpp index 3ed6033315..e805e84570 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorcontroller.cpp @@ -100,9 +100,10 @@ DiffEditorController *DiffEditorController::controller(Core::IDocument *document } void DiffEditorController::setDiffFiles(const QList &diffFileList, - const QString &workingDirectory) + const QString &workingDirectory, + const QString &startupFile) { - m_document->setDiffFiles(diffFileList, workingDirectory); + m_document->setDiffFiles(diffFileList, workingDirectory, startupFile); } void DiffEditorController::setDescription(const QString &description) @@ -169,6 +170,11 @@ void DiffEditorController::forceContextLineCount(int lines) m_document->forceContextLineCount(lines); } +Core::IDocument *DiffEditorController::document() const +{ + return m_document; +} + /** * @brief Request the diff data to be re-read. */ diff --git a/src/plugins/diffeditor/diffeditorcontroller.h b/src/plugins/diffeditor/diffeditorcontroller.h index db1812fc2a..69a8894643 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.h +++ b/src/plugins/diffeditor/diffeditorcontroller.h @@ -79,9 +79,11 @@ protected: virtual void reloadFinished(bool success); void setDiffFiles(const QList &diffFileList, - const QString &baseDirectory = QString()); + const QString &baseDirectory = QString(), + const QString &startupFile = QString()); void setDescription(const QString &description); void forceContextLineCount(int lines); + Core::IDocument *document() const; private: void requestMoreInformation(); diff --git a/src/plugins/diffeditor/diffeditordocument.cpp b/src/plugins/diffeditor/diffeditordocument.cpp index d9a120c77b..74e048517a 100644 --- a/src/plugins/diffeditor/diffeditordocument.cpp +++ b/src/plugins/diffeditor/diffeditordocument.cpp @@ -122,10 +122,12 @@ QString DiffEditorDocument::makePatch(int fileIndex, int chunkIndex, bool revert lastChunk && fileData.lastChunkAtTheEndOfFile); } -void DiffEditorDocument::setDiffFiles(const QList &data, const QString &directory) +void DiffEditorDocument::setDiffFiles(const QList &data, const QString &directory, + const QString &startupFile) { m_diffFiles = data; m_baseDirectory = directory; + m_startupFile = startupFile; emit documentChanged(); } @@ -139,6 +141,11 @@ QString DiffEditorDocument::baseDirectory() const return m_baseDirectory; } +QString DiffEditorDocument::startupFile() const +{ + return m_startupFile; +} + void DiffEditorDocument::setDescription(const QString &description) { if (m_description == description) diff --git a/src/plugins/diffeditor/diffeditordocument.h b/src/plugins/diffeditor/diffeditordocument.h index 0f73c42a7b..f8b49a05a7 100644 --- a/src/plugins/diffeditor/diffeditordocument.h +++ b/src/plugins/diffeditor/diffeditordocument.h @@ -54,9 +54,11 @@ public: QString makePatch(int fileIndex, int chunkIndex, bool revert, bool addPrefix = false) const; - void setDiffFiles(const QList &data, const QString &directory); + void setDiffFiles(const QList &data, const QString &directory, + const QString &startupFile = QString()); QList diffFiles() const; QString baseDirectory() const; + QString startupFile() const; void setDescription(const QString &description); QString description() const; @@ -99,6 +101,7 @@ private: DiffEditorController *m_controller; QList m_diffFiles; QString m_baseDirectory; + QString m_startupFile; QString m_description; int m_contextLineCount; bool m_isContextLineCountForced; diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index adf2dbabae..c67efb3d9e 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -126,7 +126,7 @@ private slots: virtual void processOutput(const QString &output); protected: - void processDiff(const QString &output); + void processDiff(const QString &output, const QString &startupFile = QString()); QStringList addConfigurationArguments(const QStringList &args) const; GitClient *gitClient() const; QStringList addHeadWhenCommandInProgress() const; @@ -171,13 +171,13 @@ void BaseController::runCommand(const QList &args, QTextCodec *code m_command->execute(); } -void BaseController::processDiff(const QString &output) +void BaseController::processDiff(const QString &output, const QString &startupFile) { m_command.clear(); bool ok; QList fileDataList = DiffUtils::readPatch(output, &ok); - setDiffFiles(fileDataList, m_directory); + setDiffFiles(fileDataList, m_directory, startupFile); } QStringList BaseController::addConfigurationArguments(const QStringList &args) const @@ -381,11 +381,10 @@ void ShowController::reload() void ShowController::processOutput(const QString &output) { QTC_ASSERT(m_state != Idle, return); - if (m_state == GettingDescription) { + if (m_state == GettingDescription) setDescription(gitClient()->extendedShowDescription(m_directory, output)); - } else if (m_state == GettingDiff) { - processDiff(output); - } + else if (m_state == GettingDiff) + processDiff(output, VcsBasePlugin::source(document())); } void ShowController::reloadFinished(bool success) -- GitLab