1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
static void menu_open(Ted *ted, Menu menu) {
ted->menu = menu;
ted->prev_active_buffer = ted->active_buffer;
ted->active_buffer = NULL;
switch (menu) {
case MENU_NONE: assert(0); break;
case MENU_OPEN:
ted->active_buffer = &ted->line_buffer;
break;
}
}
static void menu_close(Ted *ted, bool restore_prev_active_buffer) {
ted->menu = MENU_NONE;
if (restore_prev_active_buffer) ted->active_buffer = ted->prev_active_buffer;
ted->prev_active_buffer = NULL;
buffer_clear(&ted->line_buffer);
}
// returns the rectangle of the screen coordinates of the menu
static Rect menu_rect(Ted *ted) {
Settings *settings = &ted->settings;
float window_width = ted->window_width, window_height = ted->window_height;
float padding = settings->padding;
float menu_width = settings->max_menu_width;
menu_width = minf(menu_width, window_width - 2 * padding);
return rect(
V2(window_width * 0.5f - 0.5f * menu_width, padding),
V2(menu_width, window_height - 2 * padding)
);
}
static void menu_update(Ted *ted, Menu menu) {
switch (menu) {
case MENU_NONE: break;
case MENU_OPEN: {
char *selected_file = file_selector_update(ted, &ted->file_selector);
if (selected_file) {
// open that file!
if (ted_open_file(ted, selected_file)) {
menu_close(ted, false);
file_selector_free(&ted->file_selector);
}
free(selected_file);
}
} break;
}
}
static void menu_render(Ted *ted, Menu menu) {
Settings *settings = &ted->settings;
u32 *colors = settings->colors;
float window_width = ted->window_width, window_height = ted->window_height;
// render backdrop
glBegin(GL_QUADS);
gl_color_rgba(colors[COLOR_MENU_BACKDROP]);
rect_render(rect(V2(0, 0), V2(window_width, window_height)));
glEnd();
if (menu == MENU_OPEN) {
float padding = 20;
float menu_x1 = window_width * 0.5f - 300;
float menu_x2 = window_width * 0.5f + 300;
menu_x1 = maxf(menu_x1, padding);
menu_x2 = minf(menu_x2, window_width - padding);
float menu_y1 = padding;
float menu_y2 = window_height - padding;
Rect menu_rect = rect4(menu_x1, menu_y1, menu_x2, menu_y2);
float inner_padding = 10;
// menu rectangle & border
glBegin(GL_QUADS);
gl_color_rgba(colors[COLOR_MENU_BG]);
rect_render(menu_rect);
gl_color_rgba(colors[COLOR_BORDER]);
rect_render_border(menu_rect, settings->border_thickness);
glEnd();
menu_x1 += inner_padding;
menu_y1 += inner_padding;
menu_x2 -= inner_padding;
menu_y2 -= inner_padding;
FileSelector *fs = &ted->file_selector;
fs->bounds = rect4(menu_x1, menu_y1, menu_x2, menu_y2);
file_selector_render(ted, fs);
}
}
|