diff --git a/src/lib.rs b/src/lib.rs index 216e198..248e784 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,7 @@ use ratatui::backend::CrosstermBackend; use ratatui::layout::{Constraint, Direction, Layout}; use ratatui::prelude::{Color, Modifier, Style}; use ratatui::Terminal; -use ratatui::widgets::{Block, Borders, List, ListItem, Paragraph}; +use ratatui::widgets::{Block, Borders, List, ListItem, ListState, Paragraph}; use crate::config::Config; pub mod config; @@ -89,6 +89,12 @@ pub fn main(config: &Config, terminal: &mut Terminal>) let mut session = connect(config).ok(); let mut inbox = refresh_inbox(&mut session, config); let mut last_fetch = Instant::now(); + let mut list_state = ListState::default(); + if let Ok(emails) = &inbox { + if !emails.is_empty() { + list_state.select(Some(0)); + } + } // --- Main loop --- loop { @@ -120,9 +126,14 @@ pub fn main(config: &Config, terminal: &mut Terminal>) .borders(Borders::ALL), ) .style(Style::default().fg(Color::White)) - .highlight_style(Style::default().add_modifier(Modifier::BOLD)); + .highlight_style( + Style::default() + .bg(Color::DarkGray) + .add_modifier(Modifier::BOLD), + ) + .highlight_symbol(">> "); - frame.render_widget(list, layout[0]); + frame.render_stateful_widget(list, layout[0], &mut list_state); } Ok(_) => { let p = Paragraph::new("No messages in inbox.") @@ -138,7 +149,7 @@ pub fn main(config: &Config, terminal: &mut Terminal>) } } - let status = Paragraph::new(" 'q' quit | 'r' refresh") + let status = Paragraph::new(" 'q' quit | 'r' refresh | ↑/↓ navigate") .style(Style::default().fg(Color::DarkGray)); frame.render_widget(status, layout[1]); })?; @@ -151,6 +162,27 @@ pub fn main(config: &Config, terminal: &mut Terminal>) KeyCode::Char('r') => { inbox = refresh_inbox(&mut session, config); last_fetch = Instant::now(); + if let Ok(emails) = &inbox { + if !emails.is_empty() { + list_state.select(Some(0)); + } else { + list_state.select(None); + } + } + } + KeyCode::Down | KeyCode::Char('j') => { + if let Ok(emails) = &inbox { + let i = list_state.selected().map_or(0, |i| { + if i + 1 < emails.len() { i + 1 } else { i } + }); + list_state.select(Some(i)); + } + } + KeyCode::Up | KeyCode::Char('k') => { + if let Ok(_) = &inbox { + let i = list_state.selected().map_or(0, |i| i.saturating_sub(1)); + list_state.select(Some(i)); + } } _ => {} }