[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-panel-devel
Subject:    Re: Folderview mimetype support (another try)
From:       Rafael =?iso-8859-15?q?Fern=E1ndez_L=F3pez?= <ereslibre () kde ! org>
Date:       2008-07-23 23:36:30
Message-ID: 200807240136.32412.ereslibre () kde ! org
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


Hi again,

Because of selections weren't clear enough and I felt they were pretty 
inconsistent and error prone (try to select a row, and then filter => 
selection lost). I added checkboxes to really check what you want to add to 
the filter. Attached is the patch.


Regards,
Rafael Fernández López.

["kdebase-apps-plasma.diff" (text/x-patch)]

diff --git a/apps/plasma/applets/folderview/folderview.cpp \
b/apps/plasma/applets/folderview/folderview.cpp index 4931764..b4315f2 100644
--- a/apps/plasma/applets/folderview/folderview.cpp
+++ b/apps/plasma/applets/folderview/folderview.cpp
@@ -18,7 +18,6 @@
  */
 
 #include "folderview.h"
-#include "folderview.moc"
 
 #include <QApplication>
 #include <QClipboard>
@@ -43,6 +42,7 @@
 #include <KGlobalSettings>
 #include <KMenu>
 #include <KStandardShortcut>
+#include <KStringHandler>
 
 #include <kio/fileundomanager.h>
 #include <kio/paste.h>
@@ -63,6 +63,132 @@
 #include <limits.h>
 
 
+MimeModel::MimeModel(QObject *parent)
+    : QStringListModel(parent)
+{
+    m_mimetypes = KMimeType::allMimeTypes();
+}
+
+QVariant MimeModel::data(const QModelIndex &index, int role) const
+{
+    if (!index.isValid()) {
+        return QVariant();
+    }
+    KMimeType *mime = static_cast<KMimeType*>(index.internalPointer());
+    switch (role) {
+        case Qt::DisplayRole: {
+            if (!mime->comment().isEmpty()) {
+                QString description;
+                if (mime->patterns().count()) {
+                    description = mime->patterns().join(", ");
+                } else {
+                    description = mime->name();
+                }
+                return QString("%1 (%2)").arg(mime->comment()).arg(description);
+            } else {
+                return mime->name();
+            }
+        }
+        case Qt::DecorationRole:
+            return KIcon(mime->iconName());
+        case Qt::CheckStateRole:
+            return m_state[mime];
+        default:
+            return QStringListModel::data(index, role);
+    }
+}
+
+Qt::ItemFlags MimeModel::flags(const QModelIndex &index) const
+{
+    Qt::ItemFlags itemFlags = QStringListModel::flags(index);
+    itemFlags &= ~Qt::ItemIsEditable;
+    if (!index.isValid()) {
+        return itemFlags;
+    }
+    return itemFlags | Qt::ItemIsUserCheckable;
+}
+
+QModelIndex MimeModel::index(int row, int column, const QModelIndex &parent) const
+{
+    if (parent.isValid() || row >= m_mimetypes.count()) {
+        return QModelIndex();
+    } 
+    return createIndex(row, column, (void*) m_mimetypes[row].data());
+}
+
+int MimeModel::rowCount(const QModelIndex &parent) const
+{
+    if (parent.isValid()) {
+        return 0;
+    }
+    return m_mimetypes.count();
+}
+
+bool MimeModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+    if (!index.isValid()) {
+        return false;
+    }
+    
+    if (role == Qt::CheckStateRole) {
+        KMimeType *mime = static_cast<KMimeType*>(index.internalPointer());
+        m_state[mime] = (Qt::CheckState) value.toInt();
+        emit dataChanged(index, index);
+        return true;
+    }
+    
+    return QStringListModel::setData(index, value, role);
+}
+
+
+
+// ---------------------------------------------------------------------------
+
+
+
+ProxyMimeModel::ProxyMimeModel(QObject *parent)
+    : QSortFilterProxyModel(parent)
+{
+}
+
+void ProxyMimeModel::setSourceModel(QAbstractItemModel *sourceModel)
+{
+    QSortFilterProxyModel::setSourceModel(sourceModel);
+    sort(0);
+}
+
+void ProxyMimeModel::setFilter(const QString &filter)
+{
+    m_filter = filter;
+    invalidateFilter();
+}
+
+bool ProxyMimeModel::lessThan(const QModelIndex &left, const QModelIndex &right) \
const +{
+    KMimeType *leftPtr = static_cast<KMimeType*>(left.internalPointer());
+    KMimeType *rightPtr = static_cast<KMimeType*>(right.internalPointer());
+    
+    return KStringHandler::naturalCompare(leftPtr->comment(), rightPtr->comment()) < \
0; +}
+
+bool ProxyMimeModel::filterAcceptsRow(int source_row, const QModelIndex \
&source_parent) const +{
+    QModelIndex sourceIndex = sourceModel()->index(source_row, 0, source_parent);
+    KMimeType *mime = static_cast<KMimeType*>(sourceIndex.internalPointer());
+    if (m_filter.isEmpty()) {
+        return true;
+    }
+    return mime->comment().contains(m_filter, Qt::CaseInsensitive) ||
+           ((!mime->patterns().count() || mime->comment().isEmpty()) && \
mime->name().contains(m_filter, Qt::CaseInsensitive)) || +           \
mime->patterns().contains(m_filter, Qt::CaseInsensitive); +}
+
+
+
+// ---------------------------------------------------------------------------
+
+
+
 // Wraps a QScrollBar in a QGraphicsProxyWidget
 class ScrollBar : public QGraphicsProxyWidget
 {
@@ -165,6 +291,12 @@ void FolderView::init()
     }
     m_filterFiles = cg.readEntry("filterFiles", "*");
 
