v2rmp 0.3.6

A powerful Terminal User Interface (TUI) for route optimization using the Chinese Postman Problem algorithm
Documentation
use crate::app::App;
use ratatui::{
    layout::{Constraint, Direction, Layout, Rect},
    style::{Color, Style},
    text::{Line, Span},
    widgets::{Block, Borders, List, ListItem, Paragraph},
    Frame,
};

pub fn render(f: &mut Frame, app: &App) {
    let chunks = Layout::default()
        .direction(Direction::Vertical)
        .constraints([Constraint::Min(3), Constraint::Length(10)])
        .split(f.area());

    let title = Block::default()
        .borders(Borders::ALL)
        .title(format!(" {} ", module_name()));

    let content = Paragraph::new("Module under construction").block(title);

    f.render_widget(content, chunks[0]);

    render_logs(f, app, chunks[1]);
}

fn module_name() -> &'static str {
    env!("CARGO_PKG_NAME")
}

fn render_logs(f: &mut Frame, app: &App, area: Rect) {
    let logs: Vec<ListItem> = app
        .log_entries
        .iter()
        .rev()
        .take(area.height as usize - 2)
        .rev()
        .map(|entry| {
            let style = match entry.level {
                crate::app::LogLevel::Info => Style::default().fg(Color::Cyan),
                crate::app::LogLevel::Success => Style::default().fg(Color::Green),
                crate::app::LogLevel::Warn => Style::default().fg(Color::Yellow),
                crate::app::LogLevel::Error => Style::default().fg(Color::Red),
            };
            ListItem::new(Line::from(vec![
                Span::styled(
                    format!("[{}] ", entry.timestamp),
                    Style::default().fg(Color::DarkGray),
                ),
                Span::styled(&entry.message, style),
            ]))
        })
        .collect();

    let logs_widget = List::new(logs).block(Block::default().borders(Borders::ALL).title(" Logs "));

    f.render_widget(logs_widget, area);
}