edlearn_tui 0.2.0

A TUI for Edinburgh Uni's Learn
use ratatui::{prelude::Rect, style::Stylize, text::Line, widgets::Paragraph, Frame};

use crate::{
    event::Event,
    main_screen::{panes::Pane, Action},
    store::{DownloadState, Store},
};

#[derive(Debug, Default)]
pub struct DownloadsViewer {}

impl Pane for DownloadsViewer {
    fn draw(&mut self, store: &Store, frame: &mut Frame, area: Rect) {
        let lines = store
            .download_queue()
            .flat_map(|(req, state)| {
                vec![
                    vec![
                        req.orig_filename.to_string().blue(),
                        match &state {
                            DownloadState::Queued => " - Queued".gray(),
                            DownloadState::InProgress(p) => format!(" - {:.2}%", p * 100.0).blue(),
                            DownloadState::Completed => " - Completed".green(),
                            DownloadState::Errored(e) => format!(" - {e}").red(),
                        },
                    ]
                    .into(),
                    vec![req.dest.to_string().gray()].into(),
                ]
            })
            .collect::<Vec<Line>>();

        let p = if lines.is_empty() {
            Paragraph::new("No downloads started.")
        } else {
            Paragraph::new(lines)
        };

        frame.render_widget(p, area);
    }

    fn handle_event(&mut self, _: &mut Store, _: Event) -> Action {
        Action::None
    }
}