aboutsummaryrefslogtreecommitdiffstats
path: root/src/types.h
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-20 18:25:31 +0200
committerDanilo M. <danix@danix.xyz>2026-08-20 18:25:31 +0200
commit8fc28de18f903e4bc9d9777589edc819ed9ea996 (patch)
tree4d831ef75a8966c3138fe4634de3a9781f15e758 /src/types.h
parent2baf2d4e2c1d8d059a0795bf46596c64c28e01e5 (diff)
downloadqtmaildir-8fc28de18f903e4bc9d9777589edc819ed9ea996.tar.gz
qtmaildir-8fc28de18f903e4bc9d9777589edc819ed9ea996.zip
feat(config): send_command and the [compose] section, item 123
An account's ability to send IS its send_command's presence. Not a separate receive_only key: with one key there is nothing to keep in step and nothing to contradict, and a receive-only account is expressed by omission, which is how one real account here is meant to work. Startup validation follows the startup_query pattern, and is deliberately asymmetric. A default_account that cannot send is warned about, because the user named an account and expects mail to come from it. An installation where NO account can send is not: that is a valid read-only installation, and warning about it would train the user to ignore warnings. Every [compose] key reads through value(key, default) rather than testing contains(), because send_delay_ms = 0 is a real setting meaning 'send at once' that a zero-test would mistake for unset. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015muoUo2GdxmBDSp5vjYcbE
Diffstat (limited to 'src/types.h')
-rw-r--r--src/types.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/types.h b/src/types.h
index f4d387a..0c6532e 100644
--- a/src/types.h
+++ b/src/types.h
@@ -239,6 +239,47 @@ struct DatabaseStats
int tags = -1; ///< Distinct tag names in the database.
};
+/// What opens a composer. Built by MainWindow, consumed by ComposeWindow.
+///
+/// Built from the DATABASE, never from the model. The model's data comes from
+/// the query, so a row whose state has not been re-queried carries stale
+/// values, and a reply built from a stale row would carry the wrong
+/// recipients. This is the same rule Restore already follows.
+struct ComposeContext
+{
+ enum class Kind { New, Reply, ReplyAll, Forward };
+
+ QString accountKey; ///< Which account sends. Resolved by ComposeContext's rules.
+ Kind kind = Kind::New;
+ QString originalPath; ///< The .eml being replied to or forwarded. Empty for New.
+ QString inReplyTo; ///< Message-ID of the original.
+ QStringList references; ///< The original's References plus its Message-ID.
+ QStringList to; ///< Pre-filled, the user's own addresses already stripped.
+ QStringList cc;
+ QString subject; ///< Re:/Fwd: prefixed, an existing prefix not doubled.
+ QString quotedBody; ///< The >-prefixed original. Empty when the action does not quote.
+ bool seedHtml = false; ///< Did the original carry a text/html part.
+ QStringList attachments; ///< Carried forward for Forward, empty otherwise.
+};
+
+/// What the composer produces, consumed by MessageBuilder.
+///
+/// In-Reply-To and References are NOT optional. Without them a reply appears
+/// as an orphan thread in the sender's own client.
+struct OutgoingMessage
+{
+ QString accountKey;
+ QStringList to;
+ QStringList cc;
+ QStringList bcc;
+ QString subject;
+ QString markdownBody; ///< The source text, exactly as typed.
+ bool sendHtml = false; ///< The composer's per-message toggle.
+ QStringList attachments; ///< Local paths, read at build time.
+ QString inReplyTo;
+ QStringList references;
+};
+
Q_DECLARE_METATYPE(ThreadSummary)
Q_DECLARE_METATYPE(MessageRef)
Q_DECLARE_METATYPE(MessageNode)