mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-19 08:21:22 +00:00
Support wildcards for the filter
Thanks to Janardhan Reddy for the patch! BUG: 155986 FIXED-IN: 4.8.0
This commit is contained in:
parent
780e42533a
commit
cf704d2db6
|
@ -23,6 +23,7 @@ set(dolphinprivate_LIB_SRCS
|
||||||
kitemviews/kfileitemlistview.cpp
|
kitemviews/kfileitemlistview.cpp
|
||||||
kitemviews/kfileitemlistwidget.cpp
|
kitemviews/kfileitemlistwidget.cpp
|
||||||
kitemviews/kfileitemmodel.cpp
|
kitemviews/kfileitemmodel.cpp
|
||||||
|
kitemviews/kfileitemmodelfilter.cpp
|
||||||
kitemviews/kfileitemmodelrolesupdater.cpp
|
kitemviews/kfileitemmodelrolesupdater.cpp
|
||||||
kitemviews/kitemlistcontainer.cpp
|
kitemviews/kitemlistcontainer.cpp
|
||||||
kitemviews/kitemlistcontroller.cpp
|
kitemviews/kitemlistcontroller.cpp
|
||||||
|
|
|
@ -40,7 +40,7 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) :
|
||||||
m_caseSensitivity(Qt::CaseInsensitive),
|
m_caseSensitivity(Qt::CaseInsensitive),
|
||||||
m_itemData(),
|
m_itemData(),
|
||||||
m_items(),
|
m_items(),
|
||||||
m_nameFilter(),
|
m_filter(),
|
||||||
m_filteredItems(),
|
m_filteredItems(),
|
||||||
m_requestRole(),
|
m_requestRole(),
|
||||||
m_minimumUpdateIntervalTimer(0),
|
m_minimumUpdateIntervalTimer(0),
|
||||||
|
@ -501,17 +501,17 @@ void KFileItemModel::setExpanded(const QSet<KUrl>& urls)
|
||||||
|
|
||||||
void KFileItemModel::setNameFilter(const QString& nameFilter)
|
void KFileItemModel::setNameFilter(const QString& nameFilter)
|
||||||
{
|
{
|
||||||
if (m_nameFilter != nameFilter) {
|
if (m_filter.pattern() != nameFilter) {
|
||||||
dispatchPendingItemsToInsert();
|
dispatchPendingItemsToInsert();
|
||||||
|
|
||||||
m_nameFilter = nameFilter;
|
m_filter.setPattern(nameFilter);
|
||||||
|
|
||||||
// Check which shown items from m_itemData must get
|
// Check which shown items from m_itemData must get
|
||||||
// hidden and hence moved to m_filteredItems.
|
// hidden and hence moved to m_filteredItems.
|
||||||
KFileItemList newFilteredItems;
|
KFileItemList newFilteredItems;
|
||||||
|
|
||||||
foreach (ItemData* itemData, m_itemData) {
|
foreach (ItemData* itemData, m_itemData) {
|
||||||
if (!matchesNameFilter(itemData->item)) {
|
if (!m_filter.matches(itemData->item)) {
|
||||||
newFilteredItems.append(itemData->item);
|
newFilteredItems.append(itemData->item);
|
||||||
m_filteredItems.insert(itemData->item);
|
m_filteredItems.insert(itemData->item);
|
||||||
}
|
}
|
||||||
|
@ -526,7 +526,7 @@ void KFileItemModel::setNameFilter(const QString& nameFilter)
|
||||||
QMutableSetIterator<KFileItem> it(m_filteredItems);
|
QMutableSetIterator<KFileItem> it(m_filteredItems);
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
const KFileItem item = it.next();
|
const KFileItem item = it.next();
|
||||||
if (matchesNameFilter(item)) {
|
if (m_filter.matches(item)) {
|
||||||
newVisibleItems.append(item);
|
newVisibleItems.append(item);
|
||||||
m_filteredItems.remove(item);
|
m_filteredItems.remove(item);
|
||||||
}
|
}
|
||||||
|
@ -538,7 +538,7 @@ void KFileItemModel::setNameFilter(const QString& nameFilter)
|
||||||
|
|
||||||
QString KFileItemModel::nameFilter() const
|
QString KFileItemModel::nameFilter() const
|
||||||
{
|
{
|
||||||
return m_nameFilter;
|
return m_filter.pattern();
|
||||||
}
|
}
|
||||||
|
|
||||||
void KFileItemModel::onGroupedSortingChanged(bool current)
|
void KFileItemModel::onGroupedSortingChanged(bool current)
|
||||||
|
@ -686,7 +686,7 @@ void KFileItemModel::slotNewItems(const KFileItemList& items)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_nameFilter.isEmpty()) {
|
if (m_filter.pattern().isEmpty()) {
|
||||||
m_pendingItemsToInsert.append(items);
|
m_pendingItemsToInsert.append(items);
|
||||||
} else {
|
} else {
|
||||||
// The name-filter is active. Hide filtered items
|
// The name-filter is active. Hide filtered items
|
||||||
|
@ -694,7 +694,7 @@ void KFileItemModel::slotNewItems(const KFileItemList& items)
|
||||||
// the filtered items in m_filteredItems.
|
// the filtered items in m_filteredItems.
|
||||||
KFileItemList filteredItems;
|
KFileItemList filteredItems;
|
||||||
foreach (const KFileItem& item, items) {
|
foreach (const KFileItem& item, items) {
|
||||||
if (matchesNameFilter(item)) {
|
if (m_filter.matches(item)) {
|
||||||
filteredItems.append(item);
|
filteredItems.append(item);
|
||||||
} else {
|
} else {
|
||||||
m_filteredItems.insert(item);
|
m_filteredItems.insert(item);
|
||||||
|
@ -1769,15 +1769,4 @@ QList<QPair<int, QVariant> > KFileItemModel::genericStringRoleGroups(const QByte
|
||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KFileItemModel::matchesNameFilter(const KFileItem& item) const
|
|
||||||
{
|
|
||||||
// TODO #1: A performance improvement would be possible by caching m_nameFilter.toLower().
|
|
||||||
// Before adding yet-another-member it should be checked whether it brings a noticable
|
|
||||||
// improvement at all.
|
|
||||||
|
|
||||||
// TODO #2: If the user entered a '*' use a regular expression
|
|
||||||
const QString itemText = item.text().toLower();
|
|
||||||
return itemText.contains(m_nameFilter.toLower());
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "kfileitemmodel.moc"
|
#include "kfileitemmodel.moc"
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <libdolphin_export.h>
|
#include <libdolphin_export.h>
|
||||||
#include <KFileItemList>
|
#include <KFileItemList>
|
||||||
#include <KUrl>
|
#include <KUrl>
|
||||||
|
#include <kitemviews/kfileitemmodelfilter_p.h>
|
||||||
#include <kitemviews/kitemmodelbase.h>
|
#include <kitemviews/kitemmodelbase.h>
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
@ -293,11 +294,6 @@ private:
|
||||||
*/
|
*/
|
||||||
bool isChildItem(int index) const;
|
bool isChildItem(int index) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* @return True if the given item matches with the current set name filter.
|
|
||||||
*/
|
|
||||||
bool matchesNameFilter(const KFileItem& item) const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QWeakPointer<KDirLister> m_dirLister;
|
QWeakPointer<KDirLister> m_dirLister;
|
||||||
|
|
||||||
|
@ -311,7 +307,7 @@ private:
|
||||||
QList<ItemData*> m_itemData;
|
QList<ItemData*> m_itemData;
|
||||||
QHash<KUrl, int> m_items; // Allows O(1) access for KFileItemModel::index(const KFileItem& item)
|
QHash<KUrl, int> m_items; // Allows O(1) access for KFileItemModel::index(const KFileItem& item)
|
||||||
|
|
||||||
QString m_nameFilter;
|
KFileItemModelFilter m_filter;
|
||||||
QSet<KFileItem> m_filteredItems; // Items that got hidden by KFileItemModel::setNameFilter()
|
QSet<KFileItem> m_filteredItems; // Items that got hidden by KFileItemModel::setNameFilter()
|
||||||
|
|
||||||
bool m_requestRole[RolesCount];
|
bool m_requestRole[RolesCount];
|
||||||
|
|
74
src/kitemviews/kfileitemmodelfilter.cpp
Normal file
74
src/kitemviews/kfileitemmodelfilter.cpp
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2011 by Janardhan Reddy *
|
||||||
|
* <annapareddyjanardhanreddy@gmail.com> *
|
||||||
|
* *
|
||||||
|
* Based on the Itemviews NG project from Trolltech Labs: *
|
||||||
|
* http://qt.gitorious.org/qt-labs/itemviews-ng *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the *
|
||||||
|
* Free Software Foundation, Inc., *
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "kfileitemmodelfilter_p.h"
|
||||||
|
|
||||||
|
#include <KFileItem>
|
||||||
|
#include <QRegExp>
|
||||||
|
|
||||||
|
KFileItemModelFilter::KFileItemModelFilter() :
|
||||||
|
m_useRegExp(false),
|
||||||
|
m_regExp(0),
|
||||||
|
m_lowerCasePattern(),
|
||||||
|
m_pattern()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
KFileItemModelFilter::~KFileItemModelFilter()
|
||||||
|
{
|
||||||
|
delete m_regExp;
|
||||||
|
m_regExp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KFileItemModelFilter::setPattern(const QString& filter)
|
||||||
|
{
|
||||||
|
m_pattern = filter;
|
||||||
|
m_lowerCasePattern = filter.toLower();
|
||||||
|
|
||||||
|
m_useRegExp = filter.contains('*') ||
|
||||||
|
filter.contains('?') ||
|
||||||
|
filter.contains('[');
|
||||||
|
if (m_useRegExp) {
|
||||||
|
if (!m_regExp) {
|
||||||
|
m_regExp = new QRegExp();
|
||||||
|
m_regExp->setCaseSensitivity(Qt::CaseInsensitive);
|
||||||
|
m_regExp->setMinimal(false);
|
||||||
|
m_regExp->setPatternSyntax(QRegExp::WildcardUnix);
|
||||||
|
}
|
||||||
|
m_regExp->setPattern(filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString KFileItemModelFilter::pattern() const
|
||||||
|
{
|
||||||
|
return m_pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KFileItemModelFilter::matches(const KFileItem& item) const
|
||||||
|
{
|
||||||
|
if (m_useRegExp) {
|
||||||
|
return m_regExp->exactMatch(item.text());
|
||||||
|
} else {
|
||||||
|
return item.text().toLower().contains(m_lowerCasePattern);
|
||||||
|
}
|
||||||
|
}
|
73
src/kitemviews/kfileitemmodelfilter_p.h
Normal file
73
src/kitemviews/kfileitemmodelfilter_p.h
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2011 by Janardhan Reddy *
|
||||||
|
* <annapareddyjanardhanreddy@gmail.com> *
|
||||||
|
* *
|
||||||
|
* Based on the Itemviews NG project from Trolltech Labs: *
|
||||||
|
* http://qt.gitorious.org/qt-labs/itemviews-ng *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the *
|
||||||
|
* Free Software Foundation, Inc., *
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#ifndef KFILEITEMMODELFILTER_H
|
||||||
|
#define KFILEITEMMODELFILTER_H
|
||||||
|
|
||||||
|
#include <libdolphin_export.h>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class KFileItem;
|
||||||
|
class QRegExp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allows to check whether an item of the KFileItemModel
|
||||||
|
* matches with a set filter-string.
|
||||||
|
*
|
||||||
|
* Currently the filter is only checked for the KFileItem::text()
|
||||||
|
* property of the KFileItem, but this might get extended in
|
||||||
|
* future.
|
||||||
|
*/
|
||||||
|
class LIBDOLPHINPRIVATE_EXPORT KFileItemModelFilter
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
KFileItemModelFilter();
|
||||||
|
virtual ~KFileItemModelFilter();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the pattern that is used for a comparison with the item
|
||||||
|
* in KFileItemModelFilter::matches(). Per default the pattern
|
||||||
|
* defines a sub-string. As soon as the pattern contains at least
|
||||||
|
* a '*', '?' or '[' the pattern represents a regular expression.
|
||||||
|
*/
|
||||||
|
void setPattern(const QString& pattern);
|
||||||
|
QString pattern() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return True if the item matches with the pattern defined by
|
||||||
|
* KFileItemModelFilter::setPattern().
|
||||||
|
*/
|
||||||
|
bool matches(const KFileItem& item) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_useRegExp; // If true, m_regExp is used for filtering,
|
||||||
|
// otherwise m_lowerCaseFilter is used.
|
||||||
|
QRegExp* m_regExp;
|
||||||
|
QString m_lowerCasePattern; // Lowercase version of m_filter for
|
||||||
|
// faster comparison in matches().
|
||||||
|
QString m_pattern; // Property set by setFilter().
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue