[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdebase/apps/plasma/applets/folderview
From: Fredrik Höglund <fredrik () kde ! org>
Date: 2010-05-31 21:54:10
Message-ID: 20100531215410.343D7AC8C6 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1133009 by fredrik:
Improve readability and performance of the filtering code in the proxy model.
* Return true at the top of filterAcceptsRow() if no filter is set.
* Keep a list of the regexps used for name filtering instead of recreating
them each time in filterAcceptsRow().
* Don't do any regexp matching when the name filter is "*".
* Store the mimetype list in a QSet instead of in a QStringList.
* Don't resolve the mimetype if the mimetype set is empty.
* Do the pattern test before the mimetype test.
M +2 -2 folderview.cpp
M +58 -28 proxymodel.cpp
M +12 -2 proxymodel.h
--- trunk/KDE/kdebase/apps/plasma/applets/folderview/folderview.cpp #1133008:1133009
@@ -358,7 +358,7 @@
m_model->setFilterMode(ProxyModel::filterModeFromInt(m_filterType));
m_model->setMimeTypeFilterList(m_filterFilesMimeList);
- m_model->setFilterFixedString(m_filterFiles);
+ m_model->setFileNameFilter(m_filterFiles);
m_model->setSortDirectoriesFirst(m_sortDirsFirst);
m_model->setDynamicSortFilter(true);
m_model->sort(m_sortColumn != -1 ? m_sortColumn : KDirModel::Name, \
Qt::AscendingOrder); @@ -741,7 +741,7 @@
if (m_url != url || m_filterFiles != uiFilter.filterFilesPattern->text() ||
m_filterFilesMimeList != selectedItems || m_filterType != filterType)
{
- m_model->setFilterFixedString(uiFilter.filterFilesPattern->text());
+ m_model->setFileNameFilter(uiFilter.filterFilesPattern->text());
m_filterFiles = uiFilter.filterFilesPattern->text();
m_filterFilesMimeList = selectedItems;
m_filterType = filterType;
--- trunk/KDE/kdebase/apps/plasma/applets/folderview/proxymodel.cpp #1133008:1133009
@@ -30,12 +30,14 @@
#include <kde_file.h>
+#include <QDebug>
ProxyModel::ProxyModel(QObject *parent)
: QSortFilterProxyModel(parent),
m_filterMode(NoFilter),
m_sortDirsFirst(true),
- m_parseDesktopFiles(false)
+ m_parseDesktopFiles(false),
+ m_patternMatchAll(true)
{
setSupportedDragActions(Qt::CopyAction | Qt::MoveAction | Qt::LinkAction);
}
@@ -57,15 +59,36 @@
void ProxyModel::setMimeTypeFilterList(const QStringList &mimeList)
{
- m_mimeList = mimeList;
+ m_mimeSet = QSet<QString>::fromList(mimeList);
invalidateFilter();
}
-const QStringList &ProxyModel::mimeTypeFilterList() const
+QStringList ProxyModel::mimeTypeFilterList() const
{
- return m_mimeList;
+ return m_mimeSet.toList();
}
+void ProxyModel::setFileNameFilter(const QString &pattern)
+{
+ m_pattern = pattern;
+ m_patternMatchAll = (pattern == "*");
+
+ const QStringList patterns = pattern.split(' ');
+ m_regExps.clear();
+
+ foreach (const QString &pattern, patterns) {
+ QRegExp rx(pattern);
+ rx.setPatternSyntax(QRegExp::Wildcard);
+ rx.setCaseSensitivity(Qt::CaseInsensitive);
+ m_regExps.append(rx);
+ }
+}
+
+QString ProxyModel::fileNameFilter() const
+{
+ return m_pattern;
+}
+
void ProxyModel::setSortDirectoriesFirst(bool enable)
{
m_sortDirsFirst = enable;
@@ -157,39 +180,46 @@
}
}
-bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) \
const +inline bool ProxyModel::matchMimeType(const KFileItem &item) const
{
- const KDirModel *dirModel = static_cast<KDirModel*>(sourceModel());
- const KFileItem item = dirModel->itemForIndex(dirModel->index(sourceRow, \
KDirModel::Name, sourceParent)); + if (m_mimeSet.isEmpty()) {
+ return false;
+ }
- bool invertResult = false;
- switch (m_filterMode) {
- case NoFilter:
+ const QString mimeType = item.determineMimeType()->name();
+ return m_mimeSet.contains(mimeType);
+}
+
+inline bool ProxyModel::matchPattern(const KFileItem &item) const
+{
+ if (m_patternMatchAll) {
return true;
- case FilterHideMatches:
- invertResult = true; // fall through
- case FilterShowMatches: {
- // Mime type check
- bool ret = m_mimeList.contains(item.determineMimeType()->name());
- if (!ret) {
- return invertResult ? true : false;
}
- // Pattern check
- const QString regExpOrig = filterRegExp().pattern();
- const QStringList regExps = regExpOrig.split(' ');
- foreach (const QString ®ExpStr, regExps) {
- QRegExp regExp(regExpStr);
- regExp.setPatternSyntax(QRegExp::Wildcard);
- regExp.setCaseSensitivity(Qt::CaseInsensitive);
- if (regExp.indexIn(item.name()) != -1) {
- return invertResult ? false : true;
+ const QString name = item.name();
+ QListIterator<QRegExp> i(m_regExps);
+ while (i.hasNext()) {
+ if (i.next().exactMatch(name)) {
+ return true;
}
}
- break;
+
+ return false;
}
+
+bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) \
const +{
+ if (m_filterMode == NoFilter) {
+ return true;
}
- return invertResult ? true : false;
+ const KDirModel *dirModel = static_cast<KDirModel*>(sourceModel());
+ const KFileItem item = dirModel->itemForIndex(dirModel->index(sourceRow, \
KDirModel::Name, sourceParent)); +
+ if (m_filterMode == FilterShowMatches) {
+ return (matchPattern(item) && matchMimeType(item));
+ } else {
+ return !(matchPattern(item) && matchMimeType(item));
}
+}
--- trunk/KDE/kdebase/apps/plasma/applets/folderview/proxymodel.h #1133008:1133009
@@ -22,6 +22,8 @@
#include <QSortFilterProxyModel>
#include <QStringList>
+#include <QSet>
+#include <QRegExp>
class KDirModel;
class KFileItem;
@@ -43,8 +45,11 @@
FilterMode filterMode() const;
void setMimeTypeFilterList(const QStringList &mimeList);
- const QStringList &mimeTypeFilterList() const;
+ QStringList mimeTypeFilterList() const;
+ void setFileNameFilter(const QString &pattern);
+ QString fileNameFilter() const;
+
void setSortDirectoriesFirst(bool enable);
bool sortDirectoriesFirst() const;
@@ -60,12 +65,17 @@
protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
+ bool matchMimeType(const KFileItem &item) const;
+ bool matchPattern(const KFileItem &item) const;
private:
FilterMode m_filterMode;
- QStringList m_mimeList;
+ QSet<QString> m_mimeSet;
+ QList<QRegExp> m_regExps;
+ QString m_pattern;
bool m_sortDirsFirst;
bool m_parseDesktopFiles;
+ bool m_patternMatchAll;
};
#endif
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic