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