| 261 | } |
| 262 | |
| 263 | void PatchReviewToolView::customContextMenuRequested(const QPoint& pos) |
| 264 | { |
| 265 | QList<QUrl> urls; |
| 266 | const QModelIndexList selectionIdxs = m_editPatch.filesList->selectionModel()->selectedIndexes(); |
| 267 | urls.reserve(selectionIdxs.size()); |
| 268 | for (const QModelIndex& idx : selectionIdxs) { |
| 269 | urls += idx.data(KDevelop::VcsFileChangesModel::UrlRole).toUrl(); |
| 270 | } |
| 271 | |
| 272 | QPointer<QMenu> menu = new QMenu(m_editPatch.filesList); |
| 273 | QList<ContextMenuExtension> extensions; |
| 274 | if(!urls.isEmpty()) { |
| 275 | KDevelop::FileContext context(urls); |
| 276 | extensions = ICore::self()->pluginController()->queryPluginsForContextMenuExtensions(&context, menu); |
| 277 | } |
| 278 | |
| 279 | QList<QAction*> vcsActions; |
| 280 | for (const ContextMenuExtension& ext : std::as_const(extensions)) { |
| 281 | vcsActions += ext.actions(ContextMenuExtension::VcsGroup); |
| 282 | } |
| 283 | |
| 284 | menu->addAction(m_selectAllAction); |
| 285 | menu->addAction(m_deselectAllAction); |
| 286 | menu->addActions(vcsActions); |
| 287 | menu->exec(m_editPatch.filesList->viewport()->mapToGlobal(pos)); |
| 288 | |
| 289 | delete menu; |
| 290 | } |
| 291 | |
| 292 | void PatchReviewToolView::nextHunk() |
| 293 | { |
nothing calls this directly
no test coverage detected