highlight bar

This commit is contained in:
Shautvast 2026-02-17 20:11:54 +01:00
parent 2cd6446d13
commit 7bb8aaec32

View file

@ -7,7 +7,7 @@ use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout}; use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::prelude::{Color, Modifier, Style}; use ratatui::prelude::{Color, Modifier, Style};
use ratatui::Terminal; use ratatui::Terminal;
use ratatui::widgets::{Block, Borders, List, ListItem, Paragraph}; use ratatui::widgets::{Block, Borders, List, ListItem, ListState, Paragraph};
use crate::config::Config; use crate::config::Config;
pub mod config; pub mod config;
@ -89,6 +89,12 @@ pub fn main(config: &Config, terminal: &mut Terminal<CrosstermBackend<Stdout>>)
let mut session = connect(config).ok(); let mut session = connect(config).ok();
let mut inbox = refresh_inbox(&mut session, config); let mut inbox = refresh_inbox(&mut session, config);
let mut last_fetch = Instant::now(); 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 --- // --- Main loop ---
loop { loop {
@ -120,9 +126,14 @@ pub fn main(config: &Config, terminal: &mut Terminal<CrosstermBackend<Stdout>>)
.borders(Borders::ALL), .borders(Borders::ALL),
) )
.style(Style::default().fg(Color::White)) .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(_) => { Ok(_) => {
let p = Paragraph::new("No messages in inbox.") let p = Paragraph::new("No messages in inbox.")
@ -138,7 +149,7 @@ pub fn main(config: &Config, terminal: &mut Terminal<CrosstermBackend<Stdout>>)
} }
} }
let status = Paragraph::new(" 'q' quit | 'r' refresh") let status = Paragraph::new(" 'q' quit | 'r' refresh | ↑/↓ navigate")
.style(Style::default().fg(Color::DarkGray)); .style(Style::default().fg(Color::DarkGray));
frame.render_widget(status, layout[1]); frame.render_widget(status, layout[1]);
})?; })?;
@ -151,6 +162,27 @@ pub fn main(config: &Config, terminal: &mut Terminal<CrosstermBackend<Stdout>>)
KeyCode::Char('r') => { KeyCode::Char('r') => {
inbox = refresh_inbox(&mut session, config); inbox = refresh_inbox(&mut session, config);
last_fetch = Instant::now(); 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));
}
} }
_ => {} _ => {}
} }