X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/44d2f43a4047a0dbb3396dff53de2e36df3049f7..4ba9eb8ea34baee7e5e100a0d3c33f23f75cf708:/src/draganddrophelper.cpp diff --git a/src/draganddrophelper.cpp b/src/draganddrophelper.cpp index 30804c2c1..136b770a7 100644 --- a/src/draganddrophelper.cpp +++ b/src/draganddrophelper.cpp @@ -20,7 +20,7 @@ #include "draganddrophelper.h" #include "dolphiniconsview.h" -#include "dolphincontroller.h" +#include "dolphinviewcontroller.h" #include #include @@ -33,6 +33,7 @@ #include #include #include +#include class DragAndDropHelperSingleton { @@ -53,35 +54,41 @@ bool DragAndDropHelper::isMimeDataSupported(const QMimeData* mimeData) const void DragAndDropHelper::startDrag(QAbstractItemView* itemView, Qt::DropActions supportedActions, - DolphinController* controller) + DolphinViewController* dolphinViewController) { - QModelIndexList indexes = itemView->selectionModel()->selectedIndexes(); - if (indexes.count() > 0) { + // Do not start a new drag until the previous one has been finished. + // This is a (possibly temporary) fix for bug #187884. + static bool isDragging = false; + if (isDragging) { + return; + } + isDragging = true; + + const QModelIndexList indexes = itemView->selectionModel()->selectedIndexes(); + if (!indexes.isEmpty()) { QMimeData *data = itemView->model()->mimeData(indexes); if (data == 0) { return; } - if (controller != 0) { - controller->emitHideToolTip(); + if (dolphinViewController != 0) { + dolphinViewController->requestToolTipHiding(); } QDrag* drag = new QDrag(itemView); - QPixmap pixmap; - if (indexes.count() == 1) { - QAbstractProxyModel* proxyModel = static_cast(itemView->model()); - KDirModel* dirModel = static_cast(proxyModel->sourceModel()); - const QModelIndex index = proxyModel->mapToSource(indexes.first()); - - const KFileItem item = dirModel->itemForIndex(index); - pixmap = item.pixmap(KIconLoader::SizeMedium, KIconLoader::SizeMedium); - } else { - pixmap = KIcon("document-multiple").pixmap(KIconLoader::SizeMedium, KIconLoader::SizeMedium); - } - drag->setPixmap(pixmap); + drag->setPixmap(createDragPixmap(itemView)); drag->setMimeData(data); + + m_dragSource = itemView; drag->exec(supportedActions, Qt::IgnoreAction); + m_dragSource = 0; } + isDragging = false; +} + +bool DragAndDropHelper::isDragSource(QAbstractItemView* itemView) const +{ + return (m_dragSource != 0) && (m_dragSource == itemView); } void DragAndDropHelper::dropUrls(const KFileItem& destItem, @@ -96,7 +103,7 @@ void DragAndDropHelper::dropUrls(const KFileItem& destItem, if (mimeData->hasFormat("application/x-kde-dndextract")) { QString remoteDBusClient = mimeData->data("application/x-kde-dndextract"); QDBusMessage message = QDBusMessage::createMethodCall(remoteDBusClient, "/DndExtract", - "org.kde.DndExtract", "extractFilesTo"); + "org.kde.DndExtract", "extractSelectedFilesTo"); message.setArguments(QVariantList() << destination.path()); QDBusConnection::sessionBus().call(message); } else { @@ -115,7 +122,68 @@ void DragAndDropHelper::dropUrls(const KFileItem& destItem, } DragAndDropHelper::DragAndDropHelper() + : m_dragSource(0) { } +QPixmap DragAndDropHelper::createDragPixmap(QAbstractItemView* itemView) const +{ + const QModelIndexList selectedIndexes = itemView->selectionModel()->selectedIndexes(); + Q_ASSERT(!selectedIndexes.isEmpty()); + + QAbstractProxyModel* proxyModel = static_cast(itemView->model()); + KDirModel* dirModel = static_cast(proxyModel->sourceModel()); + + const int itemCount = selectedIndexes.count(); + + // If more than one item is dragged, align the items inside a + // rectangular grid. The maximum grid size is limited to 5 x 5 items. + int xCount = 3; + int size = KIconLoader::SizeMedium; + if (itemCount > 16) { + xCount = 5; + size = KIconLoader::SizeSmall; + } else if (itemCount > 9) { + xCount = 4; + size = KIconLoader::SizeSmallMedium; + } + + if (itemCount < xCount) { + xCount = itemCount; + } + + int yCount = itemCount / xCount; + if (itemCount % xCount != 0) { + ++yCount; + } + if (yCount > xCount) { + yCount = xCount; + } + + // Draw the selected items into the grid cells + QPixmap dragPixmap(xCount * size + xCount - 1, yCount * size + yCount - 1); + dragPixmap.fill(Qt::transparent); + + QPainter painter(&dragPixmap); + int x = 0; + int y = 0; + foreach (const QModelIndex& selectedIndex, selectedIndexes) { + const QModelIndex index = proxyModel->mapToSource(selectedIndex); + const KFileItem item = dirModel->itemForIndex(index); + const QPixmap pixmap = item.pixmap(size, size); + painter.drawPixmap(x, y, pixmap); + + x += size + 1; + if (x >= dragPixmap.width()) { + x = 0; + y += size + 1; + } + if (y >= dragPixmap.height()) { + break; + } + } + + return dragPixmap; +} + #include "draganddrophelper.moc"