+    m_filterType = cg.readEntry("filter", 0);
+    m_model->setFilterMode(ProxyModel::filterModeFromInt(m_filterType));
+
+    m_filterFilesMimeList = cg.readEntry("mimeFilter", QStringList());
+    m_model->setMimeTypeFilterList(m_filterFilesMimeList);
+    
     KDirLister *lister = new KDirLister(this);
     lister->openUrl(m_url);
 
@@ -195,13 +327,41 @@ void FolderView::createConfigurationInterface(KConfigDialog \
*parent)  }
 
     ui.lineEdit->setMode(KFile::Directory); 
-    ui.filterFiles->setText(m_filterFiles);
+    ui.filterFilesPattern->setText(m_filterFiles);
+    
+    MimeModel *mimeModel = new MimeModel(ui.filterFilesList);
+    ProxyMimeModel *pMimeModel = new ProxyMimeModel(ui.filterFilesList);
+    pMimeModel->setSourceModel(mimeModel);
+    ui.filterFilesList->setModel(pMimeModel);
+    
+    connect(ui.searchMimetype, SIGNAL(textChanged(QString)), pMimeModel, \
SLOT(setFilter(QString)));  
     parent->addPage(widget, parent->windowTitle(), icon());
     parent->setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Apply);
     connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
     connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
     connect(ui.showCustomFolder, SIGNAL(toggled(bool)), this, \
SLOT(customFolderToggled(bool))); +    connect(ui.filterType, \
SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged(int))); +    \
connect(ui.selectAll, SIGNAL(clicked(bool)), this, SLOT(selectUnselectAll())); +    \
connect(ui.deselectAll, SIGNAL(clicked(bool)), this, SLOT(selectUnselectAll())); +    \
 +    KConfigGroup cg = config();
+    int filter = cg.readEntry("filter", 0);
+    ui.filterType->setCurrentIndex(filter);
+    filterChanged(filter);
+    
+    QStringList selectedItems = cg.readEntry("mimeFilter", QStringList());
+    
+    if (selectedItems.count()) {
+        for (int i = 0; i < pMimeModel->rowCount(); i++) {
+            const QModelIndex index = pMimeModel->index(i, 0);
+            const KMimeType *mime = \
static_cast<KMimeType*>(pMimeModel->mapToSource(index).internalPointer()); +          \
if (selectedItems.contains(mime->name())) { +                \
selectedItems.removeAll(mime->name()); +                \
ui.filterFilesList->model()->setData(index, Qt::Checked, Qt::CheckStateRole); +       \
} +        }
+    }
 }
 
 void FolderView::configAccepted()
