/** * @file Button.cpp * @author apio (cloudapio.eu) * @brief A clickable component that triggers an action when pressed. * * @copyright Copyright (c) 2023, the Luna authors. * */ #include #include namespace ui { Button::Button(Rect rect) { m_rect = rect; } void Button::set_widget(Widget& widget) { widget.rect() = m_rect; m_child = &widget; widget.set_parent(this); } void Button::set_action(void (*action)(void)) { m_action = action; } Result Button::handle_mouse_move(Point position) { m_hovered = true; return m_child->handle_mouse_move(position); } Result Button::handle_mouse_leave(Point position) { m_hovered = m_clicked = false; return m_child->handle_mouse_leave(position); } Result Button::handle_mouse_down(Point position, int buttons) { auto result = TRY(m_child->handle_mouse_down(position, buttons)); if (result == EventResult::DidNotHandle) { if (!m_clicked && (buttons == ui::MouseButtons::LEFT)) { m_clicked = true; m_action(); } } return EventResult::DidHandle; } Result Button::handle_mouse_up(Point position, int buttons) { if (buttons & ui::MouseButtons::LEFT) m_clicked = false; return m_child->handle_mouse_up(position, buttons); } Result Button::draw(Canvas& canvas) { return m_child->draw(canvas); } }