diff options
| author | Danilo M. <danix@danix.xyz> | 2026-08-24 11:02:08 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-08-24 11:02:08 +0200 |
| commit | dd6f35b8f35f231ebf1511daef3dd707eaa9839d (patch) | |
| tree | 2013df8d9541164bef2339aeee2ab507d976a615 /src | |
| parent | f814bb57c03e01c96ec97c2bfb2d314210a95f28 (diff) | |
| download | qtmaildir-dd6f35b8f35f231ebf1511daef3dd707eaa9839d.tar.gz qtmaildir-dd6f35b8f35f231ebf1511daef3dd707eaa9839d.zip | |
fix(compose): default to quoting below, and focus the body on a reply
The previous commit fixed the cursor within each quote_position branch and
the user still saw the old layout, because the branches were already right:
what was wrong was the DEFAULT. quote_position shipped as `above`, and the
layout asked for is exactly what `below` already produced, a blank line at
the top with the quote underneath.
So the default flips, along with the fallback for a malformed value and the
warning naming it. Nothing needs an Upgrading note: compose has not been
released, so no config in the wild sets this.
Focus goes to the body whenever To: is already filled, which a Reply and a
Forward always are. The form's first widget took it otherwise, so the user
had to click into the editor before typing. A New message keeps the default,
since an empty To: is genuinely the first thing to fill in.
The focus test asserts on the window's focusWidget() rather than on
QWidget::hasFocus(): an unshown window is never active, so hasFocus() reads
false whatever the code does and would fail against a correct fix. Both
directions are mutation-checked, since focusing unconditionally passes the
reply case while breaking the new-message one.
Diffstat (limited to 'src')
| -rw-r--r-- | src/composewindow.cpp | 8 | ||||
| -rw-r--r-- | src/config.cpp | 4 | ||||
| -rw-r--r-- | src/config.h | 5 |
3 files changed, 14 insertions, 3 deletions
diff --git a/src/composewindow.cpp b/src/composewindow.cpp index 59eaccc..1c9b492 100644 --- a/src/composewindow.cpp +++ b/src/composewindow.cpp @@ -143,6 +143,14 @@ ComposeWindow::ComposeWindow(const ComposeContext &context, // as the flag cleared, since markDirty() started it. m_dirty = false; m_autosaveTimer->stop(); + + // The body, whenever there is already a recipient: a Reply or a Forward + // has To: filled in from the context, so the first widget in the form + // would take focus and the user would have to click into the editor + // before typing. A New message keeps the default, since To: is empty and + // is genuinely the first thing to fill in. + if (!m_to->text().trimmed().isEmpty()) + m_body->setFocus(); } diff --git a/src/config.cpp b/src/config.cpp index c6bedd2..b148102 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -531,7 +531,7 @@ void Config::load(const QString &path) // other enum-ish key in this file (sync_on_exit, language, date_format) // rather than being the one silent exception. const QString quotePosition = - settings.value(QStringLiteral("quote_position"), QStringLiteral("above")) + settings.value(QStringLiteral("quote_position"), QStringLiteral("below")) .toString().trimmed(); if (quotePosition.compare(QStringLiteral("above"), Qt::CaseInsensitive) == 0) { m_compose.quotePosition = ComposeSettings::QuotePosition::Above; @@ -539,7 +539,7 @@ void Config::load(const QString &path) m_compose.quotePosition = ComposeSettings::QuotePosition::Below; } else { addProblem(tr("[compose] quote_position '%1' is not recognised; " - "expected above or below. Using above.") + "expected above or below. Using below.") .arg(quotePosition)); } diff --git a/src/config.h b/src/config.h index 51fc1ee..3ddd76a 100644 --- a/src/config.h +++ b/src/config.h @@ -212,7 +212,10 @@ struct ComposeSettings /// reply_no_quote does not). enum class QuotePosition { Above, Below }; - QuotePosition quotePosition = QuotePosition::Above; + /// Below by default: the reply is typed at the top and the quote sits + /// under it, which is what the user asked for and what every mail client + /// they compare against does. Above is bottom-posting and stays available. + QuotePosition quotePosition = QuotePosition::Below; /// Seeds the per-message toggle for New and Forward only. Reply and /// Reply-all seed from whether the original carried a text/html part, |
