]> cloud.milkyroute.net Git - dolphin.git/commitdiff
prevent flickering when zooming in or zooming out
authorPeter Penz <peter.penz19@gmail.com>
Thu, 6 Mar 2008 01:45:21 +0000 (01:45 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Thu, 6 Mar 2008 01:45:21 +0000 (01:45 +0000)
svn path=/trunk/KDE/kdebase/apps/; revision=782795

src/dolphinview.cpp
src/iconmanager.cpp
src/iconmanager.h

index d6c5f6c256b3e8b3a83ea7587427f22e0a6b14d7..0cf740cd56978a97f7a69b8ea51ba38f8dd95ab3 100644 (file)
@@ -397,13 +397,13 @@ QPoint DolphinView::contentsPosition() const
 void DolphinView::zoomIn()
 {
     m_controller->triggerZoomIn();
-    reload();
+    m_iconManager->updatePreviews();
 }
 
 void DolphinView::zoomOut()
 {
     m_controller->triggerZoomOut();
-    reload();
+    m_iconManager->updatePreviews();
 }
 
 bool DolphinView::isZoomInPossible() const
index bb057b7d6552a7ddc67de1f9b06db7a437ade605..c0508774fc3dce616c4beac58e26e045dcb87a70 100644 (file)
@@ -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();
 }
 
 
@@ -73,44 +69,37 @@ void IconManager::setShowPreview(bool show)
     }
 }
 
-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;
+    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);
+    }
+
+    generatePreviews(itemList);
+}
+
+void IconManager::updateIcons(const KFileItemList& items)
+{
+    // make the icons of all hidden files semitransparent
     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);
+        if (item.isHidden()) {
+            applyHiddenItemEffect(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);
+    if (m_showPreview) {
+        generatePreviews(items);
+    }
 }
 
 void IconManager::replaceIcon(const KFileItem& item, const QPixmap& pixmap)
@@ -190,6 +179,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();
@@ -323,4 +341,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"
index c96759b13de9b22248d9717ea3e0016773ef6bbe..e35b139897dd947421f2cb0ee60d7633253d45f8 100644 (file)
@@ -48,6 +48,7 @@ public:
     virtual ~IconManager();
     void setShowPreview(bool show);
     bool showPreview() const;
+    void updatePreviews();
 
 private slots:
     /**
@@ -73,6 +74,8 @@ private slots:
     void updateCutItems();
 
 private:
+    void generatePreviews(const KFileItemList &items);
+
     /**
      * Returns true, if the item \a item has been cut into
      * the clipboard.
@@ -98,6 +101,9 @@ private:
      */
     void limitToSize(QPixmap& icon, const QSize& maxSize);
 
+    /** Kills all ongoing preview jobs. */
+    void killJobs();
+
 private:
     /**
      * Remembers the original pixmap for an item before