From 1d7088b1ada3de716ff591c22d400198450208d4 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Mon, 30 Jan 2012 12:07:08 +0100 Subject: [PATCH] Fix drag & drop issues with non-local URLs BUG: 292821 BUG: 292355 FIXED-IN: 4.8.1 --- src/dolphinmainwindow.cpp | 2 +- src/dolphinviewcontainer.cpp | 3 +-- src/panels/folders/folderspanel.cpp | 8 ++------ src/panels/places/placespanel.cpp | 3 +-- src/views/dolphinview.cpp | 17 ++++++----------- src/views/draganddrophelper.cpp | 15 ++++++--------- src/views/draganddrophelper.h | 11 +++++++++-- 7 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 3654ed6c96..74b751f5ad 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -1330,7 +1330,7 @@ void DolphinMainWindow::tabDropEvent(int tab, QDropEvent* event) const ViewTab& viewTab = m_viewTab[tab]; const DolphinView* view = viewTab.isPrimaryViewActive ? viewTab.primaryView->view() : viewTab.secondaryView->view(); - DragAndDropHelper::dropUrls(view->rootItem(), event); + DragAndDropHelper::dropUrls(view->rootItem(), view->url(), event); } } diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index 2ad5bea5cc..72c943eb4a 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -538,8 +538,7 @@ void DolphinViewContainer::slotUrlNavigatorLocationChanged(const KUrl& url) void DolphinViewContainer::dropUrls(const KUrl& destination, QDropEvent* event) { - const KFileItem destItem(KFileItem::Unknown, KFileItem::Unknown, destination); - DragAndDropHelper::dropUrls(destItem, event); + DragAndDropHelper::dropUrls(KFileItem(), destination, event); } void DolphinViewContainer::redirect(const KUrl& oldUrl, const KUrl& newUrl) diff --git a/src/panels/folders/folderspanel.cpp b/src/panels/folders/folderspanel.cpp index d9c8f71dcb..1a61f0141b 100644 --- a/src/panels/folders/folderspanel.cpp +++ b/src/panels/folders/folderspanel.cpp @@ -263,11 +263,7 @@ void FoldersPanel::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* eve KFileItemModel* model = fileItemModel(); KFileItem destItem = model->fileItem(index); if (destItem.isNull()) { - destItem = model->rootItem(); - if (destItem.isNull()) { - kWarning() << "No destination item available for drop operation."; - return; - } + return; } QDropEvent dropEvent(event->pos().toPoint(), @@ -276,7 +272,7 @@ void FoldersPanel::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* eve event->buttons(), event->modifiers()); - DragAndDropHelper::dropUrls(destItem, &dropEvent); + DragAndDropHelper::dropUrls(destItem, destItem.url(), &dropEvent); } } diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp index 6f522fad2e..902c436cf6 100644 --- a/src/panels/places/placespanel.cpp +++ b/src/panels/places/placespanel.cpp @@ -48,8 +48,7 @@ void PlacesPanel::mousePressEvent(QMouseEvent* event) void PlacesPanel::slotUrlsDropped(const KUrl& dest, QDropEvent* event, QWidget* parent) { Q_UNUSED(parent); - const KFileItem destItem(KFileItem::Unknown, KFileItem::Unknown, dest); - DragAndDropHelper::dropUrls(destItem, event); + DragAndDropHelper::dropUrls(KFileItem(), dest, event); } void PlacesPanel::emitExtendedUrlChangedSignal(const KUrl& url) diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 539fcaacce..1e300c5cf2 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -809,13 +809,13 @@ void DolphinView::slotItemUnhovered(int index) void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event) { + KUrl destUrl; KFileItem destItem = fileItemModel()->fileItem(index); if (destItem.isNull()) { destItem = fileItemModel()->rootItem(); - if (destItem.isNull()) { - kWarning() << "No destination item available for drop operation."; - return; - } + destUrl = url(); + } else { + destUrl = destItem.url(); } QDropEvent dropEvent(event->pos().toPoint(), @@ -824,7 +824,7 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even event->buttons(), event->modifiers()); - const QString error = DragAndDropHelper::dropUrls(destItem, &dropEvent); + const QString error = DragAndDropHelper::dropUrls(destItem, destUrl, &dropEvent); if (!error.isEmpty()) { emit errorMessage(error); } @@ -959,12 +959,7 @@ bool DolphinView::hasSelection() const KFileItem DolphinView::rootItem() const { - KFileItem item = m_dirLister->rootItem(); - if (item.isNull()) { - // The directory has not been loaded yet - item = KFileItem(KFileItem::Unknown, KFileItem::Unknown, url()); - } - return item; + return m_dirLister->rootItem(); } void DolphinView::observeCreatedItem(const KUrl& url) diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp index 91eb4267d8..83673ad723 100644 --- a/src/views/draganddrophelper.cpp +++ b/src/views/draganddrophelper.cpp @@ -28,13 +28,10 @@ #include #include -QString DragAndDropHelper::dropUrls(const KFileItem& destItem, QDropEvent* event) +QString DragAndDropHelper::dropUrls(const KFileItem& destItem, const KUrl& destUrl, QDropEvent* event) { - Q_ASSERT(!destItem.isNull()); - - const KUrl destination = destItem.url(); - if (!destItem.isWritable()) { - return i18nc("@info:status", "Access denied. Could not write to %1", destination.pathOrUrl()); + if (!destItem.isNull() && !destItem.isWritable()) { + return i18nc("@info:status", "Access denied. Could not write to %1", destUrl.pathOrUrl()); } const QMimeData* mimeData = event->mimeData(); @@ -42,17 +39,17 @@ QString DragAndDropHelper::dropUrls(const KFileItem& destItem, QDropEvent* event const QString remoteDBusClient = mimeData->data("application/x-kde-dndextract"); QDBusMessage message = QDBusMessage::createMethodCall(remoteDBusClient, "/DndExtract", "org.kde.DndExtract", "extractSelectedFilesTo"); - message.setArguments(QVariantList() << destination.pathOrUrl()); + message.setArguments(QVariantList() << destUrl.pathOrUrl()); QDBusConnection::sessionBus().call(message); } else { const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); foreach (const KUrl& url, urls) { - if (url == destination) { + if (url == destUrl) { return i18nc("@info:status", "A folder cannot be dropped into itself"); } } - KonqOperations::doDrop(destItem, destination, event, QApplication::activeWindow()); + KonqOperations::doDrop(destItem, destUrl, event, QApplication::activeWindow()); } return QString(); diff --git a/src/views/draganddrophelper.h b/src/views/draganddrophelper.h index 1998a85a0e..8838648a05 100644 --- a/src/views/draganddrophelper.h +++ b/src/views/draganddrophelper.h @@ -38,12 +38,19 @@ public: * destination. A context menu with the options * 'Move Here', 'Copy Here', 'Link Here' and * 'Cancel' is offered to the user. - * @param destItem Item of the destination. + * @param destItem Item of the destination. Can be 0 (KFileItem::isNull()) if + * no file-item is available for the destination. In this case + * destUrl is used as fallback. For performance reasons it is + * recommended to pass a file-item if available. + * @param destUrl URL of the item destination. Is used only if destItem::isNull() + * is true. * @param event Drop event. * @return Error message if dropping is not possible. If an empty string * is returned, the dropping has been successful. */ - static QString dropUrls(const KFileItem& destItem, QDropEvent* event); + static QString dropUrls(const KFileItem& destItem, + const KUrl& destUrl, + QDropEvent* event); }; #endif