Luna/libui/include/ui/Window.h
apio 280b0c90af
Some checks failed
Build and test / build (push) Failing after 1m49s
apps+editor+libui+terminal: Rework the layout system
2024-05-19 14:21:30 +02:00

126 lines
3.0 KiB
C++

/**
* @file Window.h
* @author apio (cloudapio.eu)
* @brief UI windows.
*
* @copyright Copyright (c) 2023, the Luna authors.
*
*/
#pragma once
#include <luna/Alloc.h>
#include <luna/HashMap.h>
#include <luna/OwnedPtr.h>
#include <luna/String.h>
#include <luna/StringView.h>
#include <os/File.h>
#include <ui/Canvas.h>
#include <ui/Mouse.h>
#include <ui/Rect.h>
#include <ui/Widget.h>
#include <ui/ipc/Server.h>
namespace ui
{
enum class WindowType : u8
{
Normal,
NotDecorated,
System,
};
struct [[gnu::packed]] Shortcut
{
moon::KeyCode key;
int modifiers;
bool operator==(const Shortcut& other) const
{
return key == other.key && modifiers == other.modifiers;
}
};
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;
}
template <typename T> Result<T*> create_main_widget()
{
check(!m_main_widget);
auto* widget = TRY(make<T>(this, nullptr));
m_main_widget = widget;
widget->set_rect(m_window_canvas.rect(), {});
return widget;
}
Canvas& canvas()
{
return m_window_canvas;
}
void update();
void close();
void set_special_attributes(WindowAttributes attributes);
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);
Result<void> add_keyboard_shortcut(ui::Shortcut shortcut, bool intercept, os::Function<ui::Shortcut>&& action);
void recalculate_layout()
{
check(m_main_widget);
m_main_widget->recalculate_pseudo_rects();
m_main_widget->recalculate_true_rects();
}
int id() const
{
return m_id;
}
void show_tree()
{
os::println("- ui::Window %d (%d,%d,%d,%d)", m_id, m_canvas.rect().pos.x, m_canvas.rect().pos.y,
m_canvas.rect().width, m_canvas.rect().height);
m_main_widget->show_tree(1);
}
~Window();
private:
int m_id;
Canvas m_canvas;
Canvas m_titlebar_canvas;
Canvas m_window_canvas;
String m_name;
Widget* m_main_widget { nullptr };
Option<Color> m_background {};
Option<int> m_old_mouse_buttons;
bool m_decorated { false };
struct ShortcutAction
{
bool intercept;
os::Function<Shortcut> action;
};
HashMap<Shortcut, ShortcutAction> m_shortcuts;
Result<void> draw_titlebar();
};
}