aboutsummaryrefslogtreecommitdiffstats
path: root/src/cardlayout.h
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-11 10:56:40 +0200
committerDanilo M. <danix@danix.xyz>2026-08-11 10:56:40 +0200
commit00c029a819eca601e9ac58e5c236d667505ac566 (patch)
tree52513f0f57129b95e1533863f82be00f5eff404b /src/cardlayout.h
parenta8844303aeb9295a6f94408cd809e521483a8b9a (diff)
downloadqtmaildir-00c029a819eca601e9ac58e5c236d667505ac566.tar.gz
qtmaildir-00c029a819eca601e9ac58e5c236d667505ac566.zip
feat(config): let the date format on a card be configured
Adds [general] date_format, a QDateTime pattern for the date a thread card shows. Absent or empty means the system locale's short format, which is what every other application on the desktop uses and stays the default. The format reaches the LAYOUT, not only the painter. CardLayout::compute() reserves the date's width from widestDateSample(), so a pattern that arrived only at the drawText call would be elided into a rect sized for the old format, which is the clipping the bold-font fault already produced once. It rides on CardLayout::Input and defaults to an empty string, leaving every existing call site unchanged. Confirmed by mutation: making the width ignore the format fails the test. widestDateSample() memoised its result in a static, which would have sized every format after the first from whichever arrived first. It is a plain call now, costing one QLocale lookup per row, the same as formatting the date. Validation rejects only a pattern whose output is CONSTANT, found by formatting two different instants and comparing. QDateTime::toString() treats nearly every letter as a field, so "banana" formats as "bpmnpmnpm" and "hello" as "22ello": nonsense, but they vary with the instant, and a check claiming to find "no date field" cannot reject them. What harms the user is the pattern that prints the same text on every card, and that is what is refused, with the value named in the message. The model supplies the pattern through DateFormatRole for the same reason it supplies the tag colours: it is the one object here holding config, and a delegate reading config itself would be a second source of truth. Backlog item 62.
Diffstat (limited to 'src/cardlayout.h')
-rw-r--r--src/cardlayout.h18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/cardlayout.h b/src/cardlayout.h
index ef6a563..1a2fd18 100644
--- a/src/cardlayout.h
+++ b/src/cardlayout.h
@@ -46,6 +46,16 @@ struct CardLayout
bool isMessage = false;
int depth = 0; ///< 0 for a thread root, 1 for a direct reply.
int replyCount = 0; ///< 0 means no expander.
+
+ /// A QDateTime::toString() pattern from [general] date_format, or empty
+ /// for the system's short format.
+ ///
+ /// It lives on the INPUT rather than being read where the date is
+ /// drawn, because the width reserved for the date is computed from the
+ /// same format inside compute(). A pattern reaching the painter but not
+ /// the geometry is exactly how a longer date gets elided into a rect
+ /// sized for a shorter one.
+ QString dateFormat;
};
/// Width of the account accent bar down a thread card's left edge.
@@ -129,10 +139,14 @@ struct CardLayout
/// drawn into it come from one place: a locale whose short format is
/// longer than the reserved rect would clip, which is exactly the fault
/// bold text produced.
- static QString formatDate(const QDateTime &date);
+ /// `format` is a QDateTime::toString() pattern, or empty for the system's
+ /// short format. Config validates it, so an unusable pattern never gets
+ /// this far.
+ static QString formatDate(const QDateTime &date,
+ const QString &format = QString());
/// The widest string formatDate() can return, for reserving space.
- static QString widestDateSample();
+ static QString widestDateSample(const QString &format = QString());
/// The expander's label: the reply count with its glyph, as drawn.
///