]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphincontextmenu.cpp
Re-allow to paste files via context menu
[dolphin.git] / src / dolphincontextmenu.cpp
index d4807d3a7669635179ab0591c0c47e5a189fde37..283f5256509cd85346d52a3947642b18e8f02730 100644 (file)
@@ -36,7 +36,6 @@
 #include <QApplication>
 #include <QClipboard>
 #include <QKeyEvent>
-#include <QMenu>
 #include <QMenuBar>
 #include <QMimeDatabase>
 
@@ -164,7 +163,7 @@ void DolphinContextMenu::openTrashItemContextMenu()
     if (exec(m_pos) == restoreAction) {
         QList<QUrl> selectedUrls;
         selectedUrls.reserve(m_selectedItems.count());
-        foreach (const KFileItem &item, m_selectedItems) {
+        for (const KFileItem &item : qAsConst(m_selectedItems)) {
             selectedUrls.append(item.url());
         }
 
@@ -317,13 +316,7 @@ void DolphinContextMenu::openViewportContextMenu()
 {
     const DolphinView* view = m_mainWindow->activeViewContainer()->view();
 
-    // Insert 'Open With' entries
-    KFileItem baseItem = view->rootItem();
-    if (baseItem.isNull() || baseItem.url() != m_baseUrl) {
-        baseItem = baseFileItem();
-    }
-
-    const KFileItemListProperties baseUrlProperties(KFileItemList() << baseItem);
+    const KFileItemListProperties baseUrlProperties(KFileItemList() << baseFileItem());
     KFileItemActions fileItemActions;
     fileItemActions.setParentWidget(m_mainWindow);
     fileItemActions.setItemListProperties(baseUrlProperties);
@@ -335,14 +328,14 @@ void DolphinContextMenu::openViewportContextMenu()
     newFileMenu->setPopupFiles(QList<QUrl>() << m_baseUrl);
     addMenu(newFileMenu->menu());
 
-    // Don't show "Open With" menu items if the current dir is empty, because there's
-    // generally no app that can do anything interesting with an empty directory
-    if (view->itemsCount() != 0) {
-        addOpenWithActions(fileItemActions);
-    }
+    // Show "open with" menu items even if the dir is empty, because there are legitimate
+    // use cases for this, such as opening an empty dir in Kate or VSCode or something
+    addOpenWithActions(fileItemActions);
 
     QAction* pasteAction = createPasteAction();
-    addAction(pasteAction);
+    if (pasteAction) {
+        addAction(pasteAction);
+    }
 
     // Insert 'Add to Places' entry if it's not already in the places panel
     if (!placeExists(m_mainWindow->activeViewContainer()->url())) {
@@ -384,7 +377,10 @@ void DolphinContextMenu::insertDefaultItemActions(const KFileItemListProperties&
     QAction* copyPathAction = collection->action(QString("copy_location"));
     copyPathAction->setEnabled(m_selectedItems.size() == 1);
     addAction(copyPathAction);
-    addAction(createPasteAction());
+    QAction* pasteAction = createPasteAction();
+    if (pasteAction) {
+        addAction(pasteAction);
+    }
     addAction(m_mainWindow->actionCollection()->action(QStringLiteral("duplicate")));
 
     addSeparator();
@@ -436,16 +432,26 @@ bool DolphinContextMenu::placeExists(const QUrl& url) const
 QAction* DolphinContextMenu::createPasteAction()
 {
     QAction* action = nullptr;
-    const bool isDir = !m_fileInfo.isNull() && m_fileInfo.isDir();
-    if (isDir && (m_selectedItems.count() == 1)) {
+    KFileItem destItem;
+    if (!m_fileInfo.isNull() && m_selectedItems.count() <= 1) {
+        destItem = m_fileInfo;
+    } else {
+        destItem = baseFileItem();
+    }
+
+    if (!destItem.isNull() && destItem.isDir()) {
         const QMimeData *mimeData = QApplication::clipboard()->mimeData();
         bool canPaste;
-        const QString text = KIO::pasteActionText(mimeData, &canPaste, m_fileInfo);
-        action = new QAction(QIcon::fromTheme(QStringLiteral("edit-paste")), text, this);
-        action->setEnabled(canPaste);
-        connect(action, &QAction::triggered, m_mainWindow, &DolphinMainWindow::pasteIntoFolder);
-    } else {
-        action = m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::Paste));
+        const QString text = KIO::pasteActionText(mimeData, &canPaste, destItem);
+        if (canPaste) {
+            if (destItem == m_fileInfo) {
+                // if paste destination is a selected folder
+                action = new QAction(QIcon::fromTheme(QStringLiteral("edit-paste")), text, this);
+                connect(action, &QAction::triggered, m_mainWindow, &DolphinMainWindow::pasteIntoFolder);
+            } else {
+                action = m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::Paste));
+            }
+        }
     }
 
     return action;
@@ -462,7 +468,13 @@ KFileItemListProperties& DolphinContextMenu::selectedItemsProperties() const
 KFileItem DolphinContextMenu::baseFileItem()
 {
     if (!m_baseFileItem) {
-        m_baseFileItem = new KFileItem(m_baseUrl);
+        const DolphinView* view = m_mainWindow->activeViewContainer()->view();
+        KFileItem baseItem = view->rootItem();
+        if (baseItem.isNull() || baseItem.url() != m_baseUrl) {
+            m_baseFileItem = new KFileItem(m_baseUrl);
+        } else {
+            m_baseFileItem = new KFileItem(baseItem);
+        }
     }
     return *m_baseFileItem;
 }