5 #include "system/stacktrace.h"
7 #include "system/nth_alloc.h"
8 #include "system/str.h"
9 #include "math/point.h"
10 #include "game/sprite_font.h"
12 #include "./list_selector.h"
17 const Sprite_font *sprite_font;
22 ListSelector *create_list_selector(const Sprite_font *sprite_font,
33 ListSelector *list_selector = PUSH_LT(lt, nth_alloc(sizeof(ListSelector)), free);
34 if (list_selector == NULL) {
37 list_selector->lt = lt;
39 list_selector->sprite_font = sprite_font;
41 list_selector->items = PUSH_LT(lt, nth_calloc(count, sizeof(const char*)), free);
42 if (list_selector->items == NULL) {
46 for (size_t i = 0; i < count; ++i) {
47 list_selector->items[i] = PUSH_LT(lt, string_duplicate(items[i], NULL), free);
48 if (list_selector->items[i] == NULL) {
53 list_selector->count = count;
58 void destroy_list_selector(ListSelector *list_selector)
60 trace_assert(list_selector);
61 RETURN_LT0(list_selector->lt);
64 int list_selector_render(const ListSelector *list_selector,
65 SDL_Renderer *renderer,
70 trace_assert(list_selector);
71 trace_assert(renderer);
73 for (size_t i = 0; i < list_selector->count; ++i) {
74 if (sprite_font_render_text(
75 list_selector->sprite_font,
79 vec(0.0f, (float) i * ((float) FONT_CHAR_HEIGHT * font_scale.y + padding_bottom))),
81 rgba(1.0f, 1.0f, 1.0f, 1.0f),
82 list_selector->items[i]) < 0) {
90 Vec list_selector_size(const ListSelector *list_selector,
94 trace_assert(list_selector);
96 Vec result = vec(0.0f, 0.0f);
98 for (size_t i = 0; i < list_selector->count; ++i) {
99 Rect boundary_box = sprite_font_boundary_box(
100 list_selector->sprite_font,
103 list_selector->items[i]);
105 result.x = fmaxf(result.x, boundary_box.w);
106 result.y += boundary_box.y + padding_bottom;
112 int list_selector_update(ListSelector *list_selector, float delta_time)
114 trace_assert(list_selector);
120 int list_selector_event(ListSelector *list_selector, const SDL_Event *event)
122 trace_assert(list_selector);
127 const char *list_selector_selected(const ListSelector *list_selector)
129 trace_assert(list_selector);