@@ -216,15 +376,34 @@ void FolderView::configAccepted()
     if (url.isEmpty() || (url.isLocalFile() && !QFile::exists(url.path())))
         url = KUrl(QDir::homePath());
 
-    if (m_url != url || m_filterFiles != ui.filterFiles->text()) {
+    QStringList selectedItems;    
+    for (int i = 0; i < ui.filterFilesList->model()->rowCount(); i++) {
+        const QModelIndex index = ui.filterFilesList->model()->index(i, 0);
+        if (index.model()->data(index, Qt::CheckStateRole).toInt() == Qt::Checked) {
+            const QModelIndex mappedIndex = \
static_cast<ProxyMimeModel*>(ui.filterFilesList->model())->mapToSource(index); +      \
selectedItems << static_cast<KMimeType*>(mappedIndex.internalPointer())->name(); +    \
} +    }
+    
+    int filterType = ui.filterType->currentIndex();
+
+    if (m_url != url || m_filterFiles != ui.filterFilesPattern->text() || \
m_filterFilesMimeList != selectedItems || +        m_filterType != filterType) {
         m_dirModel->dirLister()->openUrl(url);
-        m_model->setFilterFixedString(ui.filterFiles->text());
+        m_model->setFilterFixedString(ui.filterFilesPattern->text());
         m_url = url;
-        m_filterFiles = ui.filterFiles->text();
+        m_filterFiles = ui.filterFilesPattern->text();
+        m_filterFilesMimeList = selectedItems;
+        m_filterType = filterType;
 
         KConfigGroup cg = config();
         cg.writeEntry("url", m_url);
         cg.writeEntry("filterFiles", m_filterFiles);
+        cg.writeEntry("filter", m_filterType);
+        cg.writeEntry("mimeFilter", m_filterFilesMimeList);
+        
+        m_model->setMimeTypeFilterList(m_filterFilesMimeList);
+        m_model->setFilterMode(ProxyModel::filterModeFromInt(m_filterType));
 
         emit configNeedsSaving();
     }
@@ -996,6 +1175,20 @@ void FolderView::closeEditor(QWidget *editor, \
QAbstractItemDelegate::EndEditHint  markEverythingDirty();
 }
 
+void FolderView::filterChanged(int index)
+{
+    ui.fileFilters->setVisible(index != 0);
+}
+
+void FolderView::selectUnselectAll()
+{
+    Qt::CheckState state = sender() == ui.selectAll ? Qt::Checked : Qt::Unchecked;
+    for (int i = 0; i < ui.filterFilesList->model()->rowCount(); i++) {
+        const QModelIndex index = ui.filterFilesList->model()->index(i, 0);
+        ui.filterFilesList->model()->setData(index, state, Qt::CheckStateRole);
+    }
+}
+
 void FolderView::moveToTrash(Qt::MouseButtons buttons, Qt::KeyboardModifiers \
modifiers)  {
     Q_UNUSED(buttons)    
@@ -1488,3 +1681,4 @@ QStyleOptionViewItemV4 FolderView::viewOptions() const
     return option;
 }
 
+#include "folderview.moc"
diff --git a/apps/plasma/applets/folderview/folderview.h \
b/apps/plasma/applets/folderview/folderview.h index 941d9c3..31b2a5a 100644
--- a/apps/plasma/applets/folderview/folderview.h
+++ b/apps/plasma/applets/folderview/folderview.h
@@ -21,10 +21,12 @@
 #define FOLDERVIEW_H
 
 #include <QPersistentModelIndex>
+#include <QSortFilterProxyModel>
 #include <QStyleOption>
 #include <QPointer>
 
 #include <KActionCollection>
+#include <KMimeType>
 
 #include <plasma/containment.h>
 #include "ui_folderviewConfig.h"
@@ -90,6 +92,9 @@ private slots:
 
     void commitData(QWidget *editor);
     void closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint);
