┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/views/draganddrophelper.cpp
diff options
context:
space:
mode:
authorFelix Ernst <[email protected]>2024-06-26 12:45:48 +0200
committerFelix Ernst <[email protected]>2024-07-01 14:06:01 +0000
commite2f316578909e4c886430110808d4681997b3cb7 (patch)
tree24ad0b932127925198e06cf8befecdc106b382ed /src/views/draganddrophelper.cpp
parent92b178b7404b002778d8288353f65e27ee5de5dd (diff)
Revert "DragAndDropHelper::updateDropAction: use StatJob for remote URLs"
This reverts commit dc149ec5e52f52c514cf362603d05ba8eea506b8. This prevents a crash. One issue identified is that the commit that I am reverting here accesses a QDropEvent at a moment in time in which it might have already been deleted. We cannot check if it exists by that time because we do not control its lifetime and it is not a QObject.
Diffstat (limited to 'src/views/draganddrophelper.cpp')
-rw-r--r--src/views/draganddrophelper.cpp79
1 files changed, 7 insertions, 72 deletions
diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp
index 7163507a6..7b9949df4 100644
--- a/src/views/draganddrophelper.cpp
+++ b/src/views/draganddrophelper.cpp
@@ -73,85 +73,20 @@ bool DragAndDropHelper::supportsDropping(const KFileItem &destItem)
return (destItem.isDir() && destItem.isWritable()) || destItem.isDesktopFile();
}
-DragAndDropHelper::DragAndDropHelper(QObject *parent)
- : QObject(parent)
-{
- m_destItemCacheInvalidationTimer.setSingleShot(true);
- m_destItemCacheInvalidationTimer.setInterval(30000);
- connect(&m_destItemCacheInvalidationTimer, &QTimer::timeout, this, [this]() {
- m_destItemCache = KFileItem();
- });
-}
-
void DragAndDropHelper::updateDropAction(QDropEvent *event, const QUrl &destUrl)
{
- auto processEvent = [this](QDropEvent *event) {
- if (supportsDropping(m_destItemCache)) {
- event->setDropAction(event->proposedAction());
- event->accept();
- } else {
- event->setDropAction(Qt::IgnoreAction);
- event->ignore();
- }
- };
-
- m_lastUndecidedEvent = nullptr;
-
if (urlListMatchesUrl(event->mimeData()->urls(), destUrl)) {
event->setDropAction(Qt::IgnoreAction);
event->ignore();
- return;
}
-
- if (destUrl == m_destItemCache.url()) {
- // We already received events for this URL, and already have the
- // stat result cached because:
- // 1. it's a local file, and we already called KFileItem(destUrl)
- // 2. it's a remote file, and StatJob finished
- processEvent(event);
- return;
- }
-
- if (m_statJob) {
- if (destUrl == m_statJobUrl) {
- // We already received events for this URL. Still waiting for
- // the stat result. StatJob will process the event when it finishes.
- m_lastUndecidedEvent = event;
- return;
- }
-
- // We are waiting for the stat result of a different URL. Cancel.
- m_statJob->kill();
- m_statJob = nullptr;
- m_statJobUrl.clear();
- }
-
- if (destUrl.isLocalFile()) {
- // New local URL. KFileItem will stat on demand.
- m_destItemCache = KFileItem(destUrl);
- m_destItemCacheInvalidationTimer.start();
- processEvent(event);
- return;
+ KFileItem item(destUrl);
+ if (!item.isLocalFile() || supportsDropping(item)) {
+ event->setDropAction(event->proposedAction());
+ event->accept();
+ } else {
+ event->setDropAction(Qt::IgnoreAction);
+ event->ignore();
}
-
- // New remote URL. Start a StatJob and process the event when it finishes.
- m_lastUndecidedEvent = event;
- m_statJob = KIO::stat(destUrl, KIO::StatJob::SourceSide, KIO::StatDetail::StatBasic, KIO::JobFlag::HideProgressInfo);
- m_statJobUrl = destUrl;
- connect(m_statJob, &KIO::StatJob::result, this, [this, processEvent](KJob *job) {
- KIO::StatJob *statJob = static_cast<KIO::StatJob *>(job);
-
- m_destItemCache = KFileItem(statJob->statResult(), m_statJobUrl);
- m_destItemCacheInvalidationTimer.start();
-
- if (m_lastUndecidedEvent) {
- processEvent(m_lastUndecidedEvent);
- m_lastUndecidedEvent = nullptr;
- }
-
- m_statJob = nullptr;
- m_statJobUrl.clear();
- });
}
void DragAndDropHelper::clearUrlListMatchesUrlCache()