┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/views/draganddrophelper.cpp
diff options
context:
space:
mode:
authorJin Liu <[email protected]>2024-02-17 11:14:46 +0000
committerJin Liu <[email protected]>2024-02-17 11:14:46 +0000
commitc9c3531c0b6da07de8f90761a3d799ace62f8e89 (patch)
treee03fa5263d491c31cabf3cad429adf2297f768d2 /src/views/draganddrophelper.cpp
parentcda139ccab2c78ac71a9f2aad286cbe1ace46734 (diff)
Improve DnD handling in read-only dirs
1. Places panel and tabbar update drag status in read-only dir 2. Don't create drop job in readonly directories
Diffstat (limited to 'src/views/draganddrophelper.cpp')
-rw-r--r--src/views/draganddrophelper.cpp36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp
index 2953233d0..efdec5b92 100644
--- a/src/views/draganddrophelper.cpp
+++ b/src/views/draganddrophelper.cpp
@@ -52,15 +52,43 @@ KIO::DropJob *DragAndDropHelper::dropUrls(const QUrl &destUrl, QDropEvent *event
return nullptr;
}
- // Drop into a directory or a desktop-file
- KIO::DropJob *job = KIO::drop(event, destUrl);
- KJobWidgets::setWindow(job, window);
- return job;
+ if (supportsDropping(destUrl)) {
+ // Drop into a directory or a desktop-file
+ KIO::DropJob *job = KIO::drop(event, destUrl);
+ KJobWidgets::setWindow(job, window);
+ return job;
+ }
}
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();
+}
+
+void DragAndDropHelper::updateDropAction(QDropEvent *event, const QUrl &destUrl)
+{
+ if (urlListMatchesUrl(event->mimeData()->urls(), destUrl)) {
+ event->setDropAction(Qt::IgnoreAction);
+ event->ignore();
+ }
+ if (supportsDropping(destUrl)) {
+ event->setDropAction(event->proposedAction());
+ event->accept();
+ } else {
+ event->setDropAction(Qt::IgnoreAction);
+ event->ignore();
+ }
+}
+
void DragAndDropHelper::clearUrlListMatchesUrlCache()
{
DragAndDropHelper::m_urlListMatchesUrlCache.clear();