mtui 0.6.0

An extensive Modbus client (TCP, RTU & mock) for your terminal.
Documentation
use crate::config::Keybinds;
use crate::state::{SweepConfigParams, SweepField};
use crate::tui::hints::{self, Hint};
use crate::tui::theme::Theme;
use ratatui::layout::Rect;
use ratatui::text::{Line, Span};
use ratatui::Frame;

pub(super) fn draw(
    frame: &mut Frame,
    area: Rect,
    theme: &Theme,
    kb: &Keybinds,
    params: &SweepConfigParams,
    running: bool,
) {
    let sel = params.current_field();

    let field = |label: &str, value: String, selected: bool| -> Line<'static> {
        let marker = if selected { "> " } else { "  " };
        let style = if selected {
            theme.selected_style()
        } else {
            theme.base()
        };
        Line::from(vec![
            Span::styled(format!("{marker}{label:<14}"), theme.dim_style()),
            Span::styled(value, style),
        ])
    };

    let from_val = if sel == SweepField::From {
        format!("{}_", params.from)
    } else {
        params.from.to_string()
    };
    let to_val = if sel == SweepField::To {
        format!("{}_", params.to)
    } else {
        params.to.to_string()
    };
    let mode = if params.continuous { "loop" } else { "once" };
    let mode_val = if sel == SweepField::Mode {
        format!("\u{2039} {mode} \u{203a}")
    } else {
        mode.to_string()
    };

    let action_sel = sel == SweepField::Action;
    let action_label = if running { "Stop sweep" } else { "Start sweep" };
    let action_text = if action_sel {
        format!("{action_label}  \u{2190} enter")
    } else {
        action_label.to_string()
    };
    let action_style = if action_sel {
        theme.selected_style()
    } else if running {
        theme.warn_style()
    } else {
        theme.ok_style()
    };
    let action_line = Line::from(Span::styled(
        format!("{}{action_text}", if action_sel { "> " } else { "  " }),
        action_style,
    ));

    let lines = vec![
        Line::default(),
        field("From address", from_val, sel == SweepField::From),
        field("To address", to_val, sel == SweepField::To),
        field("Mode", mode_val, sel == SweepField::Mode),
        Line::default(),
        action_line,
        Line::default(),
        hints::footer(
            theme,
            [
                Hint::pair(kb.move_up, kb.move_down, "Field"),
                Hint::key(kb.pause, "Toggle mode"),
            ],
        ),
        hints::footer(
            theme,
            [
                Hint::key(kb.action, "Start/Stop"),
                Hint::key(kb.exit, "Close"),
            ],
        ),
    ];

    super::render(frame, area, theme, "Sweep", 46, lines);
}