]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Drag and drop: Adjust destination if the item is no directory or desktop-file
authorPeter Penz <peter.penz19@gmail.com>
Wed, 8 Feb 2012 14:16:35 +0000 (15:16 +0100)
committerPeter Penz <peter.penz19@gmail.com>
Wed, 8 Feb 2012 16:48:28 +0000 (17:48 +0100)
The URL of the view should be used as destination target if a dropping is not
done above a directory or desktop-file.

BUG: 293511
FIXED-IN: 4.8.1

src/kitemviews/kfileitemmodel.cpp
src/panels/folders/folderspanel.cpp
src/views/dolphinview.cpp
src/views/draganddrophelper.cpp
src/views/draganddrophelper.h

index 6cb7577f27d404352aa70f7ba2df53d85c1ea4b5..e0ae033026f94b8d42f9362dc004fce904bbae19 100644 (file)
@@ -257,7 +257,7 @@ int KFileItemModel::indexForKeyboardSearch(const QString& text, int startFromInd
 bool KFileItemModel::supportsDropping(int index) const
 {
     const KFileItem item = fileItem(index);
-    return item.isNull() ? false : item.isDir();
+    return item.isNull() ? false : item.isDir() || item.isDesktopFile();
 }
 
 QString KFileItemModel::roleDescription(const QByteArray& role) const
index 3b24f5868b180004c6830509ed325028de9d3fb5..1a5e9c62d4dbedd06d480e305dab7107fe873319 100644 (file)
@@ -255,8 +255,7 @@ void FoldersPanel::slotViewContextMenuRequested(const QPointF& pos)
 void FoldersPanel::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event)
 {
     if (index >= 0) {
-        KFileItemModel* model = fileItemModel();
-        KFileItem destItem = model->fileItem(index);
+        KFileItem destItem = fileItemModel()->fileItem(index);
         if (destItem.isNull()) {
             return;
         }
index 16163c8e91301aadfcf34a336820938944b2d5b1..80be1e592c63991c95a30d6520bc92b1f1375720 100644 (file)
@@ -830,10 +830,13 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even
 {
     KUrl destUrl;
     KFileItem destItem = fileItemModel()->fileItem(index);
-    if (destItem.isNull()) {
+    if (destItem.isNull() || (!destItem.isDir() && !destItem.isDesktopFile())) {
+        // Use the URL of the view as drop target if the item is no directory
+        // or desktop-file
         destItem = fileItemModel()->rootItem();
         destUrl = url();
     } else {
+        // The item represents a directory or desktop-file
         destUrl = destItem.url();
     }
 
index 83673ad723e94e96bac43838a8004ddd6596e2f0..2cd1e86e04d409566623181075f749d97658a4cd 100644 (file)
@@ -41,15 +41,18 @@ QString DragAndDropHelper::dropUrls(const KFileItem& destItem, const KUrl& destU
                                                               "org.kde.DndExtract", "extractSelectedFilesTo");
         message.setArguments(QVariantList() << destUrl.pathOrUrl());
         QDBusConnection::sessionBus().call(message);
-    } else {
+    } else if (!destItem.isNull() && (destItem.isDir() || destItem.isDesktopFile())) {
+        // Drop into a directory or a desktop-file
         const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
         foreach (const KUrl& url, urls) {
             if (url == destUrl) {
                 return i18nc("@info:status", "A folder cannot be dropped into itself");
             }
         }
-
+        
         KonqOperations::doDrop(destItem, destUrl, event, QApplication::activeWindow());
+    } else {
+        KonqOperations::doDrop(KFileItem(), destUrl, event, QApplication::activeWindow());
     }
 
     return QString();
index 8838648a05a9d2fdd27276c238e9a5fea99f5fd4..ac16f7cf2718ba9044f1f219b420293dea479387 100644 (file)
@@ -34,10 +34,11 @@ class LIBDOLPHINPRIVATE_EXPORT DragAndDropHelper
 {
 public:
     /**
-     * Handles the dropping of URLs to the given
-     * destination. A context menu with the options
-     * 'Move Here', 'Copy Here', 'Link Here' and
-     * 'Cancel' is offered to the user.
+     * Handles the dropping of URLs to the given destination. A context menu
+     * with the options 'Move Here', 'Copy Here', 'Link Here' and 'Cancel' is
+     * offered to the user. The drag destination must represent a directory or
+     * a desktop-file, otherwise the dropping gets ignored.
+     *
      * @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
@@ -45,8 +46,9 @@ public:
      * @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.
+     * @return          Error message intended to be shown for users if dropping is not
+     *                  possible. If an empty string is returned, the dropping has been
+     *                  successful.
      */
     static QString dropUrls(const KFileItem& destItem,
                             const KUrl& destUrl,