┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dolphincontextmenu.cpp121
-rw-r--r--src/dolphincontextmenu.h58
-rw-r--r--src/dolphinmainwindow.cpp29
-rw-r--r--src/dolphinmainwindow.h9
-rw-r--r--src/dolphinpart.cpp11
-rw-r--r--src/dolphinpart.h9
-rw-r--r--src/views/dolphinview.cpp4
-rw-r--r--src/views/dolphinview.h7
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