X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/9aee5d22513f0367febab54b38b3a7dc58d120bb..8aa81a1dc7fa978d44d2c6397df270432df1506f:/src/views/draganddrophelper.cpp diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp index c0044c96e..b3f2a4c3e 100644 --- a/src/views/draganddrophelper.cpp +++ b/src/views/draganddrophelper.cpp @@ -1,53 +1,69 @@ -/*************************************************************************** - * Copyright (C) 2007-2011 by Peter Penz * - * Copyright (C) 2007 by David Faure * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ +/* + * SPDX-FileCopyrightText: 2007-2011 Peter Penz + * SPDX-FileCopyrightText: 2007 David Faure + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ #include "draganddrophelper.h" -#include -#include +#include +#include + #include +#include #include #include -#include -#include +QHash DragAndDropHelper::m_urlListMatchesUrlCache; + +bool DragAndDropHelper::urlListMatchesUrl(const QList& urls, const QUrl& destUrl) +{ + auto iteratorResult = m_urlListMatchesUrlCache.constFind(destUrl); + if (iteratorResult != m_urlListMatchesUrlCache.constEnd()) { + return *iteratorResult; + } + + const bool destUrlMatches = + std::find_if(urls.constBegin(), urls.constEnd(), [destUrl](const QUrl& url) { + return url.matches(destUrl, QUrl::StripTrailingSlash); + }) != urls.constEnd(); + + return *m_urlListMatchesUrlCache.insert(destUrl, destUrlMatches); +} KIO::DropJob* DragAndDropHelper::dropUrls(const QUrl& destUrl, QDropEvent* event, QWidget* window) { const QMimeData* mimeData = event->mimeData(); - if (mimeData->hasFormat("application/x-kde-ark-dndextract-service") && - mimeData->hasFormat("application/x-kde-ark-dndextract-path")) { - const QString remoteDBusClient = mimeData->data("application/x-kde-ark-dndextract-service"); - const QString remoteDBusPath = mimeData->data("application/x-kde-ark-dndextract-path"); + if (isArkDndMimeType(mimeData)) { + const QString remoteDBusClient = mimeData->data(arkDndServiceMimeType()); + const QString remoteDBusPath = mimeData->data(arkDndPathMimeType()); QDBusMessage message = QDBusMessage::createMethodCall(remoteDBusClient, remoteDBusPath, - "org.kde.ark.DndExtract", "extractSelectedFilesTo"); + QStringLiteral("org.kde.ark.DndExtract"), QStringLiteral("extractSelectedFilesTo")); message.setArguments({destUrl.toDisplayString(QUrl::PreferLocalFile)}); QDBusConnection::sessionBus().call(message); } else { + if (urlListMatchesUrl(event->mimeData()->urls(), destUrl)) { + return nullptr; + } + // Drop into a directory or a desktop-file KIO::DropJob *job = KIO::drop(event, destUrl); KJobWidgets::setWindow(job, window); return job; } - return 0; + return nullptr; } +void DragAndDropHelper::clearUrlListMatchesUrlCache() +{ + DragAndDropHelper::m_urlListMatchesUrlCache.clear(); +} + +bool DragAndDropHelper::isArkDndMimeType(const QMimeData *mimeData) +{ + return mimeData->hasFormat(arkDndServiceMimeType()) + && mimeData->hasFormat(arkDndPathMimeType()); +}