Luna/wind/Window.cpp

51 lines
1.6 KiB
C++
Raw Normal View History

2023-08-03 15:38:49 +00:00
#include "Window.h"
#include <luna/Utf8.h>
#include <os/File.h>
#include <ui/Font.h>
#include <ui/Image.h>
2023-08-03 15:38:49 +00:00
LinkedList<Window> g_windows;
void Window::draw(ui::Canvas& screen)
{
auto window = screen.subcanvas(surface);
window.subcanvas(contents).fill(color);
wchar_t buffer[4096];
Utf8StringDecoder decoder(name.chars());
decoder.decode(buffer, sizeof(buffer)).release_value();
auto font = ui::Font::default_font();
auto titlebar_canvas = window.subcanvas(titlebar);
titlebar_canvas.fill(ui::GRAY);
auto textarea = titlebar_canvas.subcanvas(ui::Rect { 10, 10, titlebar_canvas.width - 10, titlebar_canvas.height });
font->render(buffer, ui::BLACK, textarea);
static SharedPtr<ui::Image> g_close_icon;
if (!g_close_icon) g_close_icon = ui::Image::load("/usr/share/icons/16x16/app-close.tga").release_value();
auto close_area = window.subcanvas(close_button);
close_area.fill(g_close_icon->pixels(), g_close_icon->width());
2023-08-03 15:38:49 +00:00
}
void Window::focus()
{
// Bring the window to the front of the list.
g_windows.remove(this);
g_windows.append(this);
}
Window::Window(ui::Rect r, ui::Color c, StringView n) : surface(r), color(c), name(n)
2023-08-03 15:38:49 +00:00
{
auto font = ui::Font::default_font();
if (surface.width < 36) surface.width = 36;
if (surface.height < (font->height() + 20)) surface.height = font->height() + 20;
titlebar = ui::Rect { 0, 0, surface.width, font->height() + 20 };
close_button = ui::Rect { surface.width - 26, 10, 16, 16 };
contents = ui::Rect { 0, font->height() + 20, surface.width, surface.height - (font->height() + 20) };
2023-08-03 15:38:49 +00:00
g_windows.append(this);
}