From 0eed595268d2b0478eee1d5bf5ed6bbd100cdf4c Mon Sep 17 00:00:00 2001 From: Jin Liu Date: Tue, 20 Feb 2024 20:09:26 +0800 Subject: Fix: can't drop into remote dir 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 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/views/draganddrophelper.cpp') diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp index efdec5b92..7b9949df4 100644 --- a/src/views/draganddrophelper.cpp +++ b/src/views/draganddrophelper.cpp @@ -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 { -- cgit v1.3