appcui 0.4.8

A feature-rich and cross-platform TUI/CUI framework for Rust, enabling modern terminal-based applications on Windows, Linux, and macOS. Includes built-in UI components like buttons, menus, list views, tree views, checkboxes, and more. Perfect for building fast and interactive CLI tools and text-based interfaces.
Documentation
use crate::{
    graphics::{CharAttribute, Surface},
    input::Key,
    prelude::TextFormat,
    system::MenuTheme,
    utils::Caption,
};

#[inline(always)]
pub(super) fn get_text_attr(enabled: bool, current_item: bool, color: &MenuTheme) -> CharAttribute {
    match () {
        _ if !enabled => color.text.inactive,
        _ if current_item => color.text.hovered,
        _ => color.text.normal,
    }
}
#[inline(always)]
pub(super) fn get_hotkey_attr(enabled: bool, current_item: bool, color: &MenuTheme) -> CharAttribute {
    match () {
        _ if !enabled => color.hotkey.inactive,
        _ if current_item => color.hotkey.hovered,
        _ => color.hotkey.normal,
    }
}
#[inline(always)]
pub(super) fn get_shortcut_attr(enabled: bool, current_item: bool, color: &MenuTheme) -> CharAttribute {
    match () {
        _ if !enabled => color.shortcut.inactive,
        _ if current_item => color.shortcut.hovered,
        _ => color.shortcut.normal,
    }
}
#[inline(always)]
pub(super) fn get_symbol_attr(enabled: bool, current_item: bool, color: &MenuTheme) -> CharAttribute {
    match () {
        _ if !enabled => color.symbol.inactive,
        _ if current_item => color.symbol.hovered,
        _ => color.symbol.normal,
    }
}

#[inline(always)]
pub(super) fn paint_shortcut(shortcut: Key, surface: &mut Surface, y: i32, width: u16, enabled: bool, current_item: bool, color: &MenuTheme) {
    let name = shortcut.code.name();
    let modifier_name = shortcut.modifier.name();
    let sz = name.len() + modifier_name.len();
    let attr = get_shortcut_attr(enabled, current_item, color);
    let x = (width as i32) - (sz as i32);
    if !modifier_name.is_empty() {
        surface.write_string(x, y, modifier_name, attr, false);
    }
    surface.write_string(x + (modifier_name.len() as i32), y, name, attr, false);
}

#[inline(always)]
pub(super) fn update_format_with_caption(caption: &Caption, format: &mut TextFormat, enabled: bool, current_item: bool, color: &MenuTheme) {
    format.set_hotkey_from_caption(get_hotkey_attr(enabled, current_item, color), caption);
    format.set_attribute(get_text_attr(enabled, current_item, color));
    format.set_chars_count(caption.chars_count() as u16);
}