[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 &regExpStr, 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