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 <noreply@anthropic.com>
This commit is contained in:
Shautvast 2026-02-17 21:32:09 +01:00
parent 174a1b1030
commit 2aacac82be

View file

@ -106,16 +106,25 @@ pub fn main(config: &Config, terminal: &mut Terminal<CrosstermBackend<Stdout>>)
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;
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;