+    
+    void filterChanged(int index);
+    void selectUnselectAll();
 
 private:
     void createActions();
@@ -138,7 +143,9 @@ private:
     int m_titleHeight;
     int m_lastScrollValue;
     bool m_viewScrolled;
+    int m_filterType;
     QString m_filterFiles;
+    QStringList m_filterFilesMimeList;
     QFont m_font;
     QPointer<KNewMenu> m_newMenu;
     KActionCollection m_actionCollection;
@@ -158,6 +165,54 @@ private:
     bool m_dragInProgress;
 };
 
+
+
+// ---------------------------------------------------------------------------
+
+
+
+class MimeModel : public QStringListModel
+{
+public:
+    MimeModel(QObject *parent = 0);
+    
+    virtual QVariant data(const QModelIndex &index, int role) const;
+    virtual Qt::ItemFlags flags(const QModelIndex &index) const;
+    virtual QModelIndex index(int row, int column = 0, const QModelIndex &parent = \
QModelIndex()) const; +    virtual int rowCount(const QModelIndex &parent = \
QModelIndex()) const; +    virtual bool setData(const QModelIndex &index, const \
QVariant &value, int role = Qt::EditRole); +    
+private:
+    KMimeType::List m_mimetypes;
+    QMap<KMimeType*, Qt::CheckState> m_state;
+};
+
+
+
+// ---------------------------------------------------------------------------
+
+
+
+class ProxyMimeModel : public QSortFilterProxyModel
+{
+Q_OBJECT
+
+public:
+    ProxyMimeModel(QObject *parent = 0);
+    
+    virtual void setSourceModel(QAbstractItemModel *sourceModel);
+    
+public slots:
+    void setFilter(const QString &filter);
+    
+protected:
+    virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
+    virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) \
const; +    
+private:
+    QString m_filter;
+};
+
 K_EXPORT_PLASMA_APPLET(folderview, FolderView)
 
 #endif
diff --git a/apps/plasma/applets/folderview/folderviewConfig.ui \
b/apps/plasma/applets/folderview/folderviewConfig.ui index 02db010..8c7732a 100644
--- a/apps/plasma/applets/folderview/folderviewConfig.ui
+++ b/apps/plasma/applets/folderview/folderviewConfig.ui
@@ -1,13 +1,190 @@
 <ui version="4.0" >
  <class>folderviewConfig</class>
  <widget class="QWidget" name="folderviewConfig" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>566</width>
+    <height>373</height>
+   </rect>
+  </property>
   <property name="sizePolicy" >
    <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
     <horstretch>0</horstretch>
     <verstretch>0</verstretch>
    </sizepolicy>
   </property>
+  <property name="minimumSize" >
+   <size>
+    <width>500</width>
+    <height>0</height>
+   </size>
+  </property>
   <layout class="QGridLayout" name="gridLayout" >
