From: Peter Penz Date: Wed, 11 Jun 2008 17:50:59 +0000 (+0000) Subject: Improve the performance of the code part which checks which items are visible. Althou... X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/629ec98952bcf38bc99f2b11bc37bdc2ec7aabcc?ds=sidebyside Improve the performance of the code part which checks which items are visible. Although the code is less readable now, it requires only 0,5 seconds for 2500 items instead of 2 seconds. svn path=/trunk/KDE/kdebase/apps/; revision=819663 --- diff --git a/src/iconmanager.cpp b/src/iconmanager.cpp index 8bcc8e58b..002f4e86d 100644 --- a/src/iconmanager.cpp +++ b/src/iconmanager.cpp @@ -138,6 +138,14 @@ void IconManager::updatePreviews() updateCutItems(); } +void IconManager::cancelPreviews() +{ + killPreviewJobs(); + m_cutItemsCache.clear(); + m_pendingItems.clear(); + m_dispatchedItems.clear(); +} + void IconManager::generatePreviews(const KFileItemList& items) { applyCutItemEffect(); @@ -148,18 +156,25 @@ void IconManager::generatePreviews(const KFileItemList& items) // Order the items in a way that the preview for the visible items // is generated first, as this improves the feeled performance a lot. + // Implementation note: using KDirModel::itemForUrl() would lead to a more + // readable code, but it is a lot slower in comparison to itemListContains(). const QRect visibleArea = m_view->viewport()->rect(); KFileItemList orderedItems; - foreach (const KFileItem& item, items) { - const QModelIndex dirIndex = m_dolphinModel->indexForItem(item); - const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex); + const int rowCount = m_proxyModel->rowCount(); + for (int row = 0; row < rowCount; ++row) { + const QModelIndex proxyIndex = m_proxyModel->index(row, 0); const QRect itemRect = m_view->visualRect(proxyIndex); - if (itemRect.intersects(visibleArea)) { - orderedItems.insert(0, item); - m_pendingItems.insert(0, item.url()); - } else { - orderedItems.append(item); - m_pendingItems.append(item.url()); + const QModelIndex dirIndex = m_proxyModel->mapToSource(proxyIndex); + KFileItem item = m_dolphinModel->itemForIndex(dirIndex); + const KUrl url = item.url(); + if (itemListContains(items, url)) { + if (itemRect.intersects(visibleArea)) { + orderedItems.insert(0, item); + m_pendingItems.insert(0, url); + } else { + orderedItems.append(item); + m_pendingItems.append(url); + } } } @@ -269,17 +284,25 @@ void IconManager::resumePreviews() // Create a new preview job for the remaining items. // Order the items in a way that the preview for the visible items // is generated first, as this improves the feeled performance a lot. + // Implementation note: using KDirModel::itemForUrl() would lead to a more + // readable code, but it is a lot slower in comparison + // to m_pendingItems.contains(). const QRect visibleArea = m_view->viewport()->rect(); KFileItemList orderedItems; - foreach (const KUrl& url, m_pendingItems) { - const QModelIndex dirIndex = m_dolphinModel->indexForUrl(url); - const KFileItem item = m_dolphinModel->itemForIndex(dirIndex); - const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex); + + const int rowCount = m_proxyModel->rowCount(); + for (int row = 0; row < rowCount; ++row) { + const QModelIndex proxyIndex = m_proxyModel->index(row, 0); const QRect itemRect = m_view->visualRect(proxyIndex); - if (itemRect.intersects(visibleArea)) { - orderedItems.insert(0, item); - } else { - orderedItems.append(item); + const QModelIndex dirIndex = m_proxyModel->mapToSource(proxyIndex); + KFileItem item = m_dolphinModel->itemForIndex(dirIndex); + const KUrl url = item.url(); + if (m_pendingItems.contains(url)) { + if (itemRect.intersects(visibleArea)) { + orderedItems.insert(0, item); + } else { + orderedItems.append(item); + } } } @@ -497,4 +520,14 @@ void IconManager::killPreviewJobs() m_previewJobs.clear(); } +bool IconManager::itemListContains(const KFileItemList& items, const KUrl& url) const +{ + foreach (const KFileItem& item, items) { + if (url == item.url()) { + return true; + } + } + return false; +} + #include "iconmanager.moc" diff --git a/src/iconmanager.h b/src/iconmanager.h index 85538f87d..b5a822175 100644 --- a/src/iconmanager.h +++ b/src/iconmanager.h @@ -60,10 +60,18 @@ public: bool showPreview() const; /** - * Updates the previews for all already available items. + * Updates the previews for all already available items. It is only necessary + * to invoke this method when the icon size of the abstract item view has + * been changed. */ void updatePreviews(); + /** + * Cancels all pending previews. Should be invoked when the URL of the item + * view has been changed. + */ + void cancelPreviews(); + private slots: /** * Generates previews for the items \a items asynchronously. @@ -144,6 +152,12 @@ private: /** Kills all ongoing preview jobs. */ void killPreviewJobs(); + /** + * Returns true, if the item list \a items contains an item with the + * URL \a url. This is a helper method for IconManager::generatePreviews(). + */ + bool itemListContains(const KFileItemList& items, const KUrl& url) const; + private: /** Remembers the pixmap for an item specified by an URL. */ struct ItemInfo