makepad_widget/
buttonlogic.rs

1use makepad_render::*;
2
3#[derive(Default, Clone)]
4pub struct ButtonLogic {
5}
6
7#[derive(Clone, PartialEq)]
8pub enum ButtonLogicEvent {
9    Animate(AnimateEvent),
10    AnimEnded(AnimateEvent),
11    Over,
12    Default,
13    Down,
14}
15
16#[derive(Clone, PartialEq)]
17pub enum ButtonEvent {
18    None,
19    Clicked,
20    Down,
21    Up 
22}
23
24impl ButtonLogic {
25    
26    pub fn handle_button_logic<F>(&mut self, cx: &mut Cx, event: &mut Event, area:Area, mut cb:F) -> ButtonEvent
27    where F: FnMut(&mut Cx, ButtonLogicEvent, Area)
28    {
29        match event.hits(cx, area, HitOpt::default()) {
30            Event::Animate(ae) => cb(cx, ButtonLogicEvent::Animate(ae), area),
31            Event::AnimEnded(ae) => cb(cx, ButtonLogicEvent::AnimEnded(ae), area),
32            Event::FingerDown(_fe) => {
33                cb(cx, ButtonLogicEvent::Down, area);
34                return ButtonEvent::Down;
35            },
36            Event::FingerHover(fe) => {
37                cx.set_hover_mouse_cursor(MouseCursor::Hand);
38                match fe.hover_state {
39                    HoverState::In => if fe.any_down {
40                        cb(cx, ButtonLogicEvent::Down, area);
41                    }
42                    else {
43                        cb(cx, ButtonLogicEvent::Over, area);
44                    },
45                    HoverState::Out => cb(cx, ButtonLogicEvent::Default, area),
46                    _ => ()
47                }
48            },
49            Event::FingerUp(fe) => if fe.is_over {
50                if !fe.is_touch {cb(cx, ButtonLogicEvent::Over, area)}
51                else {cb(cx, ButtonLogicEvent::Default, area)}
52                return ButtonEvent::Clicked;
53            }
54            else {
55                cb(cx, ButtonLogicEvent::Default, area);
56                return ButtonEvent::Up;
57            }
58            _ => ()
59        };
60        ButtonEvent::None
61    }
62
63}