nm-wifi 0.3.0

A Terminal User Interface for managing Wi-Fi connections on Linux
Documentation
use ratatui::{
    Frame,
    layout::Rect,
    style::{Modifier, Style},
    text::{Line, Span},
    widgets::{Block, Borders, List, ListItem, ListState},
};

use super::format::{
    create_signal_graph,
    format_signal_strength,
    format_ssid_column,
    get_frequency_band,
};
use crate::{app_state::App, theme::CatppuccinColors, wifi::WifiNetwork};

pub fn create_network_list_item<'a>(network: &WifiNetwork) -> ListItem<'a> {
    let signal_graph = create_signal_graph(network.signal_strength);
    let signal_percent = format_signal_strength(network.signal_strength);
    let frequency_band = get_frequency_band(network.frequency);
    let security_icon = if network.is_secured() { "🔒" } else { "  " };
    let connection_icon = if network.connected { "🔗" } else { "  " };

    let signal_color = match network.signal_strength {
        80..=100 => CatppuccinColors::GREEN,
        60..=79 => CatppuccinColors::YELLOW,
        40..=59 => CatppuccinColors::PEACH,
        _ => CatppuccinColors::RED,
    };
    let ssid_color = if network.connected {
        CatppuccinColors::GREEN
    } else {
        CatppuccinColors::TEXT
    };

    ListItem::new(Line::from(vec![
        Span::styled(
            connection_icon.to_string(),
            Style::default().fg(CatppuccinColors::GREEN),
        ),
        Span::styled(
            format!("{} ", security_icon),
            Style::default().fg(CatppuccinColors::MAUVE),
        ),
        Span::styled(
            format_ssid_column(&network.ssid, 24),
            Style::default().fg(ssid_color),
        ),
        Span::styled(
            format!("{:>4} ", frequency_band),
            Style::default().fg(CatppuccinColors::SAPPHIRE),
        ),
        Span::styled(
            format!("{:>4} ", signal_percent),
            Style::default().fg(signal_color),
        ),
        Span::styled(signal_graph, Style::default().fg(signal_color)),
    ]))
}

pub(crate) fn render_network_list_background(
    f: &mut Frame,
    app: &App,
    area: Rect,
    title: Option<Line<'static>>,
) {
    let items: Vec<ListItem> =
        app.networks.iter().map(create_network_list_item).collect();

    let mut block =
        Block::default().style(Style::default().bg(CatppuccinColors::BASE));
    if let Some(title) = title {
        block = block.title(title);
    }
    block = block.borders(Borders::ALL);

    let list = List::new(items)
        .block(block)
        .highlight_style(
            Style::default()
                .bg(CatppuccinColors::SURFACE0)
                .fg(CatppuccinColors::TEXT)
                .add_modifier(Modifier::BOLD),
        )
        .highlight_symbol("â–º ");

    let mut list_state = ListState::default();
    if !app.networks.is_empty() {
        list_state.select(Some(app.selected_index.min(app.networks.len() - 1)));
    }

    f.render_stateful_widget(list, area, &mut list_state);
}