#include "gui.h" #include "renderer.h" container_t gui_list_container_create(void *state, uint32_t items_count, uint16_t item_height, render_item render_it, render_item render_header) { list_container_t list = { .item_height = item_height, .items_count = items_count, .state = state, .scroll_x = 0, .scroll_y = 0, .render_header_fn = render_header, .render_item_fn = render_it, }; container_t container = { .focusable = true, .focused = false, .height = item_height * items_count, .width = 0, .inner.list = list, .x = 0, .y = 0 }; return container; } void gui_list_scroll(container_t *container, int16_t x, int16_t y) { container->inner.list.scroll_x += x; container->inner.list.scroll_y += y; } bool gui_list_container_set_state(container_t *container, void *state, uint32_t items_count) { container->inner.list.state = state; container->inner.list.items_count = items_count; return true; } bool gui_list_container_set_item_height(container_t *container, uint16_t item_height) { container->inner.list.item_height = item_height; return true; } bool gui_list_container_set_render_function(container_t *container, render_item render_it, render_item render_header) { container->inner.list.render_item_fn = render_it; container->inner.list.render_header_fn = render_header; return true; } void gui_list_container_render(gui_t *gui, container_t *container) { renderer_translate(gui->renderer, container->x, container->y); renderer_set_draw_area(gui->renderer, gui->size.x, gui->size.y); list_container_t list = container->inner.list; if (list.scroll_x < 0) { list.scroll_x = 0; } if (list.scroll_y < 0) { list.scroll_y = 0; } container->inner.list = list; uint16_t item_height = list.item_height; int32_t first_index = list.scroll_y / item_height; if (first_index < 0) { first_index = 0; } uint32_t items_count = gui->size.y / item_height; uint32_t end_index = first_index + items_count; int32_t beg_x = -list.scroll_x; int32_t beg_y = -list.scroll_y + first_index * item_height; for (int i = first_index; i < end_index; i++) { int32_t y = beg_y + i * item_height; list.render_item_fn(list.state, i, gui->renderer, beg_x, y); } } void gui_list_container_update(gui_t *gui, container_t *container) { // do nothing :) }