/** * @file Window.h * @author apio (cloudapio.eu) * @brief UI windows. * * @copyright Copyright (c) 2023, the Luna authors. * */ #pragma once #include <luna/OwnedPtr.h> #include <luna/StringView.h> #include <ui/Canvas.h> #include <ui/Mouse.h> #include <ui/Rect.h> #include <ui/Widget.h> #include <ui/ipc/Server.h> namespace ui { class Window { public: static Result<Window*> create(Rect rect, WindowType type = WindowType::Normal); void set_title(StringView title); void set_background(Color color) { m_background = color; } void set_main_widget(Widget& widget) { check(!m_main_widget); widget.set_window(this, m_canvas.rect(), {}); m_main_widget = &widget; } Canvas& canvas() { return m_canvas; } void update(); void close(); Result<void> draw(); Result<ui::EventResult> handle_mouse_leave(); Result<ui::EventResult> handle_mouse_move(ui::Point position); Result<ui::EventResult> handle_mouse_buttons(ui::Point position, int buttons); Result<ui::EventResult> handle_key_event(const ui::KeyEventRequest& request); int id() const { return m_id; } ~Window(); private: int m_id; Canvas m_canvas; Widget* m_main_widget { nullptr }; Option<Color> m_background {}; Option<int> m_old_mouse_buttons; }; }