diff --git a/gitplusplus.cpp b/gitplusplus.cpp index 29bc745..2dc3853 100644 --- a/gitplusplus.cpp +++ b/gitplusplus.cpp @@ -200,6 +200,7 @@ GitPlusPlusView::GitPlusPlusView(GitPlusPlusPlugin *plugin, KTextEditor::MainWin m_treeView->setSelectionMode(QTreeView::ExtendedSelection); m_treeView->setRootIsDecorated(true); m_treeView->setUniformRowHeights(true); + m_treeView->setContextMenuPolicy(Qt::CustomContextMenu); treeLayout->addWidget(m_treeView); // Commit area @@ -519,6 +520,41 @@ GitPlusPlusView::GitPlusPlusView(GitPlusPlusPlugin *plugin, KTextEditor::MainWin } }); + // Right-click context menu on status tree + connect(m_treeView, &QTreeView::customContextMenuRequested, this, [this](const QPoint &pos) { + const auto indexes = m_treeView->selectionModel()->selectedIndexes(); + QStringList files; + for (const auto &proxyIdx : indexes) { + QModelIndex idx = m_proxy->mapToSource(proxyIdx); + if (idx.internalId() == 0xFFFFFFFF) + continue; + QString file = idx.data(GitStatusModel::FilePathRole).toString(); + if (!file.isEmpty()) + files.append(file); + } + if (files.isEmpty()) return; + + QMenu menu; + QString diffLabel = files.size() == 1 + ? QStringLiteral("View Diff") + : QStringLiteral("View Diff(s)"); + QString openLabel = files.size() == 1 + ? QStringLiteral("Open File") + : QStringLiteral("Open File(s)"); + auto *diffAction = menu.addAction(QIcon::fromTheme(QStringLiteral("vcs-diff")), diffLabel); + auto *openAction = menu.addAction(QIcon::fromTheme(QStringLiteral("document-open")), openLabel); + + auto *chosen = menu.exec(m_treeView->viewport()->mapToGlobal(pos)); + if (chosen == diffAction) { + diffSelected(); + } else if (chosen == openAction) { + for (const auto &file : qAsConst(files)) { + QString absPath = m_gitDir + QLatin1Char('/') + file; + m_mainWindow->openUrl(QUrl::fromLocalFile(absPath)); + } + } + }); + // Amend checkbox: load last commit message when checked connect(m_amendCheck, &QCheckBox::toggled, this, [this](bool checked) { if (checked && m_commitMsgEdit->toPlainText().trimmed().isEmpty()) {