]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodel.cpp
Reimplement name-filtering
[dolphin.git] / src / kitemviews / kfileitemmodel.cpp
index d1e0fc6f14ece89ad2ab5e9a04db3fa82a6fd318..bd83bf62137c0988d256ea735e8ade0f020f5e5e 100644 (file)
@@ -40,6 +40,8 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) :
     m_caseSensitivity(Qt::CaseInsensitive),
     m_itemData(),
     m_items(),
+    m_nameFilter(),
+    m_filteredItems(),
     m_requestRole(),
     m_minimumUpdateIntervalTimer(0),
     m_maximumUpdateIntervalTimer(0),
@@ -475,6 +477,57 @@ void KFileItemModel::setExpanded(const QSet<KUrl>& urls)
     }
 }
 
+void KFileItemModel::setNameFilter(const QString& nameFilter)
+{
+    if (m_nameFilter != nameFilter) {
+        // TODO #1: Assure that expanded items only can get hidden
+        // if no child item is visible
+
+        // TODO #2: If the user entered a '*' use a regular expression
+
+        m_nameFilter = nameFilter;
+
+        const QString filter = nameFilter.toLower();
+
+        // Check which shown items from m_itemData must get
+        // hidden and hence moved to m_filteredItems.
+        KFileItemList newFilteredItems;
+
+        foreach (ItemData* itemData, m_itemData) {
+            if (!matchesNameFilter(itemData->item, filter)) {
+                m_filteredItems.append(itemData->item);
+                newFilteredItems.append(itemData->item);
+            }
+        }
+
+        if (!newFilteredItems.isEmpty()) {
+            slotItemsDeleted(newFilteredItems);
+        }
+
+        // Check which hidden items from m_filteredItems should
+        // get visible again and hence removed from m_filteredItems.
+        KFileItemList newVisibleItems;
+
+        for (int i = m_filteredItems.count() - 1; i >= 0; --i) {
+            const KFileItem item = m_filteredItems.at(i);
+            if (matchesNameFilter(item, filter)) {
+                newVisibleItems.append(item);
+                m_filteredItems.removeAt(i);
+            }
+        }
+
+        if (!newVisibleItems.isEmpty()) {
+            slotNewItems(newVisibleItems);
+            dispatchPendingItemsToInsert();
+        }
+    }
+}
+
+QString KFileItemModel::nameFilter() const
+{
+    return m_nameFilter;
+}
+
 void KFileItemModel::onGroupedSortingChanged(bool current)
 {
     Q_UNUSED(current);
@@ -1654,4 +1707,10 @@ QList<QPair<int, QVariant> > KFileItemModel::genericStringRoleGroups(const QByte
     return groups;
 }
 
+bool KFileItemModel::matchesNameFilter(const KFileItem& item, const QString& nameFilter)
+{
+    const QString itemText = item.text().toLower();
+    return itemText.contains(nameFilter);
+}
+
 #include "kfileitemmodel.moc"