+ const QModelIndexList selectedIndexes = itemView->selectionModel()->selectedIndexes();
+ Q_ASSERT(!selectedIndexes.isEmpty());
+
+ QAbstractProxyModel* proxyModel = static_cast<QAbstractProxyModel*>(itemView->model());
+ KDirModel* dirModel = static_cast<KDirModel*>(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;