]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix expansion levels for search results
authorPeter Penz <peter.penz19@gmail.com>
Wed, 14 Dec 2011 22:43:46 +0000 (23:43 +0100)
committerPeter Penz <peter.penz19@gmail.com>
Wed, 14 Dec 2011 22:46:12 +0000 (23:46 +0100)
Force an expansion level of 0 for search results to prevent
showing tabbed child items without parent items.

src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h

index 46f00361e358bcd4b2f552c63c0b685edb934557..ed45e69754d8572aa07b2d5bfc489192f8070587 100644 (file)
@@ -49,7 +49,7 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) :
     m_pendingItemsToInsert(),
     m_pendingEmitLoadingCompleted(false),
     m_groups(),
-    m_rootExpansionLevel(-1),
+    m_rootExpansionLevel(UninitializedRootExpansionLevel),
     m_expandedUrls(),
     m_urlsToExpand()
 {
@@ -807,7 +807,7 @@ void KFileItemModel::slotClear()
     m_resortAllItemsTimer->stop();
     m_pendingItemsToInsert.clear();
 
-    m_rootExpansionLevel = -1;
+    m_rootExpansionLevel = UninitializedRootExpansionLevel;
 
     const int removedCount = m_itemData.count();
     if (removedCount > 0) {
@@ -990,7 +990,7 @@ void KFileItemModel::removeItems(const KFileItemList& items)
     }
 
     if (count() <= 0) {
-        m_rootExpansionLevel = -1;
+        m_rootExpansionLevel = UninitializedRootExpansionLevel;
     }
 
     itemRanges << KItemRange(removedAtIndex, removedCount);
@@ -1044,7 +1044,7 @@ void KFileItemModel::removeExpandedItems()
     Q_ASSERT(m_rootExpansionLevel >= 0);
     removeItems(expandedItems);
 
-    m_rootExpansionLevel = -1;
+    m_rootExpansionLevel = UninitializedRootExpansionLevel;
     m_expandedUrls.clear();
 }
 
@@ -1141,17 +1141,29 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem& item)
     }
 
     if (m_requestRole[ExpansionLevelRole]) {
-        if (m_rootExpansionLevel < 0 && m_dirLister.data()) {
-            const QString rootDir = m_dirLister.data()->url().directory(KUrl::AppendTrailingSlash);
-            m_rootExpansionLevel = rootDir.count('/');
-            if (m_rootExpansionLevel == 1) {
-                // Special case: The root is already reached and no parent is available
-                --m_rootExpansionLevel;
+        if (m_rootExpansionLevel == UninitializedRootExpansionLevel && m_dirLister.data()) {
+            const KUrl rootUrl = m_dirLister.data()->url();
+            const QString protocol = rootUrl.protocol();
+            const bool isSearchUrl = (protocol.contains("search") || protocol == QLatin1String("nepomuk"));
+            if (isSearchUrl) {
+                m_rootExpansionLevel = ForceRootExpansionLevel;
+            } else {
+                const QString rootDir = rootUrl.directory(KUrl::AppendTrailingSlash);
+                m_rootExpansionLevel = rootDir.count('/');
+                if (m_rootExpansionLevel == 1) {
+                    // Special case: The root is already reached and no parent is available
+                    --m_rootExpansionLevel;
+                }
             }
         }
-        const QString dir = item.url().directory(KUrl::AppendTrailingSlash);
-        const int level = dir.count('/') - m_rootExpansionLevel - 1;
-        data.insert("expansionLevel", level);
+
+        if (m_rootExpansionLevel == ForceRootExpansionLevel) {
+            data.insert("expansionLevel", 0);
+        } else {
+            const QString dir = item.url().directory(KUrl::AppendTrailingSlash);
+            const int level = dir.count('/') - m_rootExpansionLevel - 1;
+            data.insert("expansionLevel", level);
+        }
     }
 
     if (item.isMimeTypeKnown()) {
index bc692e7c9ce2c52c236659e7a963a06dacd451c1..0a68afcfcff144cc5b482e3400f75394f3827af0 100644 (file)
@@ -334,8 +334,18 @@ private:
     mutable QList<QPair<int, QVariant> > m_groups;
 
     // Stores the smallest expansion level of the root-URL. Is required to calculate
-    // the "expansionLevel" role in an efficient way. A value < 0 indicates that
-    // it has not been initialized yet.
+    // the "expansionLevel" role in an efficient way. A value < 0 indicates a
+    // special meaning:
+    enum RootExpansionLevelTypes
+    {
+        // m_rootExpansionLevel is uninitialized and must be determined by checking
+        // the root URL from the KDirLister.
+        UninitializedRootExpansionLevel = -1,
+        // All items should be forced to get an expansion level of 0 even if they
+        // represent child items. This is useful for slaves that provide no parent items
+        // for child items like e.g. the search IO slaves.
+        ForceRootExpansionLevel = -2
+    };
     mutable int m_rootExpansionLevel;
 
     // Stores the URLs of the expanded folders.