use crate::AppScreen;
use crossterm::event::KeyCode;
use ratatui::{
prelude::Frame, widgets::{Block, Borders, List, ListItem},
style::{Style, Color},
text::Span,
};
use crate::ui::components::file_browser::{FileBrowser, FileBrowserEvent}; use crate::ui::theme;
pub fn render_load_data_screen(f: &mut Frame, file_browser: &mut FileBrowser) {
let title = format!("Current Directory: {}", file_browser.current_path.display());
let block = Block::default().borders(Borders::ALL).title(title).border_style(theme::BORDER_STYLE);
let items: Vec<ListItem> = file_browser
.entries
.iter()
.map(|path| {
let file_name = path
.file_name()
.map_or("".into(), |name| name.to_string_lossy());
if path.is_dir() {
ListItem::new(Span::raw(format!("{} {}", theme::FOLDER_ICON, file_name))).style(Style::new().fg(Color::Blue)) } else {
ListItem::new(Span::raw(format!("{} {}", theme::FILE_ICON, file_name))).style(Style::new().fg(Color::White)) }
})
.collect();
let list_widget = List::new(items)
.block(block)
.highlight_style(theme::HIGHLIGHT_STYLE) .highlight_symbol(">> ");
f.render_stateful_widget(list_widget, f.area(), &mut file_browser.state);
}
pub fn handle_input(key: KeyCode, app_state: &mut crate::AppState) -> Option<AppScreen> { let file_browser = &mut app_state.file_browser; match key {
KeyCode::Enter => {
match file_browser.select_entry() { FileBrowserEvent::FileSelected(path) => {
app_state.status_message = format!("Loading data from {}...", path.display());
app_state.needs_redraw = true; Some(AppScreen::Loading) }
FileBrowserEvent::DirectoryEntered | FileBrowserEvent::NavigationUp => {
app_state.status_message = format!("Current Directory: {}", file_browser.current_path.display());
app_state.needs_redraw = true; None }
FileBrowserEvent::NoChange => {
app_state.status_message = file_browser.get_status_message(); app_state.needs_redraw = true; None
}
}
}
KeyCode::Esc => {
app_state.status_message = "Returned to Start Menu.".to_string();
app_state.needs_redraw = true; Some(AppScreen::StartMenu)
}
_ => {
let file_browser_event = file_browser.handle_key(key);
match file_browser_event {
FileBrowserEvent::FileSelected(path) => {
app_state.status_message = format!("Loading data from {}...", path.display());
app_state.needs_redraw = true; Some(AppScreen::Loading)
}
FileBrowserEvent::DirectoryEntered | FileBrowserEvent::NavigationUp => {
app_state.status_message = format!("Current Directory: {}", file_browser.current_path.display());
app_state.needs_redraw = true; None
}
FileBrowserEvent::NoChange => {
app_state.status_message = file_browser.get_status_message(); app_state.needs_redraw = true; None
}
}
}
}
}