makepad_widget/
buttonlogic.rs1use 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}