1
0
mirror of https://invent.kde.org/system/dolphin synced 2024-07-02 16:31:23 +00:00

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.
This commit is contained in:
Jin Liu 2024-02-20 20:09:26 +08:00
parent f13f3c7a26
commit 0eed595268
2 changed files with 8 additions and 17 deletions

View 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 {

View 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.
*