aboutsummaryrefslogtreecommitdiffstats
path: root/CHANGELOG.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-08 11:36:06 +0200
committerDanilo M. <danix@danix.xyz>2026-08-10 08:23:42 +0200
commitdbca3a604470dbd500f02325dd6a0501ca008ec3 (patch)
treea68d06b64a682b635d341449a9eb55fb1b1d5152 /CHANGELOG.md
parent7c3648676e188344dabb24e084f91b2b47e87633 (diff)
downloadqtmaildir-dbca3a604470dbd500f02325dd6a0501ca008ec3.tar.gz
qtmaildir-dbca3a604470dbd500f02325dd6a0501ca008ec3.zip
docs: record message rows, and the user's verdict on them
CLAUDE.md described a QTableView over a table model, which has not been true since the view port. Updated with the traps the port produced, each of which shipped a plausible-looking broken build before being caught: - A tree numbers rows per parent, so nothing may be keyed on a row NUMBER. - drawBranches runs before the row's cells, so an expander on a content column is painted over by the delegate's background. - setRootIsDecorated(false) removes the style's HIT AREA along with its indicator, leaving a glyph that renders and does nothing. - isExpanded and setExpanded are keyed on column 0. - A reply's indent must beat the account chip's width, and visualRect reports the indent correctly even when nothing is visibly indented. - paintEvent runs after the cells, so a full-row fill erases their text. Also the notmuch ownership rule, which is a double-free if undone: messages reached through a thread are freed with it, so walkReplies holds them raw against this file's own RAII convention. Item 20 is marked built, not done, and item 53 records why. The user's verdict on the finished result was that the table view does not fit the use, said with every cue in and working. That is a design finding rather than a defect: the item shipped exactly what its four decisions specified, and all four were the user's own choices. Recording it as a defect would misattribute the cause; recording nothing would leave the next session building on a rejected design. Item 53 carries the cause verified in code rather than guessed. A message row fills the same five columns as a thread row (threadlistmodel.cpp:275-283 mirroring :428-431), so replies land on the same rigid column boundaries as the threads around them, and the eye reads columns before indentation or tint. The reference the user gave has no column rules through its reply rows at all, and that absence is the one thing three added cues cannot supply.
Diffstat (limited to 'CHANGELOG.md')
-rw-r--r--CHANGELOG.md13
1 files changed, 13 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fdbb08f..1444c3a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -62,6 +62,19 @@ if you leave it alone:
### Added
+- **Threads expand in the list to show their replies.** A thread with more than
+ one message carries an expander; opening it lists the replies as indented rows
+ beneath it, marked with a thread line, a tinted background and smaller text.
+ The replies are fetched when you expand, not with the query, so a large result
+ still paints immediately.
+- **Selecting a reply opens that message on its own**, rather than the whole
+ conversation, which is the point of having message rows at all.
+- **Actions follow what you selected, and the status bar says what they will
+ touch.** A thread row acts on the whole thread and reports "1 thread selected
+ (7 messages)" before and "(whole thread)" after; a reply row acts on that one
+ message. Both are undoable. There is no confirmation dialog, deliberately:
+ undo is this application's answer to a mistaken action, and naming the scope
+ is what makes it usable.
- **A sync now fetches only the accounts you have edited.** Tagging mail in one
account and syncing no longer pulls every other account as well. A sync with
nothing outstanding is a plain fetch and still covers everything, since