[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 ®ExpStr, 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 ®ExpStr, 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