]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Always determine icons for the visible items first
authorFrank Reininghaus <frank78ac@googlemail.com>
Mon, 22 Apr 2013 19:21:31 +0000 (21:21 +0200)
committerFrank Reininghaus <frank78ac@googlemail.com>
Mon, 22 Apr 2013 19:21:31 +0000 (21:21 +0200)
When entering a folder, KFileItemModelRolesUpdater has not yet been
informed about the visible index range by the view when it tries to
determine icons synchronously. This resulted in the problem that it
tried to determine icons for all items in random order, and some visible
icons were somtimes still unknown after the "synchronous icon loading"
timeout of 200 ms.

This commit tries to improve the situation by loading icons starting
with the first item in increasing order. This should make it less likely
that some visible items still have unknown icons after 200 ms.

BUG: 316129
FIXED-IN: 4.10.3
REVIEW: 109843

src/kitemviews/kfileitemlistview.cpp
src/kitemviews/kfileitemmodelrolesupdater.cpp
src/kitemviews/kfileitemmodelrolesupdater.h
src/kitemviews/kitemlistview.cpp
src/kitemviews/kitemlistview.h

index b7f7455b41517b6cb30769cbc01c50e89f2d1dbb..70ce11b1fbaad3ad9c749533945f423aef425f35 100644 (file)
@@ -323,6 +323,7 @@ void KFileItemListView::updateVisibleIndexRange()
 
     const int index = firstVisibleIndex();
     const int count = lastVisibleIndex() - index + 1;
+    m_modelRolesUpdater->setMaximumVisibleItems(maximumVisibleItems());
     m_modelRolesUpdater->setVisibleIndexRange(index, count);
 
     if (m_updateIconSizeTimer->isActive()) {
index 9fca8a1f685e26483f6433f79e5141ae4d8c4732..39d01e232045dde60776bd02aef27c9bdf218dcf 100644 (file)
@@ -79,6 +79,7 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO
     m_iconSize(),
     m_firstVisibleIndex(0),
     m_lastVisibleIndex(-1),
+    m_maximumVisibleItems(100),
     m_roles(),
     m_enabledPlugins(),
     m_pendingVisibleItems(),
@@ -178,6 +179,11 @@ void KFileItemModelRolesUpdater::setVisibleIndexRange(int index, int count)
     }
 }
 
+void KFileItemModelRolesUpdater::setMaximumVisibleItems(int count)
+{
+    m_maximumVisibleItems = count;
+}
+
 void KFileItemModelRolesUpdater::setPreviewsShown(bool show)
 {
     if (show == m_previewShown) {
@@ -670,7 +676,16 @@ void KFileItemModelRolesUpdater::startUpdating(const KItemRangeList& itemRanges)
         const int lastIndex = range.index + range.count - 1;
         for (int i = range.index; i <= lastIndex; ++i) {
             const KFileItem item = m_model->fileItem(i);
-            if (!hasValidIndexRange || (i >= m_firstVisibleIndex && i <= m_lastVisibleIndex)) {
+            bool visible;
+            if (hasValidIndexRange) {
+                visible = (i >= m_firstVisibleIndex && i <= m_lastVisibleIndex);
+            } else {
+                // If the view has not informed us about the visible range yet,
+                // just assume that the first items are visible.
+                visible = (i < m_maximumVisibleItems);
+            }
+
+            if (visible) {
                 m_pendingVisibleItems.insert(item);
             } else {
                 m_pendingInvisibleItems.insert(item);
index 68559d8dd7da7844e8f4a795981bd94dcb792d02..b837e8c7f6b2e24fad226ef7da34edf63973bc14 100644 (file)
@@ -77,6 +77,8 @@ public:
      */
     void setVisibleIndexRange(int index, int count);
 
+    void setMaximumVisibleItems(int count);
+
     /**
      * If \a show is set to true, the "iconPixmap" role will be filled with a preview
      * of the file. If \a show is false the MIME type icon will be used for the "iconPixmap"
@@ -254,6 +256,7 @@ private:
     QSize m_iconSize;
     int m_firstVisibleIndex;
     int m_lastVisibleIndex;
+    int m_maximumVisibleItems;
     QSet<QByteArray> m_roles;
     QSet<QByteArray> m_resolvableRoles;
     QStringList m_enabledPlugins;
index 9ebad7f8bda0a99a43256c6c529bed4027d689e8..763b7e68fa015c27aa160f906df1297f61316683 100644 (file)
@@ -208,6 +208,11 @@ qreal KItemListView::maximumItemOffset() const
     return m_layouter->maximumItemOffset();
 }
 
+int KItemListView::maximumVisibleItems() const
+{
+    return m_layouter->maximumVisibleItems();
+}
+
 void KItemListView::setVisibleRoles(const QList<QByteArray>& roles)
 {
     const QList<QByteArray> previousRoles = m_visibleRoles;
index cd59ddcb536265e22bdf8f3fda3aa5f5a8798525..6d609a9df5d5e15f363b1a82c4697f59716647bd 100644 (file)
@@ -92,6 +92,8 @@ public:
 
     qreal maximumItemOffset() const;
 
+    int maximumVisibleItems() const;
+
     void setVisibleRoles(const QList<QByteArray>& roles);
     QList<QByteArray> visibleRoles() const;