X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/0bca984ad14487072631425304e1e2dcb22f681b..49eb864b03b6370e403c6f048ab18d1478eab045:/src/draganddrophelper.cpp diff --git a/src/draganddrophelper.cpp b/src/draganddrophelper.cpp index fa4c98566..88dca9b40 100644 --- a/src/draganddrophelper.cpp +++ b/src/draganddrophelper.cpp @@ -20,19 +20,19 @@ #include "draganddrophelper.h" #include "dolphiniconsview.h" -#include "dolphincontroller.h" +#include "dolphinviewcontroller.h" #include #include #include #include -#include #include #include #include #include #include +#include class DragAndDropHelperSingleton { @@ -53,7 +53,7 @@ bool DragAndDropHelper::isMimeDataSupported(const QMimeData* mimeData) const void DragAndDropHelper::startDrag(QAbstractItemView* itemView, Qt::DropActions supportedActions, - DolphinController* controller) + DolphinViewController* dolphinViewController) { // Do not start a new drag until the previous one has been finished. // This is a (possibly temporary) fix for bug #187884. @@ -63,30 +63,19 @@ void DragAndDropHelper::startDrag(QAbstractItemView* itemView, } isDragging = true; - QModelIndexList indexes = itemView->selectionModel()->selectedIndexes(); - if (indexes.count() > 0) { + 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; @@ -96,7 +85,7 @@ void DragAndDropHelper::startDrag(QAbstractItemView* itemView, isDragging = false; } -bool DragAndDropHelper::isDragSource(QAbstractItemView* itemView) +bool DragAndDropHelper::isDragSource(QAbstractItemView* itemView) const { return (m_dragSource != 0) && (m_dragSource == itemView); } @@ -136,4 +125,64 @@ DragAndDropHelper::DragAndDropHelper() { } +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"