+   <item row="4" column="0" colspan="3" >
+    <widget class="QGroupBox" name="fileFilters" >
+     <property name="sizePolicy" >
+      <sizepolicy vsizetype="Expanding" hsizetype="Preferred" >
+       <horstretch>0</horstretch>
+       <verstretch>10</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize" >
+      <size>
+       <width>0</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="title" >
+      <string/>
+     </property>
+     <property name="flat" >
+      <bool>true</bool>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_3" >
+      <property name="spacing" >
+       <number>0</number>
+      </property>
+      <property name="sizeConstraint" >
+       <enum>QLayout::SetNoConstraint</enum>
+      </property>
+      <property name="margin" >
+       <number>0</number>
+      </property>
+      <item>
+       <layout class="QGridLayout" name="gridLayout_5" >
+        <property name="margin" >
+         <number>4</number>
+        </property>
+        <item row="6" column="0" >
+         <widget class="KLineEdit" name="filterFilesPattern" >
+          <property name="sizePolicy" >
+           <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="toolTip" >
+           <string>Space-separated list of extensions, e.g. *.txt * .od*</string>
+          </property>
+          <property name="whatsThis" >
+           <string>Space-separated list of extensions, e.g. *.txt * .od* to display \
only office- and text-files</string> +          </property>
+          <property name="alignment" >
+           <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+          </property>
+          <property name="urlDropsEnabled" >
+           <bool>false</bool>
+          </property>
+          <property name="clickMessage" >
+           <string>Pattern filter</string>
+          </property>
+          <property name="showClearButton" stdset="0" >
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="5" column="0" >
+         <widget class="QLabel" name="label_2" >
+          <property name="text" >
+           <string>You can also set a pattern filter:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="0" >
+         <layout class="QHBoxLayout" name="horizontalLayout" >
+          <item>
+           <widget class="QListView" name="filterFilesList" >
+            <property name="sizePolicy" >
+             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="selectionMode" >
+             <enum>QAbstractItemView::NoSelection</enum>
+            </property>
+            <property name="flow" >
+             <enum>QListView::TopToBottom</enum>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout" >
+            <item>
+             <widget class="QPushButton" name="selectAll" >
+              <property name="text" >
+               <string>Select All</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QPushButton" name="deselectAll" >
+              <property name="text" >
+               <string>Deselect All</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="verticalSpacer" >
+              <property name="orientation" >
+               <enum>Qt::Vertical</enum>
+              </property>
+              <property name="sizeHint" stdset="0" >
+               <size>
+                <width>20</width>
+                <height>40</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+        <item row="1" column="0" >
+         <widget class="KLineEdit" name="searchMimetype" >
+          <property name="clickMessage" >
+           <string>Search file type</string>
+          </property>
+          <property name="showClearButton" stdset="0" >
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="0" >
+         <widget class="QLabel" name="label" >
+          <property name="text" >
+           <string>Select which file types you want to add to the filter:</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+     </layout>
+     <zorder></zorder>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="3" >
+    <widget class="QComboBox" name="filterType" >
+     <item>
+      <property name="text" >
+       <string>No Filter</string>
+      </property>
+     </item>
+     <item>
+      <property name="text" >
+       <string>Show files matching...</string>
+      </property>
+     </item>
+     <item>
+      <property name="text" >
+       <string>Hide files matching...</string>
+      </property>
+     </item>
+    </widget>
+   </item>
    <item row="0" column="0" colspan="3" >
     <widget class="QRadioButton" name="showDesktopFolder" >
      <property name="text" >
@@ -22,22 +199,6 @@
      </property>
     </widget>
    </item>
-   <item row="2" column="0" >
-    <spacer name="spacer2" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeType" >
-      <enum>QSizePolicy::Fixed</enum>
-     </property>
-     <property name="sizeHint" stdset="0" >
-      <size>
-       <width>21</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
    <item row="2" column="1" >
     <widget class="QLabel" name="selectLabel" >
      <property name="sizePolicy" >
@@ -64,46 +225,27 @@
      </property>
     </widget>
    </item>
-   <item row="3" column="1" >
-    <widget class="QLabel" name="filterLabel" >
-     <property name="text" >
-      <string>Filter</string>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="2" >
-    <spacer name="spacer1" >
+   <item row="5" column="0" >
+    <spacer name="verticalSpacer_2" >
      <property name="orientation" >
       <enum>Qt::Vertical</enum>
      </property>
-     <property name="sizeType" >
-      <enum>QSizePolicy::Expanding</enum>
-     </property>
      <property name="sizeHint" stdset="0" >
       <size>
        <width>20</width>
-       <height>81</height>
+       <height>0</height>
       </size>
      </property>
     </spacer>
    </item>
-   <item row="3" column="2" >
-    <widget class="KLineEdit" name="filterFiles" >
-     <property name="toolTip" >
-      <string>Space-separated list of extensions, e.g. *.txt * .od*</string>
-     </property>
-     <property name="whatsThis" >
-      <string>Space-separated list of extensions, e.g. *.txt * .od* to display only \
                office- and text-files</string>
-     </property>
-     <property name="urlDropsEnabled" >
-      <bool>false</bool>
-     </property>
-     <property name="showClearButton" stdset="0" >
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
   </layout>
