]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix: can't drop into remote dir
authorJin Liu <m.liu.jin@gmail.com>
Tue, 20 Feb 2024 12:09:26 +0000 (20:09 +0800)
committerJin Liu <m.liu.jin@gmail.com>
Tue, 27 Feb 2024 02:13:21 +0000 (10:13 +0800)
KFileItem::isDir() only works when it's created from listDir(),
or from a local QUrl. For a remote QUrl, isDir always returns
false, so we can't use that in supportsDropping().

As a workaround, now supportsDropping() always returns true in
remote dirs -- we don't check if a remote dir is writable when
dropping.

src/views/draganddrophelper.cpp
src/views/draganddrophelper.h

index efdec5b92c73e4d7b6975069e2c183948663fc34..7b9949df4db17408537aa9743a69504d61c95c14 100644 (file)
@@ -52,7 +52,12 @@ KIO::DropJob *DragAndDropHelper::dropUrls(const QUrl &destUrl, QDropEvent *event
             return nullptr;
         }
 
-        if (supportsDropping(destUrl)) {
+        // TODO: remove this check once Qt is fixed so that it doesn't emit a QDropEvent on Wayland
+        // when we called QDragMoveEvent::ignore()
+        // https://codereview.qt-project.org/c/qt/qtwayland/+/541750
+        KFileItem item(destUrl);
+        // KFileItem(QUrl) only stat local URLs, so we always allow dropping on non-local URLs
+        if (!item.isLocalFile() || supportsDropping(item)) {
             // Drop into a directory or a desktop-file
             KIO::DropJob *job = KIO::drop(event, destUrl);
             KJobWidgets::setWindow(job, window);
@@ -63,12 +68,6 @@ KIO::DropJob *DragAndDropHelper::dropUrls(const QUrl &destUrl, QDropEvent *event
     return nullptr;
 }
 
-bool DragAndDropHelper::supportsDropping(const QUrl &destUrl)
-{
-    KFileItem item(destUrl);
-    return supportsDropping(item);
-}
-
 bool DragAndDropHelper::supportsDropping(const KFileItem &destItem)
 {
     return (destItem.isDir() && destItem.isWritable()) || destItem.isDesktopFile();
@@ -80,7 +79,8 @@ void DragAndDropHelper::updateDropAction(QDropEvent *event, const QUrl &destUrl)
         event->setDropAction(Qt::IgnoreAction);
         event->ignore();
     }
-    if (supportsDropping(destUrl)) {
+    KFileItem item(destUrl);
+    if (!item.isLocalFile() || supportsDropping(item)) {
         event->setDropAction(event->proposedAction());
         event->accept();
     } else {
index 0eee34a3d84b288c5b5de43ced283aa2e504bea1..73043febc2ee91d70766179197c732e16af4a3ee 100644 (file)
@@ -42,15 +42,6 @@ public:
      */
     static KIO::DropJob *dropUrls(const QUrl &destUrl, QDropEvent *event, QWidget *window);
 
-    /**
-     * Checks if the destination supports dropping.
-     *
-     * @param destUrl   URL of the item destination.
-     * @return          True if the destination is a directory and is writable, or it's a desktop file.
-     *                  False otherwise.
-     */
-    static bool supportsDropping(const QUrl &destUrl);
-
     /**
      * Checks if the destination supports dropping.
      *