diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,7 +63,7 @@ find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED DBus Network Test Widgets WebEngine WebEngineWidgets Xml) set(LIBGRAVATAR_VERSION_LIB "5.6.40") -set(MAILCOMMON_LIB_VERSION_LIB "5.6.40") +set(MAILCOMMON_LIB_VERSION_LIB "5.6.41") set(KDEPIM_APPS_LIB_VERSION_LIB "5.6.40") set(MESSAGELIB_LIB_VERSION_LIB "5.6.41") set(LIBKLEO_LIB_VERSION_LIB "5.6.40") diff --git a/agents/mailfilteragent/filtermanager.h b/agents/mailfilteragent/filtermanager.h --- a/agents/mailfilteragent/filtermanager.h +++ b/agents/mailfilteragent/filtermanager.h @@ -44,7 +44,8 @@ Outbound = 0x2, Explicit = 0x4, BeforeOutbound = 0x8, - All = Inbound | BeforeOutbound | Outbound | Explicit + AllFolders = 0x16, + All = Inbound | BeforeOutbound | Outbound | Explicit | AllFolders }; enum FilterRequires { @@ -124,6 +125,8 @@ void mailCollectionRemoved(const Akonadi::Collection &collection); void agentRemoved(const QString &identifier); + bool hasAllFoldersFilter() const; + #ifndef NDEBUG /** * Outputs all filter rules to console. Used for debugging. diff --git a/agents/mailfilteragent/filtermanager.cpp b/agents/mailfilteragent/filtermanager.cpp --- a/agents/mailfilteragent/filtermanager.cpp +++ b/agents/mailfilteragent/filtermanager.cpp @@ -84,6 +84,7 @@ SearchRule::RequiredPart mRequiredPartsBasedOnAll; QPixmap pixmapNotification; bool mInboundFiltersExist; + bool mAllFoldersFiltersExist; int mTotalProgressCount; int mCurrentProgressCount; }; @@ -345,8 +346,17 @@ } } // check if at least one filter is to be applied on inbound mail - d->mInboundFiltersExist = std::find_if(d->mFilters.constBegin(), d->mFilters.constEnd(), - std::mem_fn(&MailCommon::MailFilter::applyOnInbound)) != d->mFilters.constEnd(); + + for (auto i = d->mFilters.cbegin(), e = d->mFilters.cend(); + i != e && (!d->mInboundFiltersExist || !d->mAllFoldersFiltersExist); + ++i) { + if ((*i)->applyOnInbound()) { + d->mInboundFiltersExist = true; + } + if ((*i)->applyOnAllFoldersInbound()) { + d->mAllFoldersFiltersExist = true; + } + } Q_EMIT filterListUpdated(); } @@ -512,9 +522,10 @@ const bool outboundOk = ((set & Outbound) && (*it)->applyOnOutbound()); const bool beforeOutboundOk = ((set & BeforeOutbound) && (*it)->applyBeforeOutbound()); const bool explicitOk = ((set & Explicit) && (*it)->applyOnExplicit()); + const bool allFoldersOk = ((set & AllFolders) && (*it)->applyOnAllFoldersInbound()); const bool accountOk = (!account || (account && (*it)->applyOnAccount(accountId))); - if ((inboundOk && accountOk) || outboundOk || beforeOutboundOk || explicitOk) { + if ((inboundOk && accountOk) || (allFoldersOk && accountOk) || outboundOk || beforeOutboundOk || explicitOk) { // filter is applicable if (d->isMatching(context.item(), *it)) { @@ -633,4 +644,9 @@ SLOT(itemsFetchJobForFilterDone(KJob *))); } +bool FilterManager::hasAllFoldersFilter() const +{ + return d->mAllFoldersFiltersExist; +} + #include "moc_filtermanager.cpp" diff --git a/agents/mailfilteragent/mailfilteragent.h b/agents/mailfilteragent/mailfilteragent.h --- a/agents/mailfilteragent/mailfilteragent.h +++ b/agents/mailfilteragent/mailfilteragent.h @@ -80,6 +80,8 @@ void configure(WId windowId) override; private: + bool isFilterableCollection(const Akonadi::Collection &collection) const; + FilterManager *m_filterManager; FilterLogDialog *m_filterLogDialog; diff --git a/agents/mailfilteragent/mailfilteragent.cpp b/agents/mailfilteragent/mailfilteragent.cpp --- a/agents/mailfilteragent/mailfilteragent.cpp +++ b/agents/mailfilteragent/mailfilteragent.cpp @@ -54,9 +54,13 @@ #include -static bool isFilterableCollection(const Akonadi::Collection &collection) +bool MailFilterAgent::isFilterableCollection(const Akonadi::Collection &collection) const { - return MailCommon::Kernel::folderIsInbox(collection); + if (!collection.contentMimeTypes().contains(KMime::Message::mimeType())) { + return false; + } + + return m_filterManager->hasAllFoldersFilter() || MailCommon::Kernel::folderIsInbox(collection); //TODO: check got filter attribute here } @@ -148,9 +152,12 @@ { m_filterManager->readConfig(); - Akonadi::CollectionFetchJob *job = new Akonadi::CollectionFetchJob(Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive, this); - job->fetchScope().setContentMimeTypes(QStringList() << KMime::Message::mimeType()); - connect(job, &Akonadi::CollectionFetchJob::result, this, &MailFilterAgent::initialCollectionFetchingDone); + Akonadi::CollectionFetchJob *job = new Akonadi::CollectionFetchJob(Akonadi::Collection::root(), + Akonadi::CollectionFetchJob::Recursive, + this); + job->fetchScope().setContentMimeTypes({ KMime::Message::mimeType() }); + connect(job, &Akonadi::CollectionFetchJob::result, + this, &MailFilterAgent::initialCollectionFetchingDone); } void MailFilterAgent::initialCollectionFetchingDone(KJob *job) @@ -160,23 +167,20 @@ return; //TODO: proper error handling } - Akonadi::CollectionFetchJob *fetchJob = qobject_cast(job); + const auto fetchJob = qobject_cast(job); - const QMap pop3ResourceMap = MailCommon::Kernel::pop3ResourceTargetCollection(); + const auto pop3ResourceMap = MailCommon::Kernel::pop3ResourceTargetCollection(); - const Akonadi::Collection::List lstCols = fetchJob->collections(); + const auto lstCols = fetchJob->collections(); for (const Akonadi::Collection &collection : lstCols) { if (isFilterableCollection(collection)) { changeRecorder()->setCollectionMonitored(collection, true); } else { - QMap::const_iterator i = pop3ResourceMap.constBegin(); - const QMap::const_iterator end = pop3ResourceMap.constEnd(); - while (i != end) { - if (collection.id() == i.value()) { + for (auto pop3ColId : pop3ResourceMap) { + if (collection.id() == pop3ColId) { changeRecorder()->setCollectionMonitored(collection, true); break; } - ++i; } } }