use std::io::{self, stdout};
use crossterm::{
event::{read, Event, KeyCode},
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
ExecutableCommand,
};
use ratatui::{
prelude::*,
widgets::{Block, BorderType, Borders},
};
use fpicker::{FileExplorer, Theme};
fn main() -> io::Result<()> {
enable_raw_mode()?;
stdout().execute(EnterAlternateScreen)?;
let mut terminal = Terminal::new(CrosstermBackend::new(stdout()))?;
let mut dark_theme = false;
let mut file_explorer = FileExplorer::with_theme(get_light_theme())?;
loop {
terminal.draw(|f| {
f.render_widget(&file_explorer.widget(), f.area());
})?;
let event = read()?;
if let Event::Key(key) = event {
if key.modifiers == crossterm::event::KeyModifiers::CONTROL {
match key.code {
KeyCode::Char('s') => {
dark_theme = !dark_theme;
if dark_theme {
file_explorer.set_theme(get_dark_theme());
} else {
file_explorer.set_theme(get_light_theme());
}
}
KeyCode::Char('q') => {
break;
}
_ => {}
}
}
}
file_explorer.handle(&event)?;
}
disable_raw_mode()?;
stdout().execute(LeaveAlternateScreen)?;
Ok(())
}
fn get_light_theme() -> Theme {
Theme::new()
.with_block(
Block::default()
.borders(Borders::ALL)
.border_type(BorderType::Rounded)
.style(Style::default().fg(Color::Black).bg(Color::White)),
)
.with_item_style(Style::default().fg(Color::Yellow))
.with_dir_style(
Style::default()
.fg(Color::Cyan)
.add_modifier(Modifier::BOLD),
)
.with_highlight_symbol("> ")
.add_default_title()
.with_title_top(|_| Line::from(" ☀ Theme ").right_aligned())
.with_title_bottom(|_| " ^q Quit | ^s Switch theme ".into())
}
fn get_dark_theme() -> Theme {
Theme::new()
.with_block(
Block::default()
.borders(Borders::ALL)
.border_type(BorderType::Rounded)
.style(Style::default().fg(Color::White).bg(Color::Black)),
)
.with_item_style(Style::default().fg(Color::Yellow))
.with_dir_style(
Style::default()
.fg(Color::Cyan)
.add_modifier(Modifier::BOLD),
)
.with_highlight_symbol("> ")
.add_default_title()
.with_title_top(|_| Line::from(" ☾ Theme ").right_aligned())
.with_title_bottom(|_| " ^q Quit | ^s Switch theme ".into())
}