v2rmp 0.4.5

rmpca — Route Optimization TUI & Agent Engine
Documentation
use ratatui::Frame;

use crate::app::App;

pub fn draw(f: &mut Frame, app: &App, area: ratatui::layout::Rect) {
    let inner = super::draw_panel(f, "Optimize Route", area);

    let cyan = ratatui::style::Color::Cyan;
    let yellow = ratatui::style::Color::Yellow;
    let gray = ratatui::style::Color::DarkGray;
    let green = ratatui::style::Color::Green;

    let cache_display = match &app.cache_file {
        Some(p) => {
            ratatui::text::Span::styled(p.clone(), ratatui::style::Style::default().fg(green))
        }
        None => ratatui::text::Span::styled(
            "(not set)".to_string(),
            ratatui::style::Style::default().fg(yellow),
        ),
    };

    let route_display = match &app.route_file {
        Some(p) => {
            ratatui::text::Span::styled(p.clone(), ratatui::style::Style::default().fg(green))
        }
        None => ratatui::text::Span::styled(
            "(not set)".to_string(),
            ratatui::style::Style::default().fg(gray),
        ),
    };

    let depot_display = match &app.depot_coords {
        Some((lat, lon)) => ratatui::text::Span::styled(
            format!("{:.4},{:.4}", lat, lon),
            ratatui::style::Style::default().fg(green),
        ),
        None => ratatui::text::Span::styled(
            "(not set)".to_string(),
            ratatui::style::Style::default().fg(gray),
        ),
    };

    let status_text = format!("Status: {}", app.optimize_status);
    let status_color = app.optimize_status.color();

    let lines = vec![
        ratatui::text::Line::from(ratatui::text::Span::styled(
            "Optimize Route",
            ratatui::style::Style::default()
                .fg(cyan)
                .add_modifier(ratatui::style::Modifier::BOLD),
        )),
        ratatui::text::Line::from(""),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Cache File:  "),
            cache_display,
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Route File:  "),
            route_display,
        ]),
        ratatui::text::Line::from(""),
        ratatui::text::Line::from(ratatui::text::Span::styled(
            status_text,
            ratatui::style::Style::default().fg(status_color),
        )),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Left Turn Penalty:  "),
            ratatui::text::Span::styled(
                app.turn_penalties.left.to_string(),
                ratatui::style::Style::default().fg(yellow),
            ),
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Right Turn Penalty: "),
            ratatui::text::Span::styled(
                app.turn_penalties.right.to_string(),
                ratatui::style::Style::default().fg(yellow),
            ),
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("U-Turn Penalty:     "),
            ratatui::text::Span::styled(
                app.turn_penalties.u_turn.to_string(),
                ratatui::style::Style::default().fg(yellow),
            ),
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Depot Coordinates:  "),
            depot_display,
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Number of Vehicles: "),
            ratatui::text::Span::styled(
                app.num_vehicles.to_string(),
                ratatui::style::Style::default().fg(yellow),
            ),
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Solver Algorithm:   "),
            ratatui::text::Span::styled(
                app.solver_id.clone(),
                ratatui::style::Style::default().fg(yellow),
            ),
        ]),
        ratatui::text::Line::from(""),
        ratatui::text::Line::from(ratatui::text::Span::raw(
            "────────────────────────────────────",
        )),
        ratatui::text::Line::from(""),
        ratatui::text::Line::from(ratatui::text::Span::styled(
            "Controls:",
            ratatui::style::Style::default().fg(cyan),
        )),
        ratatui::text::Line::from("  [C]  Set cached map file"),
        ratatui::text::Line::from("  [r]  Set route input file"),
        ratatui::text::Line::from("  [V]  Set number of vehicles"),
        ratatui::text::Line::from("  [S]  Set solver ID"),
        ratatui::text::Line::from("  [L]  Set left turn penalty"),
        ratatui::text::Line::from("  [R]  Set right turn penalty"),
        ratatui::text::Line::from("  [U]  Set U-turn penalty"),
        ratatui::text::Line::from("  [D]  Set depot coordinates"),
        ratatui::text::Line::from("  [Enter] Start optimization"),
        ratatui::text::Line::from("  [Esc] Return to home"),
    ];

    let paragraph = ratatui::widgets::Paragraph::new(lines);
    f.render_widget(paragraph, inner);

    super::draw_input_prompt(f, app, area);
}