diff --git a/src/filterHotSpots/FileFilterHotspot.cpp b/src/filterHotSpots/FileFilterHotspot.cpp index 441d8748f..86898d753 100644 --- a/src/filterHotSpots/FileFilterHotspot.cpp +++ b/src/filterHotSpots/FileFilterHotspot.cpp @@ -177,8 +177,10 @@ QList FileFilterHotSpot::actions() return {action}; } -void FileFilterHotSpot::setupMenu(QMenu *menu) +QList FileFilterHotSpot::setupMenu(QMenu *menu) { + const QList currentActions = menu->actions(); + const KFileItem fileItem(QUrl::fromLocalFile(_filePath)); const KFileItemList itemList({fileItem}); const KFileItemListProperties itemProperties(itemList); @@ -204,6 +206,14 @@ void FileFilterHotSpot::setupMenu(QMenu *menu) const QList actionList = menu->actions(); _menuActions.insertOpenWithActionsTo(!actionList.isEmpty() ? actionList.at(0) : nullptr, menu, QStringList()); #endif + + QList addedActions = menu->actions(); + // addedActions will only contain the open-with actions + for (auto *act : currentActions) { + addedActions.removeOne(act); + } + + return addedActions; } // Static variables for the HotSpot diff --git a/src/filterHotSpots/FileFilterHotspot.h b/src/filterHotSpots/FileFilterHotspot.h index 218ee9998..b527f59c5 100644 --- a/src/filterHotSpots/FileFilterHotspot.h +++ b/src/filterHotSpots/FileFilterHotspot.h @@ -43,7 +43,7 @@ public: * Opens kate for editing the file. */ void activate(QObject *object = nullptr) override; - void setupMenu(QMenu *menu) override; + QList setupMenu(QMenu *menu) override; KFileItem fileItem() const; void requestThumbnail(Qt::KeyboardModifiers modifiers, const QPoint &pos); diff --git a/src/filterHotSpots/HotSpot.cpp b/src/filterHotSpots/HotSpot.cpp index bb0d9e90c..e4777841c 100644 --- a/src/filterHotSpots/HotSpot.cpp +++ b/src/filterHotSpots/HotSpot.cpp @@ -32,9 +32,9 @@ QList HotSpot::actions() return {}; } -void HotSpot::setupMenu(QMenu *) +QList HotSpot::setupMenu(QMenu *) { - + return {}; } int HotSpot::startLine() const diff --git a/src/filterHotSpots/HotSpot.h b/src/filterHotSpots/HotSpot.h index 922187baa..d7ce32308 100644 --- a/src/filterHotSpots/HotSpot.h +++ b/src/filterHotSpots/HotSpot.h @@ -96,9 +96,15 @@ public: virtual void startDrag(); /** - * Setups a menu with actions for the hotspot. - */ - virtual void setupMenu(QMenu *menu); + * Sets a menu up with actions for the hotspot. + * + * Returns a list of the added actions (useful for removing e.g. + * the open-with actions before adding new ones to prevent duplicate + * open-with actions being shown in @p menu). + * + * The base implementation does nothing. + */ + virtual QList setupMenu(QMenu *menu); QPair region(int fontWidth, int fontHeight, int columns, QRect terminalDisplayRect) const; diff --git a/src/session/SessionController.cpp b/src/session/SessionController.cpp index b3dee7deb..ea5305dbd 100644 --- a/src/session/SessionController.cpp +++ b/src/session/SessionController.cpp @@ -1790,12 +1790,13 @@ void SessionController::showDisplayContextMenu(const QPoint& position) copy->setShortcut(Konsole::ACCEL | Qt::SHIFT | Qt::Key_C); #endif + QList toRemove; // prepend content-specific actions such as "Open Link", "Copy Email Address" etc QSharedPointer hotSpot = view()->filterActions(position); if (hotSpot != nullptr) { popup->insertActions(popup->actions().value(0, nullptr), hotSpot->actions() << contentSeparator ); popup->addAction(contentSeparator); - hotSpot->setupMenu(popup.data()); + toRemove = hotSpot->setupMenu(popup.data()); } // always update this submenu before showing the context menu, @@ -1821,11 +1822,8 @@ void SessionController::showDisplayContextMenu(const QPoint& position) if (!popup.isNull()) { delete contentSeparator; // Remove the 'Open with' actions from it. - const auto actList = popup->actions(); - for (auto *action : actList) { - if (action->text().toLower().remove(QLatin1Char('&')).contains(i18n("open with"))) { - popup->removeAction(action); - } + for (auto *act : toRemove) { + popup->removeAction(act); } // Remove the Accelerator for the copy shortcut so we don't have two actions with same shortcut.