X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/32564f92be07ff3f18a2357aaf08040d8fdfb040..bd925ea49a7e4e7c6e652f4529dcd0c4e25fd19a:/src/iconmanager.cpp diff --git a/src/iconmanager.cpp b/src/iconmanager.cpp index 4c5c802cd..ae2b80b99 100644 --- a/src/iconmanager.cpp +++ b/src/iconmanager.cpp @@ -56,11 +56,7 @@ IconManager::IconManager(QAbstractItemView* parent, DolphinSortFilterProxyModel* IconManager::~IconManager() { - foreach (KJob* job, m_previewJobs) { - Q_ASSERT(job != 0); - job->kill(); - } - m_previewJobs.clear(); + killJobs(); } @@ -70,47 +66,36 @@ void IconManager::setShowPreview(bool show) m_showPreview = show; m_cutItemsCache.clear(); updateCutItems(); + if (show) { + updatePreviews(); + } } } -void IconManager::updateIcons(const KFileItemList& items) +void IconManager::updatePreviews() { - // make the icons of all hidden files semitransparent - foreach (KFileItem item, items) { - if (item.isHidden()) { - applyHiddenItemEffect(item); - } - } - if (!m_showPreview) { return; } - // generate previews - const QRect visibleArea = m_view->viewport()->rect(); + killJobs(); + KFileItemList itemList; - // Order the items in a way that the preview for the visible items - // is generated first, as this improves the feeled performance a lot. - KFileItemList orderedItems; - foreach (KFileItem item, items) { - const QModelIndex dirIndex = m_dolphinModel->indexForItem(item); - const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex); - const QRect itemRect = m_view->visualRect(proxyIndex); - if (itemRect.intersects(visibleArea)) { - orderedItems.insert(0, item); - } else { - orderedItems.append(item); - } + const int rowCount = m_dolphinModel->rowCount(); + for (int row = 0; row < rowCount; ++row) { + const QModelIndex index = m_dolphinModel->index(row, 0); + KFileItem item = m_dolphinModel->itemForIndex(index); + itemList.append(item); } - const QSize size = m_view->iconSize(); - KIO::PreviewJob* job = KIO::filePreview(orderedItems, 128, 128); - connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), - this, SLOT(replaceIcon(const KFileItem&, const QPixmap&))); - connect(job, SIGNAL(finished(KJob*)), - this, SLOT(slotPreviewJobFinished(KJob*))); + generatePreviews(itemList); +} - m_previewJobs.append(job); +void IconManager::updateIcons(const KFileItemList& items) +{ + if (m_showPreview) { + generatePreviews(items); + } } void IconManager::replaceIcon(const KFileItem& item, const QPixmap& pixmap) @@ -147,16 +132,6 @@ void IconManager::replaceIcon(const KFileItem& item, const QPixmap& pixmap) limitToSize(icon, m_view->iconSize()); } - if (item.isHidden()) { - if (!icon.hasAlpha()) { - // the semitransparent operation requires having an alpha mask - QPixmap alphaMask(icon.size()); - alphaMask.fill(); - icon.setAlphaChannel(alphaMask); - } - KIconEffect::semiTransparent(icon); - } - const QMimeData* mimeData = QApplication::clipboard()->mimeData(); if (KonqMimeData::decodeIsCutSelection(mimeData) && isCutItem(item)) { KIconEffect iconEffect; @@ -190,6 +165,35 @@ void IconManager::updateCutItems() applyCutItemEffect(); } +void IconManager::generatePreviews(const KFileItemList &items) +{ + Q_ASSERT(m_showPreview); + const QRect visibleArea = m_view->viewport()->rect(); + + // Order the items in a way that the preview for the visible items + // is generated first, as this improves the feeled performance a lot. + KFileItemList orderedItems; + foreach (KFileItem item, items) { + const QModelIndex dirIndex = m_dolphinModel->indexForItem(item); + const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex); + const QRect itemRect = m_view->visualRect(proxyIndex); + if (itemRect.intersects(visibleArea)) { + orderedItems.insert(0, item); + } else { + orderedItems.append(item); + } + } + + const QSize size = m_view->iconSize(); + KIO::PreviewJob* job = KIO::filePreview(orderedItems, 128, 128); + connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), + this, SLOT(replaceIcon(const KFileItem&, const QPixmap&))); + connect(job, SIGNAL(finished(KJob*)), + this, SLOT(slotPreviewJobFinished(KJob*))); + + m_previewJobs.append(job); +} + bool IconManager::isCutItem(const KFileItem& item) const { const QMimeData* mimeData = QApplication::clipboard()->mimeData(); @@ -243,18 +247,6 @@ void IconManager::applyCutItemEffect() } } -void IconManager::applyHiddenItemEffect(const KFileItem& hiddenItem) -{ - const QModelIndex index = m_dolphinModel->indexForItem(hiddenItem); - const QVariant value = m_dolphinModel->data(index, Qt::DecorationRole); - if (value.type() == QVariant::Icon) { - const QIcon icon(qvariant_cast(value)); - QPixmap pixmap = icon.pixmap(m_view->iconSize()); - KIconEffect::semiTransparent(pixmap); - m_dolphinModel->setData(index, QIcon(pixmap), Qt::DecorationRole); - } -} - bool IconManager::applyImageFrame(QPixmap& icon) { const QSize maxSize = m_view->iconSize(); @@ -322,4 +314,13 @@ void IconManager::limitToSize(QPixmap& icon, const QSize& maxSize) } } +void IconManager::killJobs() +{ + foreach (KJob* job, m_previewJobs) { + Q_ASSERT(job != 0); + job->kill(); + } + m_previewJobs.clear(); +} + #include "iconmanager.moc"