┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dolphinpart.cpp61
-rw-r--r--src/dolphinpart.h16
-rw-r--r--src/kitemviews/kfileitemmodel.cpp78
-rw-r--r--src/kitemviews/kfileitemmodel.h8
-rw-r--r--src/kitemviews/private/kfileitemmodelfilter.cpp51
-rw-r--r--src/kitemviews/private/kfileitemmodelfilter.h29
-rw-r--r--src/views/dolphinview.cpp10
-rw-r--r--src/views/dolphinview.h8
8 files changed, 227 insertions, 34 deletions
diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp
index fff7dc0e0..bf3d2a54f 100644
--- a/src/dolphinpart.cpp
+++ b/src/dolphinpart.cpp
@@ -61,7 +61,6 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL
Q_UNUSED(args)
setComponentData(DolphinPartFactory::componentData(), false);
m_extension = new DolphinPartBrowserExtension(this);
- new DolphinPartFileInfoExtension(this);
// make sure that other apps using this part find Dolphin's view-file-columns icons
KIconLoader::global()->addAppDir("dolphin");
@@ -116,6 +115,11 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL
connect(clipboard, SIGNAL(dataChanged()),
this, SLOT(updatePasteAction()));
+ // Create file info and listing filter extensions.
+ // NOTE: Listing filter needs to be instantiated after the creation of the view.
+ new DolphinPartFileInfoExtension(this);
+ new DolphinPartListingFilterExtension(this);
+
createActions();
m_actionHandler->updateViewActions();
slotSelectionChanged(KFileItemList()); // initially disable selection-dependent actions
@@ -647,4 +651,59 @@ KFileItemList DolphinPartFileInfoExtension::queryFor(KParts::FileInfoExtension::
return list;
}
+DolphinPartListingFilterExtension::DolphinPartListingFilterExtension (DolphinPart* part)
+ : KParts::ListingFilterExtension(part)
+ , m_part(part)
+{
+}
+
+KParts::ListingFilterExtension::FilterModes DolphinPartListingFilterExtension::supportedFilterModes() const
+{
+ return (KParts::ListingFilterExtension::MimeType |
+ KParts::ListingFilterExtension::SubString |
+ KParts::ListingFilterExtension::WildCard);
+}
+
+bool DolphinPartListingFilterExtension::supportsMultipleFilters (KParts::ListingFilterExtension::FilterMode mode) const
+{
+ if (mode == KParts::ListingFilterExtension::MimeType)
+ return true;
+
+ return false;
+}
+
+QVariant DolphinPartListingFilterExtension::filter (KParts::ListingFilterExtension::FilterMode mode) const
+{
+ QVariant result;
+
+ switch (mode) {
+ case KParts::ListingFilterExtension::MimeType:
+ result = m_part->view()->mimeTypeFilters();
+ break;
+ case KParts::ListingFilterExtension::SubString:
+ case KParts::ListingFilterExtension::WildCard:
+ result = m_part->view()->nameFilter();
+ break;
+ default:
+ break;
+ }
+
+ return result;
+}
+
+void DolphinPartListingFilterExtension::setFilter (KParts::ListingFilterExtension::FilterMode mode, const QVariant& filter)
+{
+ switch (mode) {
+ case KParts::ListingFilterExtension::MimeType:
+ m_part->view()->setMimeTypeFilters(filter.toStringList());
+ break;
+ case KParts::ListingFilterExtension::SubString:
+ case KParts::ListingFilterExtension::WildCard:
+ m_part->view()->setNameFilter(filter.toString());
+ break;
+ default:
+ break;
+ }
+}
+
#include "dolphinpart.moc"
diff --git a/src/dolphinpart.h b/src/dolphinpart.h
index e5693b363..f9c0bbf62 100644
--- a/src/dolphinpart.h
+++ b/src/dolphinpart.h
@@ -23,6 +23,7 @@
#include <kparts/part.h>
#include <kparts/browserextension.h>
#include <kparts/fileinfoextension.h>
+#include <kparts/listingextension.h>
#include <QItemSelectionModel>
@@ -281,4 +282,19 @@ protected:
DolphinPart* part() const;
};
+class DolphinPartListingFilterExtension : public KParts::ListingFilterExtension
+{
+ Q_OBJECT
+
+public:
+ DolphinPartListingFilterExtension (DolphinPart* part);
+ virtual FilterModes supportedFilterModes() const;
+ virtual bool supportsMultipleFilters (FilterMode mode) const;
+ virtual QVariant filter (FilterMode mode) const;
+ virtual void setFilter (FilterMode mode, const QVariant& filter);
+
+private:
+ DolphinPart* m_part;
+};
+
#endif /* DOLPHINPART_H */
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp
index 6936af431..752bc9365 100644
--- a/src/kitemviews/kfileitemmodel.cpp
+++ b/src/kitemviews/kfileitemmodel.cpp
@@ -508,46 +508,64 @@ void KFileItemModel::setNameFilter(const QString& nameFilter)
{
if (m_filter.pattern() != nameFilter) {
dispatchPendingItemsToInsert();
-
m_filter.setPattern(nameFilter);
+ applyFilters();
+ }
+}
+
+QString KFileItemModel::nameFilter() const
+{
+ return m_filter.pattern();
+}
+
+void KFileItemModel::setMimeTypeFilters(const QStringList& filters)
+{
+ if (m_filter.mimeTypes() != filters) {
+ dispatchPendingItemsToInsert();
+ m_filter.setMimeTypes(filters);
+ applyFilters();
+ }
+}
+
+QStringList KFileItemModel::mimeTypeFilters() const
+{
+ return m_filter.mimeTypes();
+}
- // Check which shown items from m_itemData must get
- // hidden and hence moved to m_filteredItems.
- KFileItemList newFilteredItems;
- foreach (ItemData* itemData, m_itemData) {
+void KFileItemModel::applyFilters()
+{
+ // Check which shown items from m_itemData must get
+ // hidden and hence moved to m_filteredItems.
+ KFileItemList newFilteredItems;
+
+ foreach (ItemData* itemData, m_itemData) {
+ // Only filter non-expanded items as child items may never
+ // exist without a parent item
+ if (!itemData->values.value("isExpanded").toBool()) {
if (!m_filter.matches(itemData->item)) {
- // Only filter non-expanded items as child items may never
- // exist without a parent item
- if (!itemData->values.value("isExpanded").toBool()) {
- newFilteredItems.append(itemData->item);
- m_filteredItems.insert(itemData->item);
- }
+ newFilteredItems.append(itemData->item);
+ m_filteredItems.insert(itemData->item);
}
}
+ }
- removeItems(newFilteredItems);
+ removeItems(newFilteredItems);
- // Check which hidden items from m_filteredItems should
- // get visible again and hence removed from m_filteredItems.
- KFileItemList newVisibleItems;
+ // Check which hidden items from m_filteredItems should
+ // get visible again and hence removed from m_filteredItems.
+ KFileItemList newVisibleItems;
- QMutableSetIterator<KFileItem> it(m_filteredItems);
- while (it.hasNext()) {
- const KFileItem item = it.next();
- if (m_filter.matches(item)) {
- newVisibleItems.append(item);
- it.remove();
- }
+ QMutableSetIterator<KFileItem> it(m_filteredItems);
+ while (it.hasNext()) {
+ const KFileItem item = it.next();
+ if (m_filter.matches(item)) {
+ newVisibleItems.append(item);
+ it.remove();
}
-
- insertItems(newVisibleItems);
}
-}
-QString KFileItemModel::nameFilter() const
-{
- return m_filter.pattern();
+ insertItems(newVisibleItems);
}
QList<KFileItemModel::RoleInfo> KFileItemModel::rolesInformation()
@@ -729,10 +747,10 @@ void KFileItemModel::slotNewItems(const KFileItemList& items)
}
}
- if (m_filter.pattern().isEmpty()) {
+ if (!m_filter.hasSetFilters()) {
m_pendingItemsToInsert.append(items);
} else {
- // The name-filter is active. Hide filtered items
+ // The name or type filter is active. Hide filtered items
// before inserting them into the model and remember
// the filtered items in m_filteredItems.
KFileItemList filteredItems;
diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h
index d9bebdf02..958fa104b 100644
--- a/src/kitemviews/kfileitemmodel.h
+++ b/src/kitemviews/kfileitemmodel.h
@@ -179,6 +179,9 @@ public:
void setNameFilter(const QString& nameFilter);
QString nameFilter() const;
+ void setMimeTypeFilters(const QStringList& filters);
+ QStringList mimeTypeFilters() const;
+
struct RoleInfo
{ QByteArray role;
QString translation;
@@ -389,6 +392,11 @@ private:
void emitSortProgress(int resolvedCount);
/**
+ * Applies the filters set through @ref setNameFilter and @ref setMimeTypeFilters.
+ */
+ void applyFilters();
+
+ /**
* Maps the QByteArray-roles to RoleTypes and provides translation- and
* group-contexts.
*/
diff --git a/src/kitemviews/private/kfileitemmodelfilter.cpp b/src/kitemviews/private/kfileitemmodelfilter.cpp
index 816d35634..2e320f2d9 100644
--- a/src/kitemviews/private/kfileitemmodelfilter.cpp
+++ b/src/kitemviews/private/kfileitemmodelfilter.cpp
@@ -23,6 +23,7 @@
#include <KFileItem>
#include <QRegExp>
+
KFileItemModelFilter::KFileItemModelFilter() :
m_useRegExp(false),
m_regExp(0),
@@ -61,11 +62,61 @@ QString KFileItemModelFilter::pattern() const
return m_pattern;
}
+void KFileItemModelFilter::setMimeTypes(const QStringList& types)
+{
+ m_mimeTypes = types;
+}
+
+QStringList KFileItemModelFilter::mimeTypes() const
+{
+ return m_mimeTypes;
+}
+
+bool KFileItemModelFilter::hasSetFilters() const
+{
+ return (!m_pattern.isEmpty() || !m_mimeTypes.isEmpty());
+}
+
+
bool KFileItemModelFilter::matches(const KFileItem& item) const
{
+ const bool hasPatternFilter = !m_pattern.isEmpty();
+ const bool hasMimeTypesFilter = !m_mimeTypes.isEmpty();
+
+ // If no filter is set, return true.
+ if (!hasPatternFilter && !hasMimeTypesFilter) {
+ return true;
+ }
+
+ // If both filters are set, return true when both filters are matched
+ if (hasPatternFilter && hasMimeTypesFilter) {
+ return (matchesPattern(item) && matchesType(item));
+ }
+
+ // If only one filter is set, return true when that filter is matched
+ if (hasPatternFilter) {
+ return matchesPattern(item);
+ }
+
+ return matchesType(item);
+}
+
+bool KFileItemModelFilter::matchesPattern(const KFileItem& item) const
+{
if (m_useRegExp) {
return m_regExp->exactMatch(item.text());
} else {
return item.text().toLower().contains(m_lowerCasePattern);
}
}
+
+bool KFileItemModelFilter::matchesType(const KFileItem& item) const
+{
+ foreach (const QString& mimeType, m_mimeTypes) {
+ if (item.mimetype() == mimeType) {
+ return true;
+ }
+ }
+
+ return m_mimeTypes.isEmpty();
+}
diff --git a/src/kitemviews/private/kfileitemmodelfilter.h b/src/kitemviews/private/kfileitemmodelfilter.h
index 9bdf1fd95..e4fb0a2ee 100644
--- a/src/kitemviews/private/kfileitemmodelfilter.h
+++ b/src/kitemviews/private/kfileitemmodelfilter.h
@@ -22,7 +22,7 @@
#define KFILEITEMMODELFILTER_H
#include <libdolphin_export.h>
-#include <QString>
+#include <QStringList>
class KFileItem;
class QRegExp;
@@ -52,18 +52,41 @@ public:
QString pattern() const;
/**
+ * Set the list of mimetypes that are used for comparison with the
+ * item in KFileItemModelFilter::matchesMimeType.
+ */
+ void setMimeTypes(const QStringList& types);
+ QStringList mimeTypes() const;
+
+ /**
+ * @return True if either the pattern or mimetype filters has been set.
+ */
+ bool hasSetFilters() const;
+
+ /**
* @return True if the item matches with the pattern defined by
- * KFileItemModelFilter::setPattern().
+ * @ref setPattern() or @ref setMimeTypes
*/
bool matches(const KFileItem& item) const;
private:
+ /**
+ * @return True if item matches pattern set by @ref setPattern.
+ */
+ bool matchesPattern(const KFileItem& item) const;
+
+ /**
+ * @return True if item matches mimetypes set by @ref setMimeTypes.
+ */
+ bool matchesType(const KFileItem& item) const;
+
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().
+ QString m_pattern; // Property set by setPattern().
+ QStringList m_mimeTypes; // Property set by setMimeTypes()
};
#endif
diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp
index 80504154f..20edd6110 100644
--- a/src/views/dolphinview.cpp
+++ b/src/views/dolphinview.cpp
@@ -510,6 +510,16 @@ QString DolphinView::nameFilter() const
return m_model->nameFilter();
}
+void DolphinView::setMimeTypeFilters(const QStringList& filters)
+{
+ return m_model->setMimeTypeFilters(filters);
+}
+
+QStringList DolphinView::mimeTypeFilters() const
+{
+ return m_model->mimeTypeFilters();
+}
+
QString DolphinView::statusBarText() const
{
QString summary;
diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h
index 10f63c57a..3f08c4480 100644
--- a/src/views/dolphinview.h
+++ b/src/views/dolphinview.h
@@ -238,6 +238,14 @@ public:
QString nameFilter() const;
/**
+ * Filters the currently shown items by \a filters. All items
+ * whose content-type matches those given by the list of filters
+ * will be shown.
+ */
+ void setMimeTypeFilters(const QStringList& filters);
+ QStringList mimeTypeFilters() const;
+
+ /**
* Returns a textual representation of the state of the current
* folder or selected items, suitable for use in the status bar.
*/