]> git.lizzy.rs Git - nothing.git/blob - src/ui/list_selector.c
(#606) Integrate ListSelector with LevelPicker
[nothing.git] / src / ui / list_selector.c
1 #include <stdlib.h>
2
3 #include <SDL2/SDL.h>
4
5 #include "system/stacktrace.h"
6 #include "system/lt.h"
7 #include "system/nth_alloc.h"
8 #include "system/str.h"
9 #include "math/point.h"
10 #include "game/sprite_font.h"
11
12 #include "./list_selector.h"
13
14 struct ListSelector
15 {
16     Lt *lt;
17     const Sprite_font *sprite_font;
18     const char **items;
19     size_t count;
20     Vec position;
21     float width;
22 };
23
24 ListSelector *create_list_selector(const Sprite_font *sprite_font,
25                                    const char *items[],
26                                    size_t count,
27                                    Vec position,
28                                    float width)
29 {
30     trace_assert(items);
31
32     Lt *lt = create_lt();
33     if (lt == NULL) {
34         return NULL;
35     }
36
37     ListSelector *list_selector = PUSH_LT(lt, nth_alloc(sizeof(ListSelector)), free);
38     if (list_selector == NULL) {
39         RETURN_LT(lt, NULL);
40     }
41     list_selector->lt = lt;
42
43     list_selector->sprite_font = sprite_font;
44
45     list_selector->items = PUSH_LT(lt, nth_calloc(count, sizeof(const char*)), free);
46     if (list_selector->items == NULL) {
47         RETURN_LT(lt, NULL);
48     }
49
50     for (size_t i = 0; i < count; ++i) {
51         list_selector->items[i] = PUSH_LT(lt, string_duplicate(items[i], NULL), free);
52         if (list_selector->items[i] == NULL) {
53             RETURN_LT(lt, NULL);
54         }
55     }
56
57     list_selector->count = count;
58     list_selector->position = position;
59     list_selector->width = width;
60
61     return list_selector;
62 }
63
64 void destroy_list_selector(ListSelector *list_selector)
65 {
66     trace_assert(list_selector);
67     RETURN_LT0(list_selector->lt);
68 }
69
70 int list_selector_render(const ListSelector *list_selector, SDL_Renderer *renderer)
71 {
72     trace_assert(list_selector);
73     trace_assert(renderer);
74
75     // TODO: ListSelector.width is ignored in rendering
76
77     for (size_t i = 0; i < list_selector->count; ++i) {
78         if (sprite_font_render_text(
79                 list_selector->sprite_font,
80                 renderer,
81                 vec_sum(
82                     list_selector->position,
83                     vec(0.0f, (float) (i * FONT_CHAR_HEIGHT))),
84                 vec(1.0f, 1.0f),
85                 rgba(1.0f, 1.0f, 1.0f, 1.0f),
86                 list_selector->items[i]) < 0) {
87             return -1;
88         }
89     }
90
91     return 0;
92 }
93
94 int list_selector_update(ListSelector *list_selector, float delta_time)
95 {
96     trace_assert(list_selector);
97     (void) delta_time;
98
99     return 0;
100 }
101
102 int list_selector_event(ListSelector *list_selector, const SDL_Event *event)
103 {
104     trace_assert(list_selector);
105     trace_assert(event);
106     return 0;
107 }
108
109 const char *list_selector_selected(const ListSelector *list_selector)
110 {
111     trace_assert(list_selector);
112     return NULL;
113 }