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:
parent
174a1b1030
commit
2aacac82be
1 changed files with 15 additions and 6 deletions
13
src/lib.rs
13
src/lib.rs
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue