diff options
| author | Danilo M. <danix@danix.xyz> | 2026-08-13 10:42:56 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-08-13 10:42:56 +0200 |
| commit | 2d451e35e95a580d0e81c2e1bf7220d879490864 (patch) | |
| tree | 39e2a03c7757db4eacab5582dff94762c04e8126 /tests/test_threadlistmodel.cpp | |
| parent | c396853a9290314ab657ac4414a21f26dc1fa6d5 (diff) | |
| download | qtmaildir-2d451e35e95a580d0e81c2e1bf7220d879490864.tar.gz qtmaildir-2d451e35e95a580d0e81c2e1bf7220d879490864.zip | |
docs: record items 75-78 and design the rule builder
The standing backlog reconciliation found four unrecorded entries in the
user's notes, all fallout from item 44's rules dialog now that it is in
daily use: the window forgets its geometry and column widths (75), every
field is free text (76), a rule cannot be previewed against the thread
list (77), and there is no way to build a rule from something visible in
a message (78). Each cause is verified in the code rather than copied
from the note.
Item 76 then went through a brainstorming pass and has a design. The
shape is Thunderbird's filter window, which the user supplied as the
reference: field and operator dropdowns, +/- buttons per row, an all/any
radio, and a separate "but not" block.
The structural point is that Thunderbird owns its filter format and this
project does not. The storage is a notmuch query string shared with
mailctl and executed by the post-new hook, so the builder is a view over
a string rather than a store. That decides the rest: the stored format
is untouched and this stays a single-repo change; a query the builder
cannot represent still opens, saves and runs, in a text mode every rule
carries; and the string is rewritten only when the rows actually
changed, compared against the parsed value rather than tracked with a
dirty flag, which Qt sets during programmatic population.
Measured against the seventeen rules in the live store, sixteen are flat
and one nests an or group inside an and chain, which is what the
exclusion block exists for. The parser is strict by design: it
recognises a query whole or rejects it whole, because a lenient parser
that salvages what it understands is how a not clause gets dropped and a
filter silently widens.
Diffstat (limited to 'tests/test_threadlistmodel.cpp')
0 files changed, 0 insertions, 0 deletions
