X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/4cf8450bc4df6bbd8a307a087de54f3986ee4a33..ad0a321b7dfd57d7d666ac87ef44813f8e16129e:/src/iconmanager.cpp diff --git a/src/iconmanager.cpp b/src/iconmanager.cpp index cde3ab59e..6cf6f001c 100644 --- a/src/iconmanager.cpp +++ b/src/iconmanager.cpp @@ -19,12 +19,11 @@ #include "iconmanager.h" -#include "dolphinmodel.h" -#include "dolphinsortfilterproxymodel.h" - #include #include #include +#include +#include #include #include @@ -81,7 +80,7 @@ private: QListView* m_view; }; -IconManager::IconManager(QAbstractItemView* parent, DolphinSortFilterProxyModel* model) : +IconManager::IconManager(QAbstractItemView* parent, KDirSortFilterProxyModel* model) : QObject(parent), m_showPreview(false), m_clearItemQueues(true), @@ -91,7 +90,7 @@ IconManager::IconManager(QAbstractItemView* parent, DolphinSortFilterProxyModel* m_previewTimer(0), m_scrollAreaTimer(0), m_previewJobs(), - m_dolphinModel(0), + m_dirModel(0), m_proxyModel(model), m_mimeTypeResolver(0), m_cutItemsCache(), @@ -101,8 +100,8 @@ IconManager::IconManager(QAbstractItemView* parent, DolphinSortFilterProxyModel* { Q_ASSERT(m_view->iconSize().isValid()); // each view must provide its current icon size - m_dolphinModel = static_cast(m_proxyModel->sourceModel()); - connect(m_dolphinModel->dirLister(), SIGNAL(newItems(const KFileItemList&)), + m_dirModel = static_cast(m_proxyModel->sourceModel()); + connect(m_dirModel->dirLister(), SIGNAL(newItems(const KFileItemList&)), this, SLOT(generatePreviews(const KFileItemList&))); QClipboard* clipboard = QApplication::clipboard(); @@ -157,7 +156,7 @@ void IconManager::setShowPreview(bool show) } else if (!show && (m_mimeTypeResolver == 0)) { // the preview is turned off: resolve the MIME-types so that // the icons gets updated - m_mimeTypeResolver = new KMimeTypeResolver(m_view, m_dolphinModel); + m_mimeTypeResolver = new KMimeTypeResolver(m_view, m_dirModel); } } @@ -173,10 +172,10 @@ void IconManager::updatePreviews() m_dispatchedItems.clear(); KFileItemList itemList; - const int rowCount = m_dolphinModel->rowCount(); + const int rowCount = m_dirModel->rowCount(); for (int row = 0; row < rowCount; ++row) { - const QModelIndex index = m_dolphinModel->index(row, 0); - KFileItem item = m_dolphinModel->itemForIndex(index); + const QModelIndex index = m_dirModel->index(row, 0); + KFileItem item = m_dirModel->itemForIndex(index); itemList.append(item); } @@ -220,7 +219,7 @@ void IconManager::addToPreviewQueue(const KFileItem& item, const QPixmap& pixmap // check whether the item is part of the directory lister (it is possible // that a preview from an old directory lister is received) - KDirLister* dirLister = m_dolphinModel->dirLister(); + KDirLister* dirLister = m_dirModel->dirLister(); bool isOldPreview = true; const KUrl::List dirs = dirLister->directories(); const QString itemDir = url.directory(); @@ -289,9 +288,9 @@ void IconManager::updateCutItems() // restore the icons of all previously selected items to the // original state... foreach (const ItemInfo& cutItem, m_cutItemsCache) { - const QModelIndex index = m_dolphinModel->indexForUrl(cutItem.url); + const QModelIndex index = m_dirModel->indexForUrl(cutItem.url); if (index.isValid()) { - m_dolphinModel->setData(index, QIcon(cutItem.pixmap), Qt::DecorationRole); + m_dirModel->setData(index, QIcon(cutItem.pixmap), Qt::DecorationRole); } } m_cutItemsCache.clear(); @@ -312,9 +311,9 @@ void IconManager::dispatchPreviewQueue() for (int i = 0; i < previewsCount; ++i) { const ItemInfo& preview = m_previews.first(); - const QModelIndex idx = m_dolphinModel->indexForUrl(preview.url); + const QModelIndex idx = m_dirModel->indexForUrl(preview.url); if (idx.isValid() && (idx.column() == 0)) { - m_dolphinModel->setData(idx, QIcon(preview.pixmap), Qt::DecorationRole); + m_dirModel->setData(idx, QIcon(preview.pixmap), Qt::DecorationRole); } m_previews.pop_front(); @@ -361,6 +360,9 @@ void IconManager::resumePreviews() } m_dispatchedItems.clear(); + m_pendingVisiblePreviews = 0; + dispatchPreviewQueue(); + KFileItemList orderedItems = m_pendingItems; orderItems(orderedItems); @@ -399,7 +401,7 @@ void IconManager::applyCutItemEffect() } KFileItemList items; - KDirLister* dirLister = m_dolphinModel->dirLister(); + KDirLister* dirLister = m_dirModel->dirLister(); const KUrl::List dirs = dirLister->directories(); foreach (const KUrl& url, dirs) { items << dirLister->itemsForDir(url); @@ -407,8 +409,8 @@ void IconManager::applyCutItemEffect() foreach (const KFileItem& item, items) { if (isCutItem(item)) { - const QModelIndex index = m_dolphinModel->indexForItem(item); - const QVariant value = m_dolphinModel->data(index, Qt::DecorationRole); + const QModelIndex index = m_dirModel->indexForItem(item); + const QVariant value = m_dirModel->data(index, Qt::DecorationRole); if (value.type() == QVariant::Icon) { const QIcon icon(qvariant_cast(value)); const QSize actualSize = icon.actualSize(m_view->iconSize()); @@ -424,7 +426,7 @@ void IconManager::applyCutItemEffect() // apply icon effect to the cut item KIconEffect iconEffect; pixmap = iconEffect.apply(pixmap, KIconLoader::Desktop, KIconLoader::DisabledState); - m_dolphinModel->setData(index, QIcon(pixmap), Qt::DecorationRole); + m_dirModel->setData(index, QIcon(pixmap), Qt::DecorationRole); } } } @@ -489,7 +491,7 @@ bool IconManager::applyImageFrame(QPixmap& icon) void IconManager::limitToSize(QPixmap& icon, const QSize& maxSize) { if ((icon.width() > maxSize.width()) || (icon.height() > maxSize.height())) { - icon = icon.scaled(maxSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + icon = icon.scaled(maxSize, Qt::KeepAspectRatio, Qt::FastTransformation); } } @@ -503,7 +505,14 @@ void IconManager::startPreviewJob(const KFileItemList& items) m_hasCutSelection = KonqMimeData::decodeIsCutSelection(mimeData); const QSize size = m_view->iconSize(); - KIO::PreviewJob* job = KIO::filePreview(items, 128, 128); + + // PreviewJob internally caches items always with the size of + // 128 x 128 pixels or 256 x 256 pixels. A downscaling is done + // by PreviewJob if a smaller size is requested. As the IconManager must + // do a downscaling anyhow because of the frame, only the provided + // cache sizes are requested. + const int cacheSize = (size.width() > 128) || (size.height() > 128) ? 256 : 128; + KIO::PreviewJob* job = KIO::filePreview(items, cacheSize, cacheSize); connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), this, SLOT(addToPreviewQueue(const KFileItem&, const QPixmap&))); connect(job, SIGNAL(finished(KJob*)), @@ -538,6 +547,7 @@ void IconManager::orderItems(KFileItemList& items) const int rowCount = m_proxyModel->rowCount(); const QRect visibleArea = m_view->viewport()->rect(); + int insertPos = 0; if (itemCount * 10 > rowCount) { // Algorithm 1: The number of items is > 10 % of the row count. Parse all rows // and check whether the received row is part of the item list. @@ -546,7 +556,7 @@ void IconManager::orderItems(KFileItemList& items) const QRect itemRect = m_view->visualRect(proxyIndex); const QModelIndex dirIndex = m_proxyModel->mapToSource(proxyIndex); - KFileItem item = m_dolphinModel->itemForIndex(dirIndex); // O(1) + KFileItem item = m_dirModel->itemForIndex(dirIndex); // O(1) const KUrl url = item.url(); // check whether the item is part of the item list 'items' @@ -563,7 +573,8 @@ void IconManager::orderItems(KFileItemList& items) // to the front of the list, so that the preview is // generated earlier. items.removeAt(index); - items.insert(0, item); + items.insert(insertPos, item); + ++insertPos; ++m_pendingVisiblePreviews; } } @@ -571,7 +582,7 @@ void IconManager::orderItems(KFileItemList& items) // Algorithm 2: The number of items is <= 10 % of the row count. In this case iterate // all items and receive the corresponding row from the item. for (int i = 0; i < itemCount; ++i) { - const QModelIndex dirIndex = m_dolphinModel->indexForItem(items[i]); // O(n) (n = number of rows) + const QModelIndex dirIndex = m_dirModel->indexForItem(items[i]); // O(n) (n = number of rows) const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex); const QRect itemRect = m_view->visualRect(proxyIndex); @@ -579,8 +590,9 @@ void IconManager::orderItems(KFileItemList& items) // The current item is (at least partly) visible. Move it // to the front of the list, so that the preview is // generated earlier. - items.insert(0, items[i]); + items.insert(insertPos, items[i]); items.removeAt(i + 1); + ++insertPos; ++m_pendingVisiblePreviews; } }