radiate-ui 1.2.20

A Rust library for genetic algorithms and artificial evolution.
Documentation
use radiate_engines::{Chromosome, stats::TagKind};
use ratatui::{
    buffer::Buffer,
    layout::Rect,
    style::{Color, Modifier, Style},
    text::{Line, Span},
    widgets::{Block, List, ListItem, StatefulWidget, Widget},
};

use crate::{state::AppState, styles::SELECTED_GREEN};

pub struct FilterWidget<'a, C: Chromosome> {
    state: &'a mut AppState<C>,
}

impl<'a, C: Chromosome> FilterWidget<'a, C> {
    pub fn new(state: &'a mut AppState<C>) -> Self {
        Self { state }
    }
}

impl<'a, C: Chromosome> Widget for FilterWidget<'a, C> {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let block = Block::bordered().title(Line::from(" Filter ").centered());
        let inner = block.inner(area);
        block.render(area, buf);

        let tags = self
            .state
            .filter_state
            .all_tags
            .iter()
            .filter(|tag| *(*tag) != TagKind::Statistic && *(*tag) != TagKind::Time)
            .enumerate()
            .map(|(i, tag)| {
                if self.state.filter_state.tag_view.contains(&i) {
                    if i == self.state.filter_state.selected_row {
                        return ListItem::new(Span::styled(
                            format!("> X {}", TagKind::as_str(tag)),
                            Style::default()
                                .fg(SELECTED_GREEN)
                                .add_modifier(Modifier::BOLD),
                        ));
                    } else {
                        let spans = vec![
                            Span::raw("  "),
                            Span::styled(
                                format!("X"),
                                Style::default()
                                    .fg(SELECTED_GREEN)
                                    .add_modifier(Modifier::BOLD),
                            ),
                            Span::raw(format!(" {}", TagKind::as_str(tag))),
                        ];
                        return ListItem::new(Line::from(spans));
                    }
                } else {
                    if i == self.state.filter_state.selected_row {
                        return ListItem::new(Span::styled(
                            format!("> - {}", TagKind::as_str(tag)),
                            Style::default()
                                .fg(SELECTED_GREEN)
                                .add_modifier(Modifier::BOLD),
                        ));
                    } else {
                        ListItem::new(Span::styled(
                            format!("  - {}", TagKind::as_str(tag)),
                            Style::default().fg(Color::White),
                        ))
                    }
                }
            })
            .collect::<Vec<_>>();

        StatefulWidget::render(
            List::new(tags),
            inner,
            buf,
            &mut self.state.filter_state.tag_list_filter_state,
        );
    }
}