diff options
| author | Peter Penz <[email protected]> | 2011-11-30 00:18:22 +0100 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2011-11-30 00:24:33 +0100 |
| commit | 7b8fbf737496e44e7676a437f000377d737dfd9c (patch) | |
| tree | 5b64891095993e59b268e04dc44db77ded1fd030 /src/kitemviews/kfileitemmodel.cpp | |
| parent | 3719ce7d2a7f4ee6a0585763139eea8f7786630c (diff) | |
Reimplement name-filtering
The filtering of items has not been implemented yet in
the KFileItemModel of the new view-engine. The patch brings back
this functionality again, but some minor issues are open:
- When filtering trees expanded directories should only get
hidden if no child is visible
- Regular expressions are not supported yet (they have not been
supported in Dolphin 1.x but it is now quite simple to implement).
- When filtering previews and removing the filter it might be
possible that the preview is not shown (is most probably an
an already existing bug in KFileItemModelRolesUpdater).
BUG: 287642
FIXED-IN: 4.8.0
Diffstat (limited to 'src/kitemviews/kfileitemmodel.cpp')
| -rw-r--r-- | src/kitemviews/kfileitemmodel.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index d1e0fc6f1..bd83bf621 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -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" |
