diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index dfeeec063ea..9f6a42188ff 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -670,6 +670,7 @@ void GitPlugin::blameFile() QTC_ASSERT(state.hasFile(), return); const int lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor(state.currentFile()); QStringList extraOptions; + int firstLine = -1; if (BaseTextEditor *textEditor = BaseTextEditor::currentTextEditor()) { QTextCursor cursor = textEditor->textCursor(); if (cursor.hasSelection()) { @@ -677,15 +678,25 @@ void GitPlugin::blameFile() int selectionStart = cursor.selectionStart(); int selectionEnd = cursor.selectionEnd(); cursor.setPosition(selectionStart); - argument += QString::number(cursor.blockNumber() + 1) + ','; + const int startBlock = cursor.blockNumber(); + firstLine = startBlock + 1; + if (auto widget = qobject_cast(textEditor->widget())) { + const int previousFirstLine = widget->firstLineNumber(); + if (previousFirstLine > 0) + firstLine = previousFirstLine; + } + argument += QString::number(firstLine) + ','; cursor.setPosition(selectionEnd); - cursor.blockNumber(); - argument += QString::number(cursor.blockNumber() + 1); + const int endBlock = cursor.blockNumber(); + argument += QString::number(endBlock + firstLine - startBlock); extraOptions << argument; } } - m_gitClient->annotate(state.currentFileTopLevel(), state.relativeCurrentFile(), QString(), - lineNumber, extraOptions); + VcsBaseEditorWidget *editor = m_gitClient->annotate( + state.currentFileTopLevel(), state.relativeCurrentFile(), QString(), + lineNumber, extraOptions); + if (firstLine > 0) + editor->setFirstLineNumber(firstLine); } void GitPlugin::logProject() diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 1508e66cefe..6d6678f6fcf 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -561,6 +561,7 @@ public: QRegExp m_logEntryPattern; QList m_entrySections; // line number where this section starts int m_cursorLine = -1; + int m_firstLineNumber = -1; QString m_annotateRevisionTextFormat; QString m_annotatePreviousRevisionTextFormat; QString m_copyRevisionTextFormat; @@ -681,6 +682,37 @@ QString VcsBaseEditorWidget::fileNameForLine(int line) const return source(); } +int VcsBaseEditorWidget::firstLineNumber() const +{ + return d->m_firstLineNumber; +} + +void VcsBaseEditorWidget::setFirstLineNumber(int firstLineNumber) +{ + d->m_firstLineNumber = firstLineNumber; +} + +QString VcsBaseEditorWidget::lineNumber(int blockNumber) const +{ + if (d->m_firstLineNumber > 0) + return QString::number(d->m_firstLineNumber + blockNumber); + return TextEditorWidget::lineNumber(blockNumber); +} + +int VcsBaseEditorWidget::lineNumberDigits() const +{ + if (d->m_firstLineNumber <= 0) + return TextEditorWidget::lineNumberDigits(); + + int digits = 2; + int max = qMax(1, d->m_firstLineNumber + blockCount()); + while (max >= 100) { + max /= 10; + ++digits; + } + return digits; +} + void VcsBaseEditorWidget::setDescribeSlot(QObject *describeReceiver, const char *describeSlot) { d->m_describeReceiver = describeReceiver; diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index d42f34465ff..d23eee46fff 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -154,6 +154,9 @@ protected: virtual bool supportChangeLinks() const; virtual QString fileNameForLine(int line) const; + QString lineNumber(int blockNumber) const override; + int lineNumberDigits() const override; + public: void finalizeInitialization() override; // FIXME: Consolidate these into finalizeInitialization @@ -199,6 +202,9 @@ public: QString workingDirectory() const; void setWorkingDirectory(const QString &wd); + int firstLineNumber() const; + void setFirstLineNumber(int firstLineNumber); + bool isModified() const; EditorContentType contentType() const;