summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Penz <peter.penz19@gmail.com>2012-01-30 11:07:08 (GMT)
committerPeter Penz <peter.penz19@gmail.com>2012-01-30 11:09:21 (GMT)
commitfdc20584aef44e148b0186e8034ddf667bfe9a07 (patch)
treefc9c157ebf972178791a6f2a79cad1eabf5eb935
parentf5ecaee9c40c940fe8e1bf4a7d50fe0b18e1932b (diff)
Fix drag & drop issues with non-local URLs
BUG: 292821 BUG: 292355 FIXED-IN: 4.8.1
-rw-r--r--dolphin/src/dolphinmainwindow.cpp2
-rw-r--r--dolphin/src/dolphinviewcontainer.cpp3
-rw-r--r--dolphin/src/panels/folders/folderspanel.cpp8
-rw-r--r--dolphin/src/panels/places/placespanel.cpp3
-rw-r--r--dolphin/src/views/dolphinview.cpp17
-rw-r--r--dolphin/src/views/draganddrophelper.cpp15
-rw-r--r--dolphin/src/views/draganddrophelper.h11
7 files changed, 26 insertions, 33 deletions
diff --git a/dolphin/src/dolphinmainwindow.cpp b/dolphin/src/dolphinmainwindow.cpp
index 3654ed6..74b751f 100644
--- a/dolphin/src/dolphinmainwindow.cpp
+++ b/dolphin/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/dolphin/src/dolphinviewcontainer.cpp b/dolphin/src/dolphinviewcontainer.cpp
index 2ad5bea..72c943e 100644
--- a/dolphin/src/dolphinviewcontainer.cpp
+++ b/dolphin/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/dolphin/src/panels/folders/folderspanel.cpp b/dolphin/src/panels/folders/folderspanel.cpp
index d9c8f71..1a61f01 100644
--- a/dolphin/src/panels/folders/folderspanel.cpp
+++ b/dolphin/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/dolphin/src/panels/places/placespanel.cpp b/dolphin/src/panels/places/placespanel.cpp
index 6f522fa..902c436 100644
--- a/dolphin/src/panels/places/placespanel.cpp
+++ b/dolphin/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/dolphin/src/views/dolphinview.cpp b/dolphin/src/views/dolphinview.cpp
index 539fcaa..1e300c5 100644
--- a/dolphin/src/views/dolphinview.cpp
+++ b/dolphin/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/dolphin/src/views/draganddrophelper.cpp b/dolphin/src/views/draganddrophelper.cpp
index 91eb426..83673ad 100644
--- a/dolphin/src/views/draganddrophelper.cpp
+++ b/dolphin/src/views/draganddrophelper.cpp
@@ -28,13 +28,10 @@
#include <QtDBus>
#include <QDropEvent>
-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 <filename>%1</filename>", destination.pathOrUrl());
+ if (!destItem.isNull() && !destItem.isWritable()) {
+ return i18nc("@info:status", "Access denied. Could not write to <filename>%1</filename>", 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/dolphin/src/views/draganddrophelper.h b/dolphin/src/views/draganddrophelper.h
index 1998a85..8838648 100644
--- a/dolphin/src/views/draganddrophelper.h
+++ b/dolphin/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