diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 5ac6f9be1f..6293327036 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -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 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]) { diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index 721569a0cc..3c2721d8ff 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -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 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 diff --git a/src/kitemviews/private/kfileitemmodelfilter.cpp b/src/kitemviews/private/kfileitemmodelfilter.cpp index f199c314fa..0f95308017 100644 --- a/src/kitemviews/private/kfileitemmodelfilter.cpp +++ b/src/kitemviews/private/kfileitemmodelfilter.cpp @@ -8,6 +8,8 @@ #include +#include + #include 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(); diff --git a/src/kitemviews/private/kfileitemmodelfilter.h b/src/kitemviews/private/kfileitemmodelfilter.h index 959590da8d..ce6cbeebbb 100644 --- a/src/kitemviews/private/kfileitemmodelfilter.h +++ b/src/kitemviews/private/kfileitemmodelfilter.h @@ -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