geng_ui/widgets/
button.rs1use super::*;
2
3pub struct Button<'a> {
4 sense: &'a mut Sense,
5 clicked: bool,
6 inner: Box<dyn Widget + 'a>,
7 f: Option<Box<dyn FnMut() + 'a>>,
8}
9
10impl<'a> Button<'a> {
11 pub fn new(cx: &'a Controller, text: &str) -> Self {
12 let sense: &'a mut Sense = cx.get_state();
13 let text = Text::new(
14 text.to_owned(),
15 cx.theme().font.clone(),
16 cx.theme().text_size,
17 if sense.is_hovered() {
18 cx.theme().hover_color
19 } else {
20 cx.theme().usable_color
21 },
22 )
23 .shrink(if sense.is_captured() {
24 cx.theme().press_ratio as f64
25 } else {
26 0.0
27 });
28 let mut ui = stack![text];
29 if sense.is_hovered() {
30 ui.push(Box::new(
31 ColorBox::new(cx.theme().hover_color)
32 .constraints_override(Constraints {
33 min_size: vec2(0.0, 1.0),
34 flex: vec2(1.0, 0.0),
35 })
36 .flex_align(vec2(Some(0.0), Some(0.0)), vec2(0.5, 0.0)),
37 ));
38 }
39 Self {
40 clicked: sense.take_clicked(),
41 sense,
42 inner: Box::new(ui),
43 f: None,
44 }
45 }
46 pub fn was_clicked(&self) -> bool {
47 self.clicked
48 }
49}
50
51impl Widget for Button<'_> {
52 fn sense(&mut self) -> Option<&mut Sense> {
53 Some(self.sense)
54 }
55 fn calc_constraints(&mut self, cx: &ConstraintsContext) -> Constraints {
56 cx.get_constraints(&self.inner)
57 }
58 fn walk_children_mut(&mut self, f: &mut dyn FnMut(&mut dyn Widget)) {
59 f(&mut self.inner);
60 }
61 fn layout_children(&mut self, cx: &mut LayoutContext) {
62 cx.set_position(&self.inner, cx.position);
63 }
64 fn handle_event(&mut self, event: &Event) {
65 #![allow(unused_variables)]
66 if let Some(f) = &mut self.f {
67 if self.sense.take_clicked() {
68 f();
69 }
70 }
71 }
72}