domi-egui 0.1.0

DOMicile 15-primitive widget library for egui (Phase 3c).
use crate::theme::Theme;

pub struct TabsState {
    pub selected: usize,
}

impl Default for TabsState {
    fn default() -> Self { Self { selected: 0 } }
}

pub struct TabsProps<'a> {
    pub labels: &'a [&'a str],
    pub on_select: Option<Box<dyn FnMut(usize)>>,
}

pub fn domi_tabs(ui: &mut egui::Ui, props: TabsProps, state: &mut TabsState) -> egui::Response {
    let theme = Theme::default();
    let mut new_index: Option<usize> = None;
    let response = ui.horizontal(|ui| {
        for (i, label) in props.labels.iter().enumerate() {
            let is_selected = i == state.selected;
            let resp = ui.selectable_label(is_selected, *label);
            if resp.clicked() {
                state.selected = i;
                new_index = Some(i);
            }
        }
    }).response;
    if let Some(i) = new_index {
        if let Some(mut cb) = props.on_select {
            cb(i);
        }
    }
    let rect = response.rect;
    let painter = ui.painter_at(egui::Rect::from_min_size(
        rect.left_bottom(),
        egui::vec2(rect.width(), 1.0),
    ));
    painter.rect_filled(
        egui::Rect::from_min_size(rect.left_bottom(), egui::vec2(rect.width(), 1.0)),
        0.0,
        theme.text_default,
    );
    response
}