summaryrefslogtreecommitdiffstats
path: root/src/mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainwindow.cpp')
-rw-r--r--src/mainwindow.cpp83
1 files changed, 56 insertions, 27 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index be6cfdb..824bdca 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -1385,40 +1385,73 @@ void MainWindow::onAllTagsReady(const QStringList &tags)
m_queryCompleter->setTags(tags);
}
-namespace {
+QList<MainWindow::PlaceholderLine> MainWindow::placeholderLines() const
+{
+ // One list of (query, label-maker) pairs rather than two arrays indexed in
+ // parallel. The parallel version is what the fixed array was, and its
+ // hazard is that inserting an entry in one and not the other prints a real
+ // number against the wrong name, which reads as a plausible pane.
+ //
+ // The queries are wire format and deliberately untranslated: `tag:` is
+ // notmuch syntax, not user-facing prose. Only the labels are translated.
+ QList<PlaceholderLine> lines = {
+ { QStringLiteral("tag:unread"),
+ [this](int n) { return tr("%n unread", "", n); } },
+ { QStringLiteral("tag:flagged"),
+ [this](int n) { return tr("%n flagged", "", n); } },
+ { QStringLiteral("tag:inbox"),
+ [this](int n) { return tr("%n in inbox", "", n); } },
+ };
-/// The queries behind the placeholder's helper lines, in render order.
-///
-/// Wire format, deliberately untranslated: `tag:` is notmuch syntax, not user
-/// -facing prose. Only the labels beside them are translated.
-const std::array<const char *, 3> kPlaceholderQueries = {
- "tag:unread",
- "tag:flagged",
- "tag:inbox",
-};
+ // Sent and drafts are composed from the account folders, not from a tag.
+ // `tag:draft` counts 0 against a real database and no draft-ish tag exists
+ // in it, so a tag-based line would be a permanent zero.
+ //
+ // Omitted entirely when no account configures the folder, rather than
+ // shown as 0: item 63 established that a missing sent folder is a real
+ // configuration, and "0 sent" claims the user has sent nothing.
+ const QString sent = m_config.allSentQuery();
+ if (!sent.isEmpty()) {
+ lines.append({ sent, [this](int n) { return tr("%n sent", "", n); } });
+ }
-} // namespace
+ const QString drafts = m_config.allDraftsQuery();
+ if (!drafts.isEmpty()) {
+ lines.append({ drafts,
+ [this](int n) { return tr("%n draft(s)", "", n); } });
+ }
+
+ return lines;
+}
+
+QStringList MainWindow::placeholderQueries() const
+{
+ QStringList queries;
+ for (const PlaceholderLine &line : placeholderLines())
+ queries.append(line.query);
+ return queries;
+}
QList<HtmlBuilder::PlaceholderHelper> MainWindow::placeholderHelpers() const
{
QList<HtmlBuilder::PlaceholderHelper> helpers;
- // Empty until the first reply lands. Rendering three zeroes meanwhile
- // would be worse than rendering nothing: a zero is a claim.
- if (m_placeholderCounts.size() == int(kPlaceholderQueries.size())) {
- const QStringList labels = {
- tr("%n unread", "", m_placeholderCounts.at(0)),
- tr("%n flagged", "", m_placeholderCounts.at(1)),
- tr("%n in inbox", "", m_placeholderCounts.at(2)),
- };
+ const QList<PlaceholderLine> lines = placeholderLines();
- for (int i = 0; i < labels.size(); ++i) {
+ // Empty until the first reply lands. Rendering zeroes meanwhile would be
+ // worse than rendering nothing: a zero is a claim.
+ //
+ // The size check is also what keeps the pairing honest across a config
+ // that changed shape between the request and the reply: counts that do not
+ // match the current line list are not this list's answers.
+ if (m_placeholderCounts.size() == lines.size()) {
+ for (int i = 0; i < lines.size(); ++i) {
// A query notmuch could not count yields -1; skip that line rather
// than print a negative number at the user.
if (m_placeholderCounts.at(i) < 0)
continue;
- helpers.append({ labels.at(i),
- QString::fromLatin1(kPlaceholderQueries[i]) });
+ helpers.append({ lines.at(i).label(m_placeholderCounts.at(i)),
+ lines.at(i).query });
}
}
@@ -1438,12 +1471,8 @@ void MainWindow::showPlaceholderPane()
{
m_messageView->showPlaceholder(placeholderHelpers());
- QStringList queries;
- for (const char *query : kPlaceholderQueries)
- queries.append(QString::fromLatin1(query));
-
QMetaObject::invokeMethod(m_worker, "requestCounts", Qt::QueuedConnection,
- Q_ARG(QStringList, queries),
+ Q_ARG(QStringList, placeholderQueries()),
Q_ARG(quint64, ++m_countsGeneration));
}