makepad-widget 0.1.0

Makepad widgets
Documentation
use makepad_render::*;

#[derive(Default, Clone)]
pub struct ButtonLogic {
}

#[derive(Clone, PartialEq)]
pub enum ButtonLogicEvent {
    Animate(AnimateEvent),
    AnimEnded(AnimateEvent),
    Over,
    Default,
    Down,
}

#[derive(Clone, PartialEq)]
pub enum ButtonEvent {
    None,
    Clicked,
    Down,
    Up 
}

impl ButtonLogic {
    
    pub fn handle_button_logic<F>(&mut self, cx: &mut Cx, event: &mut Event, area:Area, mut cb:F) -> ButtonEvent
    where F: FnMut(&mut Cx, ButtonLogicEvent, Area)
    {
        match event.hits(cx, area, HitOpt::default()) {
            Event::Animate(ae) => cb(cx, ButtonLogicEvent::Animate(ae), area),
            Event::AnimEnded(ae) => cb(cx, ButtonLogicEvent::AnimEnded(ae), area),
            Event::FingerDown(_fe) => {
                cb(cx, ButtonLogicEvent::Down, area);
                return ButtonEvent::Down;
            },
            Event::FingerHover(fe) => {
                cx.set_hover_mouse_cursor(MouseCursor::Hand);
                match fe.hover_state {
                    HoverState::In => if fe.any_down {
                        cb(cx, ButtonLogicEvent::Down, area);
                    }
                    else {
                        cb(cx, ButtonLogicEvent::Over, area);
                    },
                    HoverState::Out => cb(cx, ButtonLogicEvent::Default, area),
                    _ => ()
                }
            },
            Event::FingerUp(fe) => if fe.is_over {
                if !fe.is_touch {cb(cx, ButtonLogicEvent::Over, area)}
                else {cb(cx, ButtonLogicEvent::Default, area)}
                return ButtonEvent::Clicked;
            }
            else {
                cb(cx, ButtonLogicEvent::Default, area);
                return ButtonEvent::Up;
            }
            _ => ()
        };
        ButtonEvent::None
    }

}