Drag and drop: Adjust destination if the item is no directory or desktop-file

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
This commit is contained in:
Peter Penz 2012-02-08 15:16:35 +01:00
parent a3a19f4a06
commit 3c83d8f14d
5 changed files with 19 additions and 12 deletions

View 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

View 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;
}

View 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();
}

View 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();

View 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,