diff options
| author | Danilo M. <danix@danix.xyz> | 2026-10-31 11:41:08 +0100 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-10-31 11:41:08 +0100 |
| commit | 8804a75ae561a7e504fdce8aea58d3ddc8670b71 (patch) | |
| tree | 85125d2ba1e1880f3439e7d3462247351c46ff1d /src | |
| parent | 8078e8180920984de475db796a2725bb2f470dd8 (diff) | |
| download | qtmaildir-8804a75ae561a7e504fdce8aea58d3ddc8670b71.tar.gz qtmaildir-8804a75ae561a7e504fdce8aea58d3ddc8670b71.zip | |
feat: build the query for what a tag change would move
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/searchterm.cpp | 21 | ||||
| -rw-r--r-- | src/searchterm.h | 14 |
2 files changed, 35 insertions, 0 deletions
diff --git a/src/searchterm.cpp b/src/searchterm.cpp index 16936df..06d03be 100644 --- a/src/searchterm.cpp +++ b/src/searchterm.cpp @@ -18,6 +18,8 @@ #include "searchterm.h" +#include "config.h" + #include <algorithm> namespace SearchTerm { @@ -108,4 +110,23 @@ QString exclude(const QString &existing, const QString &addition) return QStringLiteral("(%1) AND NOT (%2)").arg(left, right); } +QString changes(const QString &query, const QStringList &add, + const QStringList &remove) +{ + QStringList terms; + for (const QString &name : add) { + const QString term = tag(name); + if (!term.isEmpty()) + terms.append(QStringLiteral("not ") + term); + } + for (const QString &name : remove) { + const QString term = tag(name); + if (!term.isEmpty()) + terms.append(term); + } + if (query.trimmed().isEmpty() || terms.isEmpty()) + return Config::matchNothingQuery(); + return extend(query, terms.join(QStringLiteral(" or "))); +} + } // namespace SearchTerm diff --git a/src/searchterm.h b/src/searchterm.h index 8ca67e4..dd43e99 100644 --- a/src/searchterm.h +++ b/src/searchterm.h @@ -111,6 +111,20 @@ QString extend(const QString &existing, const QString &addition); /// An empty `addition` leaves `existing` untouched. QString exclude(const QString &existing, const QString &addition); +/// The messages among `query` that `+add -remove` would actually change: +/// `(query) AND (not tag:a1 or ... or tag:r1 ...)`. +/// +/// Used to count and to write a rule applied to existing mail (item 212), so +/// the number in the confirmation is the number of messages touched, not the +/// number matched. Built on extend(), so a disjunction in the rule cannot +/// escape the scope. +/// +/// **Never empty.** An empty query or an empty change yields +/// Config::matchNothingQuery(), because notmuch reads an empty query as +/// "match everything" and this string is written to. +QString changes(const QString &query, const QStringList &add, + const QStringList &remove); + } // namespace SearchTerm /// One entry a context menu can offer: a finished query and the text naming it. |
