matetui 0.3.4

🧉 matetui » utilities for building Terminal User Interfaces
Documentation
//! {`GridSelector`} widget
//!
//! This module contains the [`BoxSelector`] ratatui widget.
//!
//! The grid selector is a stateful widget that allows the user to select an item from a list of
//! items displayed in a grid. The user can navigate the grid with the arrow keys, and select the
//! currently hovered item with the `Enter` key.
//!
//! The [`GridSelector`] widget uses a [`GridSelectorState`] to be able to keep its state between
//! renders.

use {super::GridSelectorState, ratatui::style::Color};

pub struct GridSelector {
    color: Color,
    hovered_color: Color,
    selected_color: Color,
}

impl Default for GridSelector {
    fn default() -> Self {
        Self {
            color: Color::Reset,
            hovered_color: Color::Blue,
            selected_color: Color::Green,
        }
    }
}

// imlementation of the build pattern for the GridSelector to set the colors

impl GridSelector {
    /// Set the color of the items in the grid.
    pub fn with_color(mut self, color: Color) -> Self {
        self.color = color;
        self
    }

    /// Set the color of the hovered item in the grid.
    pub fn with_hovered_color(mut self, color: Color) -> Self {
        self.hovered_color = color;
        self
    }

    /// Set the color of the selected item in the grid.
    pub fn with_selected_color(mut self, color: Color) -> Self {
        self.selected_color = color;
        self
    }

    pub(crate) fn get_color(&self, for_idx: usize, state: &GridSelectorState) -> Color {
        let mut color = self.color;

        if let Some(hovered_idx) = state.hovered {
            if for_idx == hovered_idx {
                color = self.hovered_color;
            }
        }

        if let Some(selected_index) = state.selected {
            if for_idx == selected_index {
                color = self.selected_color;
            }
        }

        color
    }
}