#include "dolphinplacesmodelsingleton.h"
#include "dolphinremoveaction.h"
#include "dolphinviewcontainer.h"
+#include "global.h"
#include "trash/dolphintrash.h"
#include "views/dolphinview.h"
#include "views/viewmodecontroller.h"
#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()
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")) {
// 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)
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)) {
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()
// 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());
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) {
} 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 {
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);
}
addAdditionalActions(baseUrlProperties);
- addCustomActions();
addSeparator();
QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties"));
addAction(propertiesAction);
-
- exec(m_pos);
}
void DolphinContextMenu::insertDefaultItemActions(const KFileItemListProperties& properties)
m_fileItemActions->insertOpenWithActionsTo(nullptr, this, QStringList{qApp->desktopFileName()});
}
-void DolphinContextMenu::addCustomActions()
-{
- addActions(m_customActions);
-}
-
void DolphinContextMenu::addAdditionalActions(const KFileItemListProperties &props)
{
addSeparator();
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;
*/
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;
SearchContext = 8,
};
- QPoint m_pos;
DolphinMainWindow* m_mainWindow;
KFileItem m_fileInfo;
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();