From 2aacac82bec1dcf36169401ee88c94b5a33fe438 Mon Sep 17 00:00:00 2001 From: Shautvast Date: Tue, 17 Feb 2026 21:32:09 +0100 Subject: [PATCH] Preserve selection across inbox refresh by matching sequence number After refresh, find the previously selected email by its IMAP sequence number and keep the highlight on it. Falls back to the first email if the selected one was deleted. Co-Authored-By: Claude Opus 4.6 --- src/lib.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4b69de3..1fc1eb0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -106,16 +106,25 @@ pub fn main(config: &Config, terminal: &mut Terminal>) WorkerResult::Refreshed(Ok(inbox)) => { has_older = inbox.has_older(); oldest_seq = inbox.oldest_seq; + let prev_selected_seq = list_state.selected() + .and_then(|i| emails.get(i)) + .map(|e| e.seq); emails = inbox.emails; error = None; loading = false; if !emails.is_empty() { - list_state.select(Some(0)); - let seq = emails[0].seq; - preview_seq = Some(seq); - preview_body.clear(); - body_loading = true; - let _ = cmd_tx.send(WorkerCmd::FetchBody { seq }); + let new_idx = prev_selected_seq + .and_then(|seq| emails.iter().position(|e| e.seq == seq)) + .unwrap_or(0); + list_state.select(Some(new_idx)); + let seq = emails[new_idx].seq; + if preview_seq != Some(seq) { + preview_seq = Some(seq); + preview_body.clear(); + preview_scroll = 0; + body_loading = true; + let _ = cmd_tx.send(WorkerCmd::FetchBody { seq }); + } } else { list_state.select(None); preview_seq = None;