pelican_ui 2.0.6

Standard UI tools and components built off Pelican UI of the RAMP stack.
Documentation
use roost_ui::events::OnEvent;
use roost_ui::{Context, Component};
use roost_ui::layouts::Column;

use crate::interactions;
use crate::utils::Callback;
use crate::components::list_item::ListItem;
use crate::components::list_item::ListItemInfoLeft;

/// A column of selectable radio-style list items.
///
/// # Example
///
///<img src="https://raw.githubusercontent.com/ramp-stack/pelican_ui_std/main/src/examples/selector.png"
///      alt="Radio Example"
///      width="400">
///
/// ```rust
/// let selector = RadioSelector::new(ctx, 0, vec![
///     ("Light Mode", "Bright theme with light background", |_| println!("Selected Light Mode")),
///     ("Dark Mode", "Dim theme for low-light environments", |_| println!("Selected Dark Mode")),
///     ("System Default", "Match the system appearance setting", |_| println!("Selected System Default")),
/// ]);
/// ```
#[derive(Debug, Component)]
pub struct RadioSelector(Column, pub Vec<interactions::Selectable>);
impl OnEvent for RadioSelector {}
impl RadioSelector {
    pub fn new(ctx: &mut Context, index: usize, items: Vec<(&str, &str, Callback)>) -> Self {
        let group_id = uuid::Uuid::new_v4();
        let selectables = items.into_iter().enumerate().map(|(i, (t, s, c))| {
            let selected = ListItem::new(ctx, None, ListItemInfoLeft::new(t, s, None, None), None, Some("radio_filled"), None, |_| {});
            let default = ListItem::new(ctx, None, ListItemInfoLeft::new(t, s, None, None), None, Some("radio"), None, |_| {});

            interactions::Selectable::new(default, selected, i == index, c, group_id)
        }).collect::<Vec<_>>();

        RadioSelector(Column::center(0.0), selectables)
    }
}