mtui 0.9.1

An extensive Modbus client for your terminal.
Documentation
use crate::config::Keybinds;
use crate::state::{SweepConfigParams, SweepField};
use crate::tui::draw_state::{edit_value, field_row, marker};
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| field_row(theme, label, 13, value, selected);

    let from_val = edit_value(params.from.to_string(), sel == SweepField::From, false);
    let to_val = edit_value(params.to.to_string(), sel == SweepField::To, false);
    let mode = if params.continuous { "loop" } else { "once" };
    let mode_val = edit_value(mode.to_string(), sel == SweepField::Mode, true);

    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}", marker(action_sel)),
        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);
}