clankerdiff-ratatui 0.1.7

Embeddable Ratatui diff review widget
Documentation
use crate::{
    RatatuiTheme,
    ui::{Modal, ModalSize},
};
use clankerdiff_theme::SelectionState;
pub use clankerdiff_theme::ThemeChoice;
pub(crate) use clankerdiff_theme::ThemeSelection as ThemePicker;
use ratatui::{
    buffer::Buffer,
    layout::Rect,
    widgets::{List, ListItem, ListState, StatefulWidget},
};

pub(crate) fn render_theme_picker(
    area: Rect,
    buffer: &mut Buffer,
    picker: &ThemePicker,
    theme: &RatatuiTheme,
) {
    let popup = Modal::new("Theme", ModalSize::Medium, theme)
        .hint("j/k preview · Enter save · Esc cancel")
        .render(area, buffer);
    if popup.is_empty() {
        return;
    }
    let items = picker
        .themes()
        .iter()
        .map(|choice| ListItem::new(choice.name.clone()));
    let mut state = ListState::default().with_selected(Some(picker.selected()));
    let list = List::new(items)
        .style(theme.ui.selection_style(SelectionState::None))
        .highlight_style(theme.ui.selection_style(SelectionState::Selected))
        .highlight_symbol("");
    StatefulWidget::render(list, popup, buffer, &mut state);
}