highlight bar
This commit is contained in:
parent
2cd6446d13
commit
7bb8aaec32
1 changed files with 36 additions and 4 deletions
40
src/lib.rs
40
src/lib.rs
|
|
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue