]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Implemented the new KParts' listing filter extension, KParts::ListingFilterExtension.
authorDawit Alemayehu <adawit@kde.org>
Mon, 3 Sep 2012 21:53:03 +0000 (17:53 -0400)
committerDawit Alemayehu <adawit@kde.org>
Wed, 5 Sep 2012 15:25:37 +0000 (11:25 -0400)
REVIEW: 106289

src/dolphinpart.cpp
src/dolphinpart.h
src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/kitemviews/private/kfileitemmodelfilter.cpp
src/kitemviews/private/kfileitemmodelfilter.h
src/views/dolphinview.cpp
src/views/dolphinview.h

index fff7dc0e08b7e74f7039dd698527abc017cb7a9b..bf3d2a54f9718c2a4e7e2c0c1a206c0167a62b26 100644 (file)
@@ -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"
index e5693b363744a06937dc065a0d1165fafc30972b..f9c0bbf62a89047063195428f71fc50404447096 100644 (file)
@@ -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 */
index 6936af4311da9bd657d78aeab658de721307dcb1..752bc9365f39a0e8036f8501dce77c63d39c9869 100644 (file)
@@ -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;
index d9bebdf02f1eec85ae55c7ea91735ece318a862d..958fa104bb3ef91bd69c096ebb41fc1dd9bc9db4 100644 (file)
@@ -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;
@@ -388,6 +391,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.
index 816d35634f95e6fed457427fefab115f15a78600..2e320f2d9b0fc7ee77b28c17528046f4732b7b4b 100644 (file)
@@ -23,6 +23,7 @@
 #include <KFileItem>
 #include <QRegExp>
 
+
 KFileItemModelFilter::KFileItemModelFilter() :
     m_useRegExp(false),
     m_regExp(0),
@@ -61,7 +62,46 @@ 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());
@@ -69,3 +109,14 @@ bool KFileItemModelFilter::matches(const KFileItem& item) const
         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();
+}
index 9bdf1fd9533a18520cca28925ed61297027420cd..e4fb0a2ee54568ac983b8930865a2b249e7bb1f2 100644 (file)
@@ -22,7 +22,7 @@
 #define KFILEITEMMODELFILTER_H
 
 #include <libdolphin_export.h>
-#include <QString>
+#include <QStringList>
 
 class KFileItem;
 class QRegExp;
@@ -51,19 +51,42 @@ public:
     void setPattern(const QString& pattern);
     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
 
index f2b0a5c8c39173d2120b0329b168828f7564984e..08e26c5d67408db91472218549e83c78a83d18de 100644 (file)
@@ -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;
index 10f63c57afdc64cd1903fdeff74c3ff634286067..3f08c448007fa342ad0c1fdb8447915e27202f73 100644 (file)
@@ -237,6 +237,14 @@ public:
     void setNameFilter(const QString& nameFilter);
     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.