pelican_ui 2.0.2

Standard UI tools and components built off Pelican UI of the RAMP stack.
Documentation
use roost::events::{self, OnEvent, Event};
use roost::drawable::{Drawable};
use roost::{Context, Component};
use roost::layouts::{Enum, Stack};
use roost::emitters;

#[derive(Component)]
pub struct Selectable(Stack, Enum, #[skip] Box<dyn FnMut(&mut Context)>);

impl Selectable {
    pub fn new(
        default: impl Drawable + 'static,
        selected: impl Drawable + 'static,
        is_selected: bool,
        on_click: impl FnMut(&mut Context) + 'static,
        group_id: uuid::Uuid,
    ) -> emitters::Selectable<Self> {
        let start = if is_selected {"selected"} else {"default"};
        emitters::Selectable::new(Selectable(Stack::default(), Enum::new(vec![
            ("default", Box::new(default)),
            ("selected", Box::new(selected)),
        ], start), Box::new(on_click)), group_id)
    }
}

impl OnEvent for Selectable {
    fn on_event(&mut self, ctx: &mut Context, event: Box<dyn Event>) -> Vec<Box<dyn Event>> {
        if let Some(events::Selectable::Selected(b)) = event.downcast_ref::<events::Selectable>() {
            match b {
                false => self.1.display("default"),
                true => {
                    self.1.display("selected");
                    ctx.hardware.haptic();
                    (self.2)(ctx);
                }
            }
        }
        Vec::new()
    }
}

impl std::fmt::Debug for Selectable {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "Selectable")
    }
}