kitemviews/kfileitemlistview.cpp
kitemviews/kfileitemlistwidget.cpp
kitemviews/kfileitemmodel.cpp
+ kitemviews/kfileitemmodelfilter.cpp
kitemviews/kfileitemmodelrolesupdater.cpp
kitemviews/kitemlistcontainer.cpp
kitemviews/kitemlistcontroller.cpp
m_caseSensitivity(Qt::CaseInsensitive),
m_itemData(),
m_items(),
- m_nameFilter(),
+ m_filter(),
m_filteredItems(),
m_requestRole(),
m_minimumUpdateIntervalTimer(0),
void KFileItemModel::setNameFilter(const QString& nameFilter)
{
- if (m_nameFilter != nameFilter) {
+ if (m_filter.pattern() != nameFilter) {
dispatchPendingItemsToInsert();
- m_nameFilter = nameFilter;
+ m_filter.setPattern(nameFilter);
// 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)) {
+ if (!m_filter.matches(itemData->item)) {
newFilteredItems.append(itemData->item);
m_filteredItems.insert(itemData->item);
}
QMutableSetIterator<KFileItem> it(m_filteredItems);
while (it.hasNext()) {
const KFileItem item = it.next();
- if (matchesNameFilter(item)) {
+ if (m_filter.matches(item)) {
newVisibleItems.append(item);
m_filteredItems.remove(item);
}
QString KFileItemModel::nameFilter() const
{
- return m_nameFilter;
+ return m_filter.pattern();
}
void KFileItemModel::onGroupedSortingChanged(bool current)
}
}
- if (m_nameFilter.isEmpty()) {
+ if (m_filter.pattern().isEmpty()) {
m_pendingItemsToInsert.append(items);
} else {
// The name-filter is active. Hide filtered items
// the filtered items in m_filteredItems.
KFileItemList filteredItems;
foreach (const KFileItem& item, items) {
- if (matchesNameFilter(item)) {
+ if (m_filter.matches(item)) {
filteredItems.append(item);
} else {
m_filteredItems.insert(item);
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 <libdolphin_export.h>
#include <KFileItemList>
#include <KUrl>
+#include <kitemviews/kfileitemmodelfilter_p.h>
#include <kitemviews/kitemmodelbase.h>
#include <QHash>
*/
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:
QWeakPointer<KDirLister> m_dirLister;
QList<ItemData*> m_itemData;
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()
bool m_requestRole[RolesCount];
--- /dev/null
+/***************************************************************************
+ * 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);
+ }
+}
--- /dev/null
+/***************************************************************************
+ * 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
+
+