lk-inside 0.3.1

A terminal user interface (TUI) application for interactive data analysis.
Documentation
//! Screen for loading data, providing a file browser interface.

use crate::AppScreen;
use crossterm::event::KeyCode;
use ratatui::{
    prelude::Frame, // Add Frame explicitly
    widgets::{Block, Borders, List, ListItem},
    style::{Style, Color},
    text::Span,
};
use crate::ui::components::file_browser::{FileBrowser, FileBrowserEvent}; // Add FileBrowserEvent
use crate::ui::theme; // ADD THIS LINE


/// Renders the load data screen, displaying the file browser.
///
/// # Arguments
///
/// * `f` - A mutable reference to the `Frame` to draw on.
/// * `file_browser` - A mutable reference to the `FileBrowser` component.
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); // REPLACED

    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)) // REPLACED
            } else {
                ListItem::new(Span::raw(format!("{} {}", theme::FILE_ICON, file_name))).style(Style::new().fg(Color::White)) // REPLACED
            }
        })
        .collect();

    let list_widget = List::new(items)
        .block(block)
        .highlight_style(theme::HIGHLIGHT_STYLE) // REPLACED
        .highlight_symbol(">> ");

    f.render_stateful_widget(list_widget, f.area(), &mut file_browser.state);
}

/// Handles user input for the load data screen.
///
/// This function processes key events to navigate the file browser,
/// select files, or return to the start menu.
///
/// # Arguments
///
/// * `key` - The `KeyCode` of the pressed key.
/// * `app_state` - A mutable reference to the global `AppState`.
///
/// # Returns
///
/// `Option<AppScreen>` if a screen transition is needed (e.g.,
/// `AppScreen::Loading` with a selected file path, or `AppScreen::StartMenu`),
/// `None` otherwise (if input was handled internally by the file browser).
pub fn handle_input(key: KeyCode, app_state: &mut crate::AppState) -> Option<AppScreen> { // Changed signature
    let file_browser = &mut app_state.file_browser; // Access file_browser here
    match key {
        KeyCode::Enter => {
            match file_browser.select_entry() { // Now returns FileBrowserEvent
                FileBrowserEvent::FileSelected(path) => {
                    app_state.status_message = format!("Loading data from {}...", path.display());
                    app_state.needs_redraw = true; // Redraw for status message
                    Some(AppScreen::Loading) // Signal main loop to change screen
                }
                FileBrowserEvent::DirectoryEntered | FileBrowserEvent::NavigationUp => {
                    app_state.status_message = format!("Current Directory: {}", file_browser.current_path.display());
                    app_state.needs_redraw = true; // Redraw to show new directory contents
                    None // Stay on LoadData screen
                }
                FileBrowserEvent::NoChange => {
                    app_state.status_message = file_browser.get_status_message(); // Display file browser's internal status
                    app_state.needs_redraw = true; // Redraw for status message
                    None
                }
            }
        }
        KeyCode::Esc => {
            app_state.status_message = "Returned to Start Menu.".to_string();
            app_state.needs_redraw = true; // Redraw for status message
            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; // Redraw for status message
                    Some(AppScreen::Loading)
                }
                FileBrowserEvent::DirectoryEntered | FileBrowserEvent::NavigationUp => {
                    app_state.status_message = format!("Current Directory: {}", file_browser.current_path.display());
                    app_state.needs_redraw = true; // Redraw to show new directory contents
                    None
                }
                FileBrowserEvent::NoChange => {
                    app_state.status_message = file_browser.get_status_message(); // Display file browser's internal status
                    app_state.needs_redraw = true; // Redraw for status message
                    None
                }
            }
        }
    }
}