diff options
| author | Danilo M. <danix@danix.xyz> | 2026-08-22 11:19:22 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-08-22 12:00:32 +0200 |
| commit | a9d1cf73a91b5eef79a9722ec9921c97b9ec5c81 (patch) | |
| tree | 91f45693edc9098dfd9c35d17eedd1ff8ab7066e /translations/qtmaildir_it_IT.ts | |
| parent | 141bc9b98213b9c4ba9f3bcba041c3e3108c12a3 (diff) | |
| download | qtmaildir-compose-and-send.tar.gz qtmaildir-compose-and-send.zip | |
feat(compose): wire the composer into the main window, item 123compose-and-send
The reply family is disabled on mail that arrived at an account with no
send_command, behind a ribbon in MessageView naming the account and the key
to add. save_message is deliberately never disabled: it is the escape hatch
for exactly that case.
The ribbon is a WIDGET in the pane's layout, never markup inside the web
view. Composing HTML from configuration into the one document that renders
input from strangers is the wrong direction, and the header row is already a
widget for the same reason.
Compose itself is disabled only when NO account can send, and that state is
not warned about at startup: an installation with no send_command anywhere
is a valid read-only installation.
Every reply resolves through messageScopeFor(), not threadFor(): a thread
row means the one message its card shows. Replying to a thread is
meaningless; a reply answers a message. The context is built from the
DATABASE rather than the model, the rule Restore already follows, because a
row whose state has not been re-queried carries stale values and a reply
built from one would carry the wrong recipients.
The mail root crosses from the worker as its own signal. There was no route
for it at all: mailRootOf() is file-static in notmuchworker.cpp, and item
124 records that composing a destination from database.path writes into the
Xapian tree under a split index. The test uses NotmuchFixture::splitIndex(),
the only layout where the two accessors disagree.
A thread row's path is RELATIVE to the mail root while a message row's is
absolute, so the account lookup matched nothing and the reply family was
dead on mail from an account that could send. Found by the positive guard
test rather than the negative one, which passed throughout for the wrong
reason.
The quit path checks the failed-save case FIRST. In the ordinary case
nothing is lost by saving; there, saving is what is already not working, so
the dialog says plainly that quitting loses that text rather than offering a
save that will fail again. Both dialogs name the composers, and the ordinary
one asks once whatever the count, because three modals in a row is worse
than a coarse answer. Its wording says drafts already saved stay in the
folder, so Discard cannot read as 'delete my three messages'.
The Save loop holds QPointers, not raw pointers. A deleteLater() posted
while a nested exec() runs IS processed by that nested loop, measured in a
standalone program: the guard nulls before the modal returns. Closing a
composer while the quit dialog is up therefore freed a window the loop then
called saveDraftNow() on, crashing at the exact moment the application
promised to preserve that text.
A compose request that matches nothing clears itself and says so. It was
cleared only on a match, so a message deleted between selection and Reply
left the request armed for the session: Reply did nothing, and the next
ordinary click on that message opened a composer nobody asked for while the
pane stayed blank.
Forward carries the original's attachments, which the context has always had
a field for and nothing ever filled, and seeds its HTML toggle from
[compose] send_html. Only Reply seeds that from the original.
save_message keeps its filename inside the chosen directory and no longer
overwrites a file already there. The check was correct and untested: the
test asserted through Attachment's helpers rather than through the function
production calls, so deleting the containment check outright left it green.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TvwDptMWxjqhbCmjxwcSZ2
Diffstat (limited to 'translations/qtmaildir_it_IT.ts')
| -rw-r--r-- | translations/qtmaildir_it_IT.ts | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/translations/qtmaildir_it_IT.ts b/translations/qtmaildir_it_IT.ts index b2d96eb..f8a2b03 100644 --- a/translations/qtmaildir_it_IT.ts +++ b/translations/qtmaildir_it_IT.ts @@ -571,6 +571,68 @@ Il messaggio È stato inviato. Non inviarlo di nuovo.</translation> <translation>Segna conversazione come &spam</translation> </message> <message> + <source>A draft could not be saved</source> + <translation>Impossibile salvare una bozza</translation> + </message> + <message numerus="yes"> + <source>%n message(s) could not be saved to the drafts folder. Quitting now loses that text.</source> + <translation> + <numerusform>Impossibile salvare %n messaggio nella cartella delle bozze. Uscendo ora quel testo va perso.</numerusform> + <numerusform>Impossibile salvare %n messaggi nella cartella delle bozze. Uscendo ora quel testo va perso.</numerusform> + </translation> + </message> + <message> + <source>Messages still being composed</source> + <translation>Messaggi ancora in composizione</translation> + </message> + <message numerus="yes"> + <source>%n message(s) are still being composed. Drafts already saved stay in the drafts folder either way.</source> + <translation> + <numerusform>%n messaggio è ancora in composizione. Le bozze già salvate restano comunque nella cartella delle bozze.</numerusform> + <numerusform>%n messaggi sono ancora in composizione. Le bozze già salvate restano comunque nella cartella delle bozze.</numerusform> + </translation> + </message> + <message> + <source>No account is configured to send mail</source> + <translation>Nessun account configurato per inviare posta</translation> + </message> + <message> + <source>No message is selected</source> + <translation>Nessun messaggio selezionato</translation> + </message> + <message> + <source>That message could not be read</source> + <translation>Impossibile leggere quel messaggio</translation> + </message> + <message> + <source>That message arrived at an account that cannot send</source> + <translation>Quel messaggio è arrivato a un account che non può inviare</translation> + </message> + <message> + <source>The Maildir root is not known yet</source> + <translation>La radice della Maildir non è ancora nota</translation> + </message> + <message> + <source>That message's file could not be found</source> + <translation>Impossibile trovare il file di quel messaggio</translation> + </message> + <message> + <source>Save message to</source> + <translation>Salva il messaggio in</translation> + </message> + <message> + <source>Refusing to write outside %1</source> + <translation>Rifiuto di scrivere fuori da %1</translation> + </message> + <message> + <source>Could not write %1</source> + <translation>Impossibile scrivere %1</translation> + </message> + <message> + <source>Saved %1</source> + <translation>Salvato %1</translation> + </message> + <message> <source>&Restore from trash</source> <translation>&Ripristina dal cestino</translation> </message> @@ -1362,6 +1424,10 @@ Il messaggio È stato inviato. Non inviarlo di nuovo.</translation> <translation>Salvato %1</translation> </message> <message> + <source>This account is receive-only. Add send_command to [account.%1] to send from it.</source> + <translation>Questo account è di sola ricezione. Aggiungi send_command a [account.%1] per inviare da esso.</translation> + </message> + <message> <source>No message in this thread has an HTML part</source> <translation>Nessun messaggio di questa conversazione ha una parte HTML</translation> </message> |
