concord 2.4.7

A terminal user interface client for Discord
Documentation
use super::*;

pub(in crate::tui::ui) fn render_poll_vote_picker(
    frame: &mut Frame,
    area: Rect,
    state: &DashboardState,
) {
    if !state.is_active_modal_popup(ActiveModalPopupKind::PollVotePicker) {
        return;
    }

    let Some(answers) = state.poll_vote_picker_items() else {
        return;
    };
    if answers.is_empty() {
        return;
    }

    let selected = state.selected_poll_vote_picker_index().unwrap_or(0);
    let popup = poll_vote_picker_popup_area(area, answers.len());
    render_modal_paragraph(
        frame,
        popup,
        "Choose poll votes",
        poll_vote_picker_lines(answers, selected),
    );
}

pub(in crate::tui::ui) fn poll_vote_picker_popup_area(area: Rect, answer_count: usize) -> Rect {
    centered_rect(area, 58, (answer_count as u16).saturating_add(2))
}

pub(in crate::tui::ui) fn poll_vote_picker_lines(
    answers: &[PollVotePickerItem],
    selected: usize,
) -> Vec<Line<'static>> {
    answers
        .iter()
        .enumerate()
        .map(|(index, answer)| {
            let selected = index == selected;
            let shortcut = shortcut_prefix(crate::tui::keybindings::KeyBindings::indexed_shortcut(
                index,
            ));
            let checkbox = if answer.selected { "[x]" } else { "[ ]" };
            let style = if answer.selected {
                theme::current().style(theme::HighlightGroup::Selection)
            } else {
                selectable_popup_label_style(selected, true)
            };
            selected_row_line(
                Line::from(vec![
                    selectable_popup_marker(selected),
                    selectable_popup_shortcut_span(shortcut),
                    Span::styled(format!("{checkbox} {}", answer.label), style),
                ]),
                selected,
            )
        })
        .collect()
}