diff --git a/src/plugins/git/branchadddialog.cpp b/src/plugins/git/branchadddialog.cpp index 2ea024bef4a..b6d753b9f04 100644 --- a/src/plugins/git/branchadddialog.cpp +++ b/src/plugins/git/branchadddialog.cpp @@ -24,9 +24,11 @@ ****************************************************************************/ #include "branchadddialog.h" +#include "branchmodel.h" #include "ui_branchadddialog.h" #include "gitplugin.h" +#include #include #include @@ -87,6 +89,21 @@ private: QStringList m_localBranches; }; +BranchValidationDelegate::BranchValidationDelegate(QWidget *parent, BranchModel *model) + : QItemDelegate(parent) + , m_model(model) +{ +} + +QWidget *BranchValidationDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem & /*option*/, + const QModelIndex & /*index*/) const +{ + auto lineEdit = new Utils::FancyLineEdit(parent); + BranchNameValidator *validator = new BranchNameValidator(m_model->localBranchNames(), lineEdit); + lineEdit->setValidator(validator); + return lineEdit; +} BranchAddDialog::BranchAddDialog(const QStringList &localBranches, bool addBranch, QWidget *parent) : QDialog(parent), diff --git a/src/plugins/git/branchadddialog.h b/src/plugins/git/branchadddialog.h index b1320d6aa96..f8331fd5c82 100644 --- a/src/plugins/git/branchadddialog.h +++ b/src/plugins/git/branchadddialog.h @@ -26,13 +26,26 @@ #pragma once #include +#include namespace Git { namespace Internal { +class BranchModel; namespace Ui { class BranchAddDialog; } +class BranchValidationDelegate : public QItemDelegate +{ +public: + BranchValidationDelegate(QWidget *parent, BranchModel *model); + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + +private: + BranchModel *m_model; +}; + class BranchAddDialog : public QDialog { Q_OBJECT diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index 6f7f83609c8..8c9db00828a 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -317,7 +317,10 @@ Qt::ItemFlags BranchModel::flags(const QModelIndex &index) const BranchNode *node = indexToNode(index); if (!node) return Qt::NoItemFlags; - return Qt::ItemIsSelectable | Qt::ItemIsEnabled; + Qt::ItemFlags res = Qt::ItemIsSelectable | Qt::ItemIsEnabled; + if (node->isLeaf() && node->isLocal()) + res |= Qt::ItemIsEditable; + return res; } void BranchModel::clear() diff --git a/src/plugins/git/branchview.cpp b/src/plugins/git/branchview.cpp index 52fe887616c..4e17f31686b 100644 --- a/src/plugins/git/branchview.cpp +++ b/src/plugins/git/branchview.cpp @@ -126,6 +126,9 @@ BranchView::BranchView() : this, &BranchView::BranchView::setIncludeTags); m_branchView->setContextMenuPolicy(Qt::CustomContextMenu); + m_branchView->setEditTriggers(QAbstractItemView::SelectedClicked + | QAbstractItemView::EditKeyPressed); + m_branchView->setItemDelegate(new BranchValidationDelegate(this, m_model)); connect(m_branchView, &QAbstractItemView::doubleClicked, this, [this](const QModelIndex &idx) { log(m_filterModel->mapToSource(idx)); }); connect(m_branchView, &QWidget::customContextMenuRequested,