108 lines
4.0 KiB
C
108 lines
4.0 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* container.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: bszilas <bszilas@student.42vienna.com> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2024/09/16 12:47:20 by vvobis #+# #+# */
|
|
/* Updated: 2024/12/11 12:06:40 by vvobis ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "../../minirt.h"
|
|
|
|
void container_item_draw(t_item *item, t_pixel *pixel)
|
|
{
|
|
if (item->type == ITEM_BUTTON || item->type == ITEM_DIRENT)
|
|
{
|
|
rt_draw_rect(item->rect, pixel, item->id, MENU_ITEM_BG);
|
|
glyph_print(item->rect.x, item->rect.y + ITEM_MARGIN, \
|
|
item->description, pixel);
|
|
}
|
|
else if (item->type == ITEM_SLIDER)
|
|
{
|
|
rt_draw_rect(item->rect, pixel, item->id, MENU_ITEM_BG);
|
|
rt_draw_rect(item->slider.bar, pixel, item->id, 0x0f0f0f);
|
|
rt_draw_rect(item->slider.cursor, pixel, item->id, 0x202020);
|
|
glyph_print(item->slider.cursor.x - 6, item->slider.cursor.y, \
|
|
item->description, pixel);
|
|
}
|
|
}
|
|
|
|
void container_item_get_by_id(t_container *cont, uint id, uint x, uint y)
|
|
{
|
|
uint i;
|
|
|
|
i = 0;
|
|
while (i < cont->item_count)
|
|
{
|
|
if (cont->item[i].id == id)
|
|
{
|
|
if (cont->item[i].type == ITEM_BUTTON \
|
|
&& cont->item[i].button.func_ptr)
|
|
{
|
|
cont->data->func_ptr_param = &cont->item[i].param;
|
|
cont->data->func_ptr = cont->item[i].button.func_ptr;
|
|
if (cont->param.type == PARAM_CONE \
|
|
|| cont->param.type == PARAM_CYL)
|
|
cont->param.func(cont->param.param);
|
|
}
|
|
else if (cont->item[i].type == ITEM_SLIDER && \
|
|
menu_slider_is_cursor(x, y, &cont->item[i].slider.cursor))
|
|
cont->data->mouse.slider = &cont->item[i].slider;
|
|
else if (cont->item[i].type == ITEM_DIRENT \
|
|
&& cont->item[i].dirent.func)
|
|
cont->item[i].dirent.func(&cont->item[i], cont->data);
|
|
return ;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
|
|
void container_draw(void *data_ptr, void *menu_ptr)
|
|
{
|
|
uint i;
|
|
t_data *data;
|
|
t_container *menu;
|
|
|
|
i = 0;
|
|
data = data_ptr;
|
|
menu = menu_ptr;
|
|
rt_draw_rect_blend(menu->attr, data->pixel, menu->id, MENU_ITEM_BG);
|
|
glyph_print(menu->attr.x + ITEM_PADDING, \
|
|
menu->attr.y + ITEM_PADDING, menu->title, data->pixel);
|
|
while (i < menu->item_count)
|
|
{
|
|
container_item_draw(&menu->item[i], data->pixel);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
/* Title limit = 1024; format see t_format enum */
|
|
t_container container_create(const char *title, t_rect *attr, uint format)
|
|
{
|
|
t_container container;
|
|
static uint container_id_count = 0;
|
|
|
|
ft_bzero(&container, sizeof(container));
|
|
if (ft_strlen(title) < sizeof(container.title))
|
|
ft_strlcpy(container.title, title, ft_strlen(title) + 1);
|
|
else
|
|
ft_fprintf(STDERR_FILENO, "[CONTAINER] Container Title Too Long! "\
|
|
"TITLE_LIMIT is %d", CONTAINER_TITLE_LEN);
|
|
if (attr)
|
|
container.attr = *attr;
|
|
else
|
|
{
|
|
container.attr.width = data.scene.w / 3;
|
|
container.attr.x = 0;
|
|
container.attr.height = data.scene.h - CONTAINER_PADDING * 2;
|
|
container.attr.y = data.scene.h / 2 - container.attr.height / 2;
|
|
}
|
|
container.format = format;
|
|
container.id = id_set(ID_GROUP_MENU_MAIN, container_id_count);
|
|
container.item_count = 0;
|
|
return (container);
|
|
}
|