erythros/System/Core/Menu.HC

85 lines
No EOL
2.4 KiB
HolyC

// Core component for Menu functions
#define MENU_ITEM_MIN_HEIGHT 24
#define MENU_ITEM_MIN_WIDTH 256
I64 @menu_get_items_count(Window* win)
{
I64 count = 0;
@window_widgets_list* wl = win->widget;
while (wl) {
if (wl->widget) {
if (wl->widget->type == WIDGET_TYPE_MENU_ITEM || wl->widget->type == WIDGET_TYPE_BORDERED_RECT)
count++;
}
wl = wl->next;
}
return count;
}
MenuItemWidget* @menu_add_item(Window* win, U8* text, Context2D* icon,
U64 callback, U8* path = NULL,
Window* submenu = NULL)
{
I64 items_count = @menu_get_items_count(win);
win->height = 8;
win->height += MENU_ITEM_MIN_HEIGHT * (items_count + 1);
MenuItemWidget* item = Gui.CreateWidget(
win, WIDGET_TYPE_MENU_ITEM, 0, MENU_ITEM_MIN_HEIGHT * items_count,
MENU_ITEM_MIN_WIDTH, MENU_ITEM_MIN_HEIGHT);
Gui.Widget.SetText(item, text);
if (icon)
item->icon = icon;
if (path)
item->path = StrNew(path);
if (submenu)
item->submenu = submenu;
if (callback)
Gui.Widget.SetCallback(item, "clicked", callback);
return item;
}
BorderedRectWidget* @menu_add_separator(Window* win)
{
I64 items_count = @menu_get_items_count(win);
win->height = 8;
win->height += MENU_ITEM_MIN_HEIGHT * (items_count + 1);
BorderedRectWidget* separator = Gui.CreateWidget(
win, WIDGET_TYPE_BORDERED_RECT, 0, MENU_ITEM_MIN_HEIGHT * items_count,
MENU_ITEM_MIN_WIDTH, 0);
separator->y += (MENU_ITEM_MIN_HEIGHT / 2) - 2;
separator->top.size = 1;
separator->top.color = Color(128, 128, 128);
separator->bottom.size = 1;
separator->bottom.color = Color(255, 255, 255);
return separator;
}
Window* @menu_new(U8* title = NULL)
{
Window* menu = Compositor.CreateWindow(
0, 0, MENU_ITEM_MIN_WIDTH, MENU_ITEM_MIN_HEIGHT,
WIN_FLAGS_NOHILIGHT | WIN_FLAGS_SKIP | WIN_FLAGS_MENU);
Gui.Window.Hide(menu);
if (title)
Gui.Window.SetTitle(menu, title);
else
Gui.Window.SetTitle(menu, "");
return menu;
}
class @menu
{
MenuItemWidget* (*AddItem)(Window* win, U8* text, Context2D* icon,
U64 callback, U8* path = NULL,
Window* submenu = NULL);
BorderedRectWidget* (*AddSeparator)(Window* win);
Window* (*New)(U8* title);
};
@menu Menu;
Menu.AddItem = &@menu_add_item;
Menu.AddSeparator = &@menu_add_separator;
Menu.New = &@menu_new;
"menu ";