diff --git a/src/plugins/git/branchadddialog.cpp b/src/plugins/git/branchadddialog.cpp index ccb2b37633a..8a131a363cc 100644 --- a/src/plugins/git/branchadddialog.cpp +++ b/src/plugins/git/branchadddialog.cpp @@ -105,14 +105,31 @@ QWidget *BranchValidationDelegate::createEditor(QWidget *parent, return lineEdit; } -BranchAddDialog::BranchAddDialog(const QStringList &localBranches, bool addBranch, QWidget *parent) : +BranchAddDialog::BranchAddDialog(const QStringList &localBranches, Type type, QWidget *parent) : QDialog(parent), m_ui(new Ui::BranchAddDialog) { m_ui->setupUi(this); m_ui->trackingCheckBox->setVisible(false); setCheckoutVisible(false); - setWindowTitle(addBranch ? tr("Add Branch") : tr("Rename Branch")); + + switch (type) { + case BranchAddDialog::AddBranch: + setWindowTitle(tr("Add Branch")); + break; + case BranchAddDialog::RenameBranch: + setWindowTitle(tr("Rename Branch")); + break; + case BranchAddDialog::AddTag: + setWindowTitle(tr("Add Tag")); + m_ui->branchNameLabel->setText(tr("Tag name:")); + break; + case BranchAddDialog::RenameTag: + setWindowTitle(tr("Rename Tag")); + m_ui->branchNameLabel->setText(tr("Tag name:")); + break; + } + m_ui->branchNameEdit->setValidator(new BranchNameValidator(localBranches, this)); connect(m_ui->branchNameEdit, &QLineEdit::textChanged, this, &BranchAddDialog::updateButtonStatus); } diff --git a/src/plugins/git/branchadddialog.h b/src/plugins/git/branchadddialog.h index e90e71b581d..fa2100bf2c4 100644 --- a/src/plugins/git/branchadddialog.h +++ b/src/plugins/git/branchadddialog.h @@ -51,7 +51,14 @@ class BranchAddDialog : public QDialog Q_OBJECT public: - BranchAddDialog(const QStringList &localBranches, bool addBranch, QWidget *parent); + enum Type { + AddBranch, + RenameBranch, + AddTag, + RenameTag + }; + + BranchAddDialog(const QStringList &localBranches, Type type, QWidget *parent); ~BranchAddDialog() override; void setBranchName(const QString &); diff --git a/src/plugins/git/branchview.cpp b/src/plugins/git/branchview.cpp index 8a07af74f09..0a937248cb4 100644 --- a/src/plugins/git/branchview.cpp +++ b/src/plugins/git/branchview.cpp @@ -313,7 +313,7 @@ bool BranchView::add() } } - BranchAddDialog branchAddDialog(localNames, true, this); + BranchAddDialog branchAddDialog(localNames, BranchAddDialog::Type::AddBranch, this); branchAddDialog.setBranchName(suggestedName); branchAddDialog.setTrackedBranchName(isTracked ? trackedBranch : QString(), !isLocal); branchAddDialog.setCheckoutVisible(true); @@ -444,11 +444,10 @@ bool BranchView::rename() if (!isTag) localNames = m_model->localBranchNames(); - BranchAddDialog branchAddDialog(localNames, false, this); - if (isTag) - branchAddDialog.setWindowTitle(tr("Rename Tag")); + const BranchAddDialog::Type type = isTag ? BranchAddDialog::Type::RenameTag + : BranchAddDialog::Type::RenameBranch; + BranchAddDialog branchAddDialog(localNames, type, this); branchAddDialog.setBranchName(oldName); - branchAddDialog.setTrackedBranchName(QString(), false); branchAddDialog.exec(); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 550a8489e49..584349b26d1 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1186,7 +1186,7 @@ QStringList GitClient::setupCheckoutArguments(const QString &workingDirectory, } } - BranchAddDialog branchAddDialog(localBranches, true, ICore::dialogParent()); + BranchAddDialog branchAddDialog(localBranches, BranchAddDialog::Type::AddBranch, ICore::dialogParent()); branchAddDialog.setTrackedBranchName(remoteBranch, true); if (branchAddDialog.exec() != QDialog::Accepted) diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index f667e5f0ac4..eb3abd51f3c 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -26,6 +26,7 @@ #include "giteditor.h" #include "annotationhighlighter.h" +#include "branchadddialog.h" #include "gitplugin.h" #include "gitclient.h" #include "gitsettings.h" @@ -305,6 +306,25 @@ void GitEditorWidget::addChangeActions(QMenu *menu, const QString &change) menu->addAction(tr("&Log for Change %1").arg(change), this, [this] { GitPlugin::client()->log(sourceWorkingDirectory(), QString(), false, {m_currentChange}); }); + menu->addAction(tr("Add &Tag for Change %1...").arg(change), this, [this] { + QString output; + QString errorMessage; + GitPlugin::client()->synchronousTagCmd(sourceWorkingDirectory(), QStringList(), + &output, &errorMessage); + + const QStringList tags = output.split('\n'); + BranchAddDialog dialog(tags, BranchAddDialog::Type::AddTag, nullptr); + + if (dialog.exec() == QDialog::Rejected) + return; + + GitPlugin::client()->synchronousTagCmd(sourceWorkingDirectory(), + {dialog.branchName(), m_currentChange}, + &output, &errorMessage); + VcsOutputWindow::append(output); + if (!errorMessage.isEmpty()) + VcsOutputWindow::append(errorMessage, VcsOutputWindow::MessageStyle::Error); + }); auto resetMenu = new QMenu(tr("&Reset to Change %1").arg(change), menu); resetMenu->addAction(tr("&Hard"), this, [this] { resetChange("hard"); });