42 lines
1.5 KiB
Rust
42 lines
1.5 KiB
Rust
use crate::theme::ResolvedTheme;
|
|
use ratatui::text::{Line, Span};
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub enum ChoiceKind {
|
|
Checkbox,
|
|
Radio,
|
|
}
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub struct ChoiceVisualState {
|
|
pub selected: bool,
|
|
pub focused: bool,
|
|
pub enabled: bool,
|
|
}
|
|
pub fn render_choice_line<'a>(
|
|
label: &'a str,
|
|
kind: ChoiceKind,
|
|
state: ChoiceVisualState,
|
|
theme: &'a ResolvedTheme,
|
|
) -> Line<'a> {
|
|
let item = match (state.selected, state.focused, state.enabled) {
|
|
(_, true, false) => &theme.choices.focused_disabled,
|
|
(true, false, false) => &theme.choices.selected_disabled,
|
|
(false, false, false) => &theme.choices.disabled,
|
|
(true, true, true) => &theme.choices.focused_selected,
|
|
(true, false, true) => &theme.choices.selected,
|
|
(false, true, true) => &theme.choices.focused,
|
|
(false, false, true) => &theme.choices.normal,
|
|
};
|
|
let marker = match (kind, state.selected) {
|
|
(ChoiceKind::Checkbox, false) => theme.markers.checkbox_unselected,
|
|
(ChoiceKind::Checkbox, true) => theme.markers.checkbox_selected,
|
|
(ChoiceKind::Radio, false) => theme.markers.radio_unselected,
|
|
(ChoiceKind::Radio, true) => theme.markers.radio_selected,
|
|
};
|
|
Line::from(vec![
|
|
Span::styled(item.prefix, item.label),
|
|
Span::styled(marker, item.marker),
|
|
Span::raw(" "),
|
|
Span::styled(label, item.label),
|
|
Span::styled(item.suffix, item.label),
|
|
])
|
|
}
|