Add context menu to status tree: View Diff(s), Open File(s)

This commit is contained in:
Levi Neely 2026-07-23 14:34:36 +02:00
parent 63bc6680c4
commit dcc5218ad7
1 changed files with 36 additions and 0 deletions

View File

@ -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()) {