+  <zorder>fileFilters</zorder>
+  <zorder>filterType</zorder>
+  <zorder>showDesktopFolder</zorder>
+  <zorder>showCustomFolder</zorder>
+  <zorder>selectLabel</zorder>
+  <zorder>lineEdit</zorder>
+  <zorder>verticalSpacer_2</zorder>
  </widget>
  <customwidgets>
   <customwidget>
diff --git a/apps/plasma/applets/folderview/proxymodel.cpp \
b/apps/plasma/applets/folderview/proxymodel.cpp index d5a03ac..df9bcd6 100644
--- a/apps/plasma/applets/folderview/proxymodel.cpp
+++ b/apps/plasma/applets/folderview/proxymodel.cpp
@@ -33,6 +33,28 @@ ProxyModel::~ProxyModel()
 {
 }
 
+void ProxyModel::setFilterMode(FilterMode filterMode)
+{
+    m_filterMode = filterMode;
+    invalidateFilter();
+}
+
+ProxyModel::FilterMode ProxyModel::filterMode() const
+{
+    return m_filterMode;
+}
+
+void ProxyModel::setMimeTypeFilterList(const QStringList &mimeList)
+{
+    m_mimeList = mimeList;
+    invalidateFilter();
+}
+
+const QStringList &ProxyModel::mimeTypeFilterList() const
+{
+    return m_mimeList;
+}
+
 QModelIndex ProxyModel::indexForUrl(const KUrl &url) const
 {
     const KDirModel *dirModel = static_cast<KDirModel*>(sourceModel());
@@ -61,23 +83,51 @@ bool ProxyModel::lessThan(const QModelIndex &left, const \
                QModelIndex &right) con
     return KStringHandler::naturalCompare(item1.name(), item2.name(), \
Qt::CaseInsensitive) < 0;  }
 
+ProxyModel::FilterMode ProxyModel::filterModeFromInt(int filterMode)
+{
+    switch (filterMode) {
+        case 0:
+            return ProxyModel::NoFilter;
+        case 1:
+            return ProxyModel::FilterShowMatches;
+        default:
+            return ProxyModel::FilterHideMatches;
+    }
+}
+
 bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) \
const  {
     const KDirModel *dirModel = static_cast<KDirModel*>(sourceModel());
     const KFileItem item = dirModel->itemForIndex(dirModel->index(sourceRow, \
KDirModel::Name, sourceParent));  
-    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) {
+    bool invertResult = false;
+    switch (m_filterMode) {
+        case NoFilter:
             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;
+                }
+            }
+            break;
         }
     }
 
-    return false;
+    return invertResult ? true : false;
 }
 
diff --git a/apps/plasma/applets/folderview/proxymodel.h \
b/apps/plasma/applets/folderview/proxymodel.h index aaf044d..f8e87c6 100644
--- a/apps/plasma/applets/folderview/proxymodel.h
+++ b/apps/plasma/applets/folderview/proxymodel.h
@@ -21,6 +21,7 @@
 #define PROXYMODEL_H
 
 #include <QSortFilterProxyModel>
+#include <QStringList>
 
 class KFileItem;
 class KUrl;
@@ -28,15 +29,33 @@ class KUrl;
 class ProxyModel : public QSortFilterProxyModel
 {
 public:
+    enum FilterMode {
+        NoFilter = 0,
+        FilterShowMatches,
+        FilterHideMatches
+    };
+
     ProxyModel(QObject *parent = 0);
     ~ProxyModel();
-
+    
+    void setFilterMode(FilterMode filterMode);
+    FilterMode filterMode() const;
+    
+    void setMimeTypeFilterList(const QStringList &mimeList);
+    const QStringList &mimeTypeFilterList() const;
+    
     QModelIndex indexForUrl(const KUrl &url) const;
     KFileItem itemForIndex(const QModelIndex &index) const;
     bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
+    
+    static FilterMode filterModeFromInt(int filterMode);
 
 protected:
     bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
+    
+private:
+    FilterMode m_filterMode;
+    QStringList m_mimeList;
 };
 
 #endif


["signature.asc" (application/pgp-signature)]

_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic