]> git.lizzy.rs Git - nothing.git/blob - src/game/level/level_editor/color_picker.c
(#779) Implement ColorPicker
[nothing.git] / src / game / level / level_editor / color_picker.c
1 #include <stdbool.h>
2
3 #include "game/level/boxes.h"
4 #include "system/stacktrace.h"
5 #include "game/camera.h"
6 #include "proto_rect.h"
7 #include "color_picker.h"
8 #include "color.h"
9
10 #define COLOR_CELL_WIDTH 50.0f
11 #define COLOR_CELL_HEIGHT 50.0f
12
13 // TODO: Colors of ColorPicker are poor
14 static Color colors[] = {
15     {1.0f, 0.0f, 0.0f, 1.0f},
16     {0.0f, 1.0f, 0.0f, 1.0f},
17     {0.0f, 0.0f, 1.0f, 1.0f}
18 };
19 static const size_t colors_count = sizeof(colors) / sizeof(Color);
20
21 int color_picker_render(const ColorPicker *color_picker,
22                         Camera *camera)
23 {
24     trace_assert(color_picker);
25     trace_assert(camera);
26
27     for (size_t i = 0; i < colors_count; ++i) {
28         if (camera_fill_rect_screen(
29                 camera,
30                 rect(COLOR_CELL_WIDTH * (float) i, 0,
31                      COLOR_CELL_WIDTH,
32                      COLOR_CELL_HEIGHT),
33                 colors[i]) < 0) {
34             return -1;
35         }
36     }
37
38     return 0;
39 }
40
41 int color_picker_update(ColorPicker *color_picker,
42                         float delta_time)
43 {
44     trace_assert(color_picker);
45     (void) delta_time;
46     return 0;
47 }
48
49 int color_picker_event(ColorPicker *color_picker,
50                        const SDL_Event *event)
51 {
52     trace_assert(color_picker);
53     trace_assert(event);
54
55     switch (event->type) {
56     case SDL_MOUSEBUTTONDOWN: {
57         switch (event->button.button) {
58         case SDL_BUTTON_LEFT: {
59             for (size_t i = 0; i < colors_count; ++i) {
60                 const Vec mouse_position = vec((float) event->button.x, (float) event->button.y);
61                 const Rect color_cell =
62                     rect(COLOR_CELL_WIDTH * (float) i, 0,
63                          COLOR_CELL_WIDTH,
64                          COLOR_CELL_HEIGHT);
65                 if (rect_contains_point(color_cell, mouse_position)) {
66                     color_picker->proto_rect->color = colors[i];
67                     break;
68                 }
69             }
70         } break;
71         }
72     } break;
73     }
74
75     return 0;
76 }