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
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;
}
{
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();
}
"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();
{
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
* @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,