radiate-ui 1.2.22

A Rust library for genetic algorithms and artificial evolution.
Documentation
use crate::state::AppState;
use radiate_engines::Chromosome;
use ratatui::{
    style::{Color, Style},
    widgets::{Block, RenderDirection, Sparkline, SparklineBar, StatefulWidget, Widget},
};

pub struct SpeciesSparklineComponent<C> {
    _phantom: std::marker::PhantomData<C>,
}

impl<C> SpeciesSparklineComponent<C> {
    pub fn new() -> Self {
        Self {
            _phantom: std::marker::PhantomData,
        }
    }
}

impl<C: Chromosome> StatefulWidget for SpeciesSparklineComponent<C> {
    type State = AppState<C>;

    fn render(
        self,
        area: ratatui::layout::Rect,
        buf: &mut ratatui::buffer::Buffer,
        state: &mut Self::State,
    ) {
        let items = match &state.species {
            Some(species) => species,
            None => return,
        };

        let bars = items
            .iter()
            .map(|species| {
                let color = if let Some(selected_id) = state.species_table.selected_value {
                    if selected_id == species.id {
                        crate::styles::SELECTED_GREEN
                    } else {
                        Color::DarkGray
                    }
                } else {
                    Color::DarkGray
                };

                SparklineBar::from(species.population_size as u64).style(Style::default().fg(color))
            })
            .collect::<Vec<_>>();

        let sparkline = Sparkline::default()
            .block(Block::bordered())
            .data(bars)
            .direction(RenderDirection::LeftToRight)
            .style(Style::default().fg(Color::LightGreen))
            .max(items.iter().map(|s| s.population_size).max().unwrap_or(1) as u64);
        sparkline.render(area, buf);
    }
}