/** * @file Widget.h * @author apio (cloudapio.eu) * @brief Abstract widget class. * * @copyright Copyright (c) 2023, the Luna authors. * */ #pragma once #include <luna/Ignore.h> #include <luna/Result.h> #include <ui/Canvas.h> #include <ui/Point.h> #include <ui/Rect.h> #include <ui/ipc/Client.h> namespace ui { class Window; enum class EventResult { DidHandle, DidNotHandle, }; class Widget { public: virtual Result<EventResult> handle_mouse_move(Point position) { ignore(position); return EventResult::DidNotHandle; } virtual Result<EventResult> handle_mouse_down(Point position, int buttons) { ignore(position, buttons); return EventResult::DidNotHandle; } virtual Result<EventResult> handle_mouse_up(Point position, int buttons) { ignore(position, buttons); return EventResult::DidNotHandle; } virtual Result<EventResult> handle_mouse_leave() { return EventResult::DidNotHandle; } virtual Result<EventResult> handle_key_event(const ui::KeyEventRequest& request) { ignore(request); return EventResult::DidNotHandle; } virtual Result<void> draw(Canvas& canvas); void set_window(Window* window, Rect rect, Badge<Window>) { m_window = window; m_rect = rect; } void set_parent(Widget* parent) { m_parent = parent; m_window = parent->m_window; } Widget* parent() { return m_parent; } Window* window() { return m_window; } Rect& rect() { return m_rect; } protected: Widget* m_parent { nullptr }; Window* m_window; Rect m_rect { 0, 0, 50, 50 }; }; }