diff options
| -rw-r--r-- | src/dolphincontextmenu.cpp | 121 | ||||
| -rw-r--r-- | src/dolphincontextmenu.h | 58 | ||||
| -rw-r--r-- | src/dolphinmainwindow.cpp | 29 | ||||
| -rw-r--r-- | src/dolphinmainwindow.h | 9 | ||||
| -rw-r--r-- | src/dolphinpart.cpp | 11 | ||||
| -rw-r--r-- | src/dolphinpart.h | 9 | ||||
| -rw-r--r-- | src/views/dolphinview.cpp | 4 | ||||
| -rw-r--r-- | src/views/dolphinview.h | 7 |
8 files changed, 74 insertions, 174 deletions
diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index 340af6bd0..65d841060 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -13,6 +13,7 @@ #include "dolphinplacesmodelsingleton.h" #include "dolphinremoveaction.h" #include "dolphinviewcontainer.h" +#include "global.h" #include "trash/dolphintrash.h" #include "views/dolphinview.h" #include "views/viewmodecontroller.h" @@ -38,34 +39,25 @@ #include <QMimeDatabase> DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent, - const QPoint& pos, const KFileItem& fileInfo, + const KFileItemList &selectedItems, const QUrl& baseUrl, KFileItemActions *fileItemActions) : QMenu(parent), - m_pos(pos), m_mainWindow(parent), m_fileInfo(fileInfo), m_baseUrl(baseUrl), m_baseFileItem(nullptr), - m_selectedItems(), + m_selectedItems(selectedItems), m_selectedItemsProperties(nullptr), m_context(NoContext), m_copyToMenu(parent), - m_customActions(), - m_command(None), m_removeAction(nullptr), m_fileItemActions(fileItemActions) { - // The context menu either accesses the URLs of the selected items - // or the items itself. To increase the performance both lists are cached. - const DolphinView* view = m_mainWindow->activeViewContainer()->view(); - m_selectedItems = view->selectedItems(); - QApplication::instance()->installEventFilter(this); - static_cast<KHamburgerMenu *>(m_mainWindow->actionCollection()-> - action(QStringLiteral("hamburger_menu")))->addToMenu(this); + addAllActions(); } DolphinContextMenu::~DolphinContextMenu() @@ -76,13 +68,11 @@ DolphinContextMenu::~DolphinContextMenu() m_selectedItemsProperties = nullptr; } -void DolphinContextMenu::setCustomActions(const QList<QAction*>& actions) +void DolphinContextMenu::addAllActions() { - m_customActions = actions; -} + static_cast<KHamburgerMenu *>(m_mainWindow->actionCollection()-> + action(QStringLiteral("hamburger_menu")))->addToMenu(this); -DolphinContextMenu::Command DolphinContextMenu::open() -{ // get the context information const auto scheme = m_baseUrl.scheme(); if (scheme == QLatin1String("trash")) { @@ -101,17 +91,15 @@ DolphinContextMenu::Command DolphinContextMenu::open() // open the corresponding popup for the context if (m_context & TrashContext) { if (m_context & ItemContext) { - openTrashItemContextMenu(); + addTrashItemContextMenu(); } else { - openTrashContextMenu(); + addTrashContextMenu(); } } else if (m_context & ItemContext) { - openItemContextMenu(); + addItemContextMenu(); } else { - openViewportContextMenu(); + addViewportContextMenu(); } - - return m_command; } bool DolphinContextMenu::eventFilter(QObject* object, QEvent* event) @@ -133,39 +121,25 @@ bool DolphinContextMenu::eventFilter(QObject* object, QEvent* event) return false; } -void DolphinContextMenu::openTrashContextMenu() +void DolphinContextMenu::addTrashContextMenu() { Q_ASSERT(m_context & TrashContext); - QAction* emptyTrashAction = new QAction(QIcon::fromTheme(QStringLiteral("trash-empty")), i18nc("@action:inmenu", "Empty Trash"), this); + QAction *emptyTrashAction = addAction(QIcon::fromTheme(QStringLiteral("trash-empty")), i18nc("@action:inmenu", "Empty Trash"), [this](){ + Trash::empty(m_mainWindow); + }); emptyTrashAction->setEnabled(!Trash::isEmpty()); - addAction(emptyTrashAction); - - addCustomActions(); QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties")); addAction(propertiesAction); - - if (exec(m_pos) == emptyTrashAction) { - Trash::empty(m_mainWindow); - } } -void DolphinContextMenu::openTrashItemContextMenu() +void DolphinContextMenu::addTrashItemContextMenu() { Q_ASSERT(m_context & TrashContext); Q_ASSERT(m_context & ItemContext); - QAction* restoreAction = new QAction(QIcon::fromTheme("restoration"), i18nc("@action:inmenu", "Restore"), m_mainWindow); - addAction(restoreAction); - - QAction* deleteAction = m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::DeleteFile)); - addAction(deleteAction); - - QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties")); - addAction(propertiesAction); - - if (exec(m_pos) == restoreAction) { + addAction(QIcon::fromTheme("restoration"), i18nc("@action:inmenu", "Restore"), [this](){ QList<QUrl> selectedUrls; selectedUrls.reserve(m_selectedItems.count()); for (const KFileItem &item : qAsConst(m_selectedItems)) { @@ -175,7 +149,13 @@ void DolphinContextMenu::openTrashItemContextMenu() KIO::RestoreJob *job = KIO::restoreFromTrash(selectedUrls); KJobWidgets::setWindow(job, m_mainWindow); job->uiDelegate()->setAutoErrorHandlingEnabled(true); - } + }); + + QAction* deleteAction = m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::DeleteFile)); + addAction(deleteAction); + + QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties")); + addAction(propertiesAction); } void DolphinContextMenu::addDirectoryItemContextMenu() @@ -194,7 +174,6 @@ void DolphinContextMenu::addDirectoryItemContextMenu() // set up 'Create New' menu DolphinNewFileMenu* newFileMenu = new DolphinNewFileMenu(m_mainWindow->actionCollection(), m_mainWindow); - const DolphinView* view = m_mainWindow->activeViewContainer()->view(); newFileMenu->checkUpToDate(); newFileMenu->setPopupFiles(QList<QUrl>() << m_fileInfo.url()); newFileMenu->setEnabled(selectedItemsProps.supportsWriting()); @@ -209,16 +188,12 @@ void DolphinContextMenu::addDirectoryItemContextMenu() addSeparator(); } -void DolphinContextMenu::openItemContextMenu() +void DolphinContextMenu::addItemContextMenu() { Q_ASSERT(!m_fileInfo.isNull()); - QAction* openParentAction = nullptr; - QAction* openParentInNewWindowAction = nullptr; - QAction* openParentInNewTabAction = nullptr; const KFileItemListProperties& selectedItemsProps = selectedItemsProperties(); - m_fileItemActions->setItemListProperties(selectedItemsProps); if (m_selectedItems.count() == 1) { @@ -228,23 +203,28 @@ void DolphinContextMenu::openItemContextMenu() } else if (m_context & TimelineContext || m_context & SearchContext) { addOpenWithActions(); - openParentAction = new QAction(QIcon::fromTheme(QStringLiteral("document-open-folder")), + addAction(QIcon::fromTheme(QStringLiteral("document-open-folder")), i18nc("@action:inmenu", "Open Path"), - this); - addAction(openParentAction); + [this](){ + m_mainWindow->changeUrl(KIO::upUrl(m_fileInfo.url())); + m_mainWindow->activeViewContainer()->view()->markUrlsAsSelected({m_fileInfo.url()}); + m_mainWindow->activeViewContainer()->view()->markUrlAsCurrent(m_fileInfo.url()); + }); - openParentInNewWindowAction = new QAction(QIcon::fromTheme(QStringLiteral("window-new")), + addAction(QIcon::fromTheme(QStringLiteral("window-new")), i18nc("@action:inmenu", "Open Path in New Window"), - this); - addAction(openParentInNewWindowAction); + [this](){ + Dolphin::openNewWindow({m_fileInfo.url()}, m_mainWindow, Dolphin::OpenNewWindowFlag::Select); + }); - openParentInNewTabAction = new QAction(QIcon::fromTheme(QStringLiteral("tab-new")), + addAction(QIcon::fromTheme(QStringLiteral("tab-new")), i18nc("@action:inmenu", "Open Path in New Tab"), - this); - addAction(openParentInNewTabAction); + [this](){ + m_mainWindow->openNewTab(KIO::upUrl(m_fileInfo.url())); + }); addSeparator(); } else { @@ -290,23 +270,10 @@ void DolphinContextMenu::openItemContextMenu() addSeparator(); QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties")); addAction(propertiesAction); - - QAction* activatedAction = exec(m_pos); - if (activatedAction) { - if (activatedAction == openParentAction) { - m_command = OpenParentFolder; - } else if (activatedAction == openParentInNewWindowAction) { - m_command = OpenParentFolderInNewWindow; - } else if (activatedAction == openParentInNewTabAction) { - m_command = OpenParentFolderInNewTab; - } - } } -void DolphinContextMenu::openViewportContextMenu() +void DolphinContextMenu::addViewportContextMenu() { - const DolphinView* view = m_mainWindow->activeViewContainer()->view(); - const KFileItemListProperties baseUrlProperties(KFileItemList() << baseFileItem()); m_fileItemActions->setItemListProperties(baseUrlProperties); @@ -344,14 +311,11 @@ void DolphinContextMenu::openViewportContextMenu() } addAdditionalActions(baseUrlProperties); - addCustomActions(); addSeparator(); QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties")); addAction(propertiesAction); - - exec(m_pos); } void DolphinContextMenu::insertDefaultItemActions(const KFileItemListProperties& properties) @@ -476,11 +440,6 @@ void DolphinContextMenu::addOpenWithActions() m_fileItemActions->insertOpenWithActionsTo(nullptr, this, QStringList{qApp->desktopFileName()}); } -void DolphinContextMenu::addCustomActions() -{ - addActions(m_customActions); -} - void DolphinContextMenu::addAdditionalActions(const KFileItemListProperties &props) { addSeparator(); diff --git a/src/dolphincontextmenu.h b/src/dolphincontextmenu.h index e033fca6e..627a6e3b8 100644 --- a/src/dolphincontextmenu.h +++ b/src/dolphincontextmenu.h @@ -37,60 +37,42 @@ class DolphinContextMenu : public QMenu Q_OBJECT public: - enum Command - { - None, - OpenParentFolder, - OpenParentFolderInNewWindow, - OpenParentFolderInNewTab - }; - /** * @parent Pointer to the main window the context menu * belongs to. - * @pos Position in screen coordinates. * @fileInfo Pointer to the file item the context menu * is applied. If 0 is passed, the context menu * is above the viewport. + * @selectedItems The selected items for which the context menu + * is opened. This list generally includes \a fileInfo. * @baseUrl Base URL of the viewport where the context menu * should be opened. */ DolphinContextMenu(DolphinMainWindow* parent, - const QPoint& pos, const KFileItem& fileInfo, + const KFileItemList &selectedItems, const QUrl& baseUrl, KFileItemActions *fileItemActions); ~DolphinContextMenu() override; - void setCustomActions(const QList<QAction*>& actions); - - /** - * Opens the context menu model and returns the requested - * command, that should be triggered by the caller. If - * Command::None has been returned, either the context-menu - * had been closed without executing an action or an - * already available action from the main-window has been - * executed. - */ - Command open(); - protected: bool eventFilter(QObject* object, QEvent* event) override; private: - void openTrashContextMenu(); - void openTrashItemContextMenu(); - void openItemContextMenu(); - void openViewportContextMenu(); - - void insertDefaultItemActions(const KFileItemListProperties&); - /** - * Adds the "Show menubar" action to the menu if the - * menubar is hidden. + * Adds all the actions and menus to this menu based on all given information. + * This method calls the other helper methods for adding actions + * based on the context given in the constructor. */ - void addShowMenuBarAction(); + void addAllActions(); + + void addTrashContextMenu(); + void addTrashItemContextMenu(); + void addItemContextMenu(); + void addViewportContextMenu(); + + void insertDefaultItemActions(const KFileItemListProperties&); bool placeExists(const QUrl& url) const; @@ -109,17 +91,11 @@ private: void addOpenWithActions(); /** - * Adds custom actions e.g. like the "[x] Expandable Folders"-action - * provided in the details view. - */ - void addCustomActions(); - -private: - /** * Add services, custom actions, plugins and version control items to the menu */ void addAdditionalActions(const KFileItemListProperties &props); +private: struct Entry { int type; @@ -139,7 +115,6 @@ private: SearchContext = 8, }; - QPoint m_pos; DolphinMainWindow* m_mainWindow; KFileItem m_fileInfo; @@ -152,9 +127,6 @@ private: int m_context; KFileCopyToMenu m_copyToMenu; - QList<QAction*> m_customActions; - - Command m_command; DolphinRemoveAction* m_removeAction; // Action that represents either 'Move To Trash' or 'Delete' void addDirectoryItemContextMenu(); diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index d244c4a7c..589c2c185 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -1178,32 +1178,11 @@ void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable) void DolphinMainWindow::openContextMenu(const QPoint& pos, const KFileItem& item, - const QUrl& url, - const QList<QAction*>& customActions) + const KFileItemList &selectedItems, + const QUrl& url) { - QPointer<DolphinContextMenu> contextMenu = new DolphinContextMenu(this, pos, item, url, &m_fileItemActions); - contextMenu.data()->setCustomActions(customActions); - const DolphinContextMenu::Command command = contextMenu.data()->open(); - - switch (command) { - case DolphinContextMenu::OpenParentFolder: - changeUrl(KIO::upUrl(item.url())); - m_activeViewContainer->view()->markUrlsAsSelected({item.url()}); - m_activeViewContainer->view()->markUrlAsCurrent(item.url()); - break; - - case DolphinContextMenu::OpenParentFolderInNewWindow: - Dolphin::openNewWindow({item.url()}, this, Dolphin::OpenNewWindowFlag::Select); - break; - - case DolphinContextMenu::OpenParentFolderInNewTab: - openNewTab(KIO::upUrl(item.url())); - break; - - case DolphinContextMenu::None: - default: - break; - } + QPointer<DolphinContextMenu> contextMenu = new DolphinContextMenu(this, item, selectedItems, url, &m_fileItemActions); + contextMenu.data()->exec(pos); // Delete the menu, unless it has been deleted in its own nested event loop already. if (contextMenu) { diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index fbe926cef..17327f2de 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -475,14 +475,11 @@ private Q_SLOTS: * @pos Position in screen coordinates. * @item File item context. If item is null, the context menu * should be applied to \a url. + * @selectedItems The selected items for which the context menu + * is opened. This list generally includes \a item. * @url URL which contains \a item. - * @customActions Actions that should be added to the context menu, - * if the file item is null. */ - void openContextMenu(const QPoint& pos, - const KFileItem& item, - const QUrl& url, - const QList<QAction*>& customActions); + void openContextMenu(const QPoint& pos, const KFileItem& item, const KFileItemList &selectedItems, const QUrl& url); /** * Updates the menu that is by default at the right end of the toolbar. diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp index 059508778..0f10a7769 100644 --- a/src/dolphinpart.cpp +++ b/src/dolphinpart.cpp @@ -385,8 +385,8 @@ void DolphinPart::createNewWindow(const QUrl& url) void DolphinPart::slotOpenContextMenu(const QPoint& pos, const KFileItem& _item, - const QUrl &, - const QList<QAction*>& customActions) + const KFileItemList &selectedItems, + const QUrl &) { KParts::BrowserExtension::PopupFlags popupFlags = KParts::BrowserExtension::DefaultPopupItems | KParts::BrowserExtension::ShowProperties @@ -402,13 +402,11 @@ void DolphinPart::slotOpenContextMenu(const QPoint& pos, item.setUrl(url()); // ensure we use the view url, not the canonical path (#213799) } - // TODO: We should change the signature of the slots (and signals) for being able - // to tell for which items we want a popup. KFileItemList items; - if (m_view->selectedItems().isEmpty()) { + if (selectedItems.isEmpty()) { items.append(item); } else { - items = m_view->selectedItems(); + items = selectedItems; } KFileItemListProperties capabilities(items); @@ -416,7 +414,6 @@ void DolphinPart::slotOpenContextMenu(const QPoint& pos, KParts::BrowserExtension::ActionGroupMap actionGroups; QList<QAction *> editActions; editActions += m_view->versionControlActions(m_view->selectedItems()); - editActions += customActions; if (!_item.isNull()) { // only for context menu on one or more items const bool supportsMoving = capabilities.supportsMoving(); diff --git a/src/dolphinpart.h b/src/dolphinpart.h index 25d76950c..a49603ca8 100644 --- a/src/dolphinpart.h +++ b/src/dolphinpart.h @@ -123,14 +123,11 @@ private Q_SLOTS: * @pos Position in screen coordinates. * @item File item context. If item is null, the context menu * should be applied to \a url. + * @selectedItems The selected items for which the context menu + * is opened. This list generally includes \a item. * @url URL which contains \a item. - * @customActions Actions that should be added to the context menu, - * if the file item is null. */ - void slotOpenContextMenu(const QPoint& pos, - const KFileItem& item, - const QUrl& url, - const QList<QAction*>& customActions); + void slotOpenContextMenu(const QPoint &pos, const KFileItem &_item, const KFileItemList &selectedItems, const QUrl &); /** * Informs the host that we are opening \a url (e.g. after a redirection diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 5646fa982..e6aecff80 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -1058,12 +1058,12 @@ void DolphinView::slotItemContextMenuRequested(int index, const QPointF& pos) } const KFileItem item = m_model->fileItem(index); - Q_EMIT requestContextMenu(pos.toPoint(), item, url(), QList<QAction*>()); + Q_EMIT requestContextMenu(pos.toPoint(), item, selectedItems(), url()); } void DolphinView::slotViewContextMenuRequested(const QPointF& pos) { - Q_EMIT requestContextMenu(pos.toPoint(), KFileItem(), url(), QList<QAction*>()); + Q_EMIT requestContextMenu(pos.toPoint(), KFileItem(), selectedItems(), url()); } void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index e93ca4fa0..b40be8936 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -510,13 +510,12 @@ Q_SIGNALS: /** * Is emitted if a context menu is requested for the item \a item, * which is part of \a url. If the item is null, the context menu - * for the URL should be shown and the custom actions \a customActions - * will be added. + * for the URL should be shown. */ void requestContextMenu(const QPoint& pos, const KFileItem& item, - const QUrl& url, - const QList<QAction*>& customActions); + const KFileItemList &selectedItems, + const QUrl& url); /** * Is emitted if an information message with the content \a msg |
