]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Hide application/x-trash files following showHidenFiles
authorMéven Car <meven@kde.org>
Thu, 15 Jun 2023 10:32:00 +0000 (12:32 +0200)
committerMéven Car <meven.car@kdemail.net>
Sat, 17 Jun 2023 07:09:50 +0000 (07:09 +0000)
BUG: 3212

src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/kitemviews/private/kfileitemmodelfilter.cpp
src/kitemviews/private/kfileitemmodelfilter.h

index 5ac6f9be1f45aab5521cbcc280e31c8fd5af37c4..629332703685f561b75dd18261fcf95ab19f5570 100644 (file)
@@ -105,6 +105,8 @@ KFileItemModel::KFileItemModel(QObject *parent)
     connect(m_resortAllItemsTimer, &QTimer::timeout, this, &KFileItemModel::resortAllItems);
 
     connect(GeneralSettings::self(), &GeneralSettings::sortingChoiceChanged, this, &KFileItemModel::slotSortingChoiceChanged);
+
+    setShowTrashMime(m_dirLister->showHiddenFiles());
 }
 
 KFileItemModel::~KFileItemModel()
@@ -238,6 +240,27 @@ bool KFileItemModel::sortHiddenLast() const
     return m_sortHiddenLast;
 }
 
+void KFileItemModel::setShowTrashMime(bool show)
+{
+    const auto trashMime = QStringLiteral("application/x-trash");
+    QStringList excludeFilter = m_filter.excludeMimeTypes();
+    bool wasShown = !excludeFilter.contains(trashMime);
+
+    if (show) {
+        if (!wasShown) {
+            excludeFilter.removeAll(trashMime);
+        }
+    } else {
+        if (wasShown) {
+            excludeFilter.append(trashMime);
+        }
+    }
+
+    if (wasShown != show) {
+        setExcludeMimeTypeFilter(excludeFilter);
+    }
+}
+
 void KFileItemModel::setShowHiddenFiles(bool show)
 {
 #if KIO_VERSION < QT_VERSION_CHECK(5, 100, 0)
@@ -245,6 +268,7 @@ void KFileItemModel::setShowHiddenFiles(bool show)
 #else
     m_dirLister->setShowHiddenFiles(show);
 #endif
+    setShowTrashMime(show);
     m_dirLister->emitChanges();
     if (show) {
         dispatchPendingItemsToInsert();
@@ -740,6 +764,20 @@ QStringList KFileItemModel::mimeTypeFilters() const
     return m_filter.mimeTypes();
 }
 
+void KFileItemModel::setExcludeMimeTypeFilter(const QStringList &filters)
+{
+    if (m_filter.excludeMimeTypes() != filters) {
+        dispatchPendingItemsToInsert();
+        m_filter.setExcludeMimeTypes(filters);
+        applyFilters();
+    }
+}
+
+QStringList KFileItemModel::excludeMimeTypeFilter() const
+{
+    return m_filter.excludeMimeTypes();
+}
+
 void KFileItemModel::applyFilters()
 {
     // ===STEP 1===
@@ -1823,7 +1861,7 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem &item,
     }
 
     if (m_requestRole[IsHiddenRole]) {
-        data.insert(sharedValue("isHidden"), item.isHidden());
+        data.insert(sharedValue("isHidden"), item.isHidden() || item.mimetype() == QStringLiteral("application/x-trash"));
     }
 
     if (m_requestRole[NameRole]) {
index 721569a0cc6fe40686502575e383606a92f76afd..3c2721d8ffec9129113846299b93e6c5ffa37e97 100644 (file)
@@ -182,6 +182,9 @@ public:
     void setMimeTypeFilters(const QStringList &filters);
     QStringList mimeTypeFilters() const;
 
+    void setExcludeMimeTypeFilter(const QStringList &filters);
+    QStringList excludeMimeTypeFilter() const;
+
     struct RoleInfo {
         QByteArray role;
         QString translation;
@@ -199,6 +202,9 @@ public:
      */
     static QList<RoleInfo> rolesInformation();
 
+    /** set to true to hide application/x-trash files */
+    void setShowTrashMime(bool show);
+
 Q_SIGNALS:
     /**
      * Is emitted if the loading of a directory has been started. It is
index f199c314fabf752b61e80e20db5b29def3e5480c..0f953080179d1ff7ce7ad88baaa0336e546b0e36 100644 (file)
@@ -8,6 +8,8 @@
 
 #include <QRegularExpression>
 
+#include <algorithm>
+
 #include <KFileItem>
 
 KFileItemModelFilter::KFileItemModelFilter()
@@ -56,15 +58,25 @@ QStringList KFileItemModelFilter::mimeTypes() const
     return m_mimeTypes;
 }
 
+void KFileItemModelFilter::setExcludeMimeTypes(const QStringList &types)
+{
+    m_excludeMimeTypes = types;
+}
+
+QStringList KFileItemModelFilter::excludeMimeTypes() const
+{
+    return m_excludeMimeTypes;
+}
+
 bool KFileItemModelFilter::hasSetFilters() const
 {
-    return (!m_pattern.isEmpty() || !m_mimeTypes.isEmpty());
+    return (!m_pattern.isEmpty() || !m_mimeTypes.isEmpty() || !m_excludeMimeTypes.isEmpty());
 }
 
 bool KFileItemModelFilter::matches(const KFileItem &item) const
 {
     const bool hasPatternFilter = !m_pattern.isEmpty();
-    const bool hasMimeTypesFilter = !m_mimeTypes.isEmpty();
+    const bool hasMimeTypesFilter = !m_mimeTypes.isEmpty() || !m_excludeMimeTypes.isEmpty();
 
     // If no filter is set, return true.
     if (!hasPatternFilter && !hasMimeTypesFilter) {
@@ -95,10 +107,18 @@ bool KFileItemModelFilter::matchesPattern(const KFileItem &item) const
 
 bool KFileItemModelFilter::matchesType(const KFileItem &item) const
 {
-    for (const QString &mimeType : qAsConst(m_mimeTypes)) {
-        if (item.mimetype() == mimeType) {
-            return true;
-        }
+    bool excluded = std::any_of(m_excludeMimeTypes.constBegin(), m_excludeMimeTypes.constEnd(), [item](const QString &excludeMimetype) {
+        return item.mimetype() == excludeMimetype;
+    });
+    if (excluded) {
+        return false;
+    }
+
+    bool included = std::any_of(m_mimeTypes.constBegin(), m_mimeTypes.constEnd(), [item](const QString &mimeType) {
+        return item.mimetype() == mimeType;
+    });
+    if (included) {
+        return true;
     }
 
     return m_mimeTypes.isEmpty();
index 959590da8dabdc22a97f0b27b62b601ea0c0b2aa..ce6cbeebbb3549f524d5941af443d2bdf7a82c8b 100644 (file)
@@ -44,6 +44,13 @@ public:
     void setMimeTypes(const QStringList &types);
     QStringList mimeTypes() const;
 
+    /**
+     * Set the list of mimetypes that are used for comparison and excluded with the
+     * item in KFileItemModelFilter::matchesMimeType.
+     */
+    void setExcludeMimeTypes(const QStringList &types);
+    QStringList excludeMimeTypes() const;
+
     /**
      * @return True if either the pattern or mimetype filters has been set.
      */
@@ -73,5 +80,6 @@ private:
                                 // faster comparison in matches().
     QString m_pattern; // Property set by setPattern().
     QStringList m_mimeTypes; // Property set by setMimeTypes()
+    QStringList m_excludeMimeTypes; // Property set by setExcludeMimeTypes()
 };
 #endif