iris_ui/
button.rs

1use crate::gfx::draw_centered_text;
2use crate::view::Flex::Intrinsic;
3use crate::view::{View, ViewId};
4use crate::{Action, DrawEvent, EventType, util};
5use alloc::string::ToString;
6
7fn draw_button(e: &mut DrawEvent) {
8    e.ctx.fill_rect(&e.view.bounds, &e.theme.bg);
9    e.ctx.stroke_rect(&e.view.bounds, &e.theme.fg);
10    if let Some(focused) = e.focused {
11        if focused == &e.view.name {
12            e.ctx.stroke_rect(&e.view.bounds.contract(2), &e.theme.fg);
13        }
14    }
15    draw_centered_text(
16        e.ctx,
17        &e.view.title,
18        &e.view.bounds,
19        &e.theme.bold_font,
20        &e.theme.fg,
21    );
22}
23
24pub fn make_button(name: &ViewId, title: &str) -> View {
25    View {
26        name: name.clone(),
27        title: title.to_string(),
28        h_flex: Intrinsic,
29        v_flex: Intrinsic,
30        input: Some(|e| {
31            if let EventType::Tap(_pt) = &e.event_type {
32                e.scene.set_focused(e.target);
33                return Some(Action::Generic);
34            }
35            None
36        }),
37        layout: Some(|e| {
38            if let Some(view) = e.scene.get_view_mut(&e.target) {
39                view.bounds.size = util::calc_size(e.theme.bold_font, &view.title);
40            }
41        }),
42        draw: Some(draw_button),
43        ..Default::default()
44    }
45}