commit 6fe5418f9bfdfca9b623ced42af4da94d3c5b613
parent 0b01e5b14c6ae8f1363b208321933e0995e4bbb4
Author: rexim <reximkut@gmail.com>
Date: Tue, 17 Jan 2023 22:47:35 +0700
Move file browser rendering to file_browser translation unit
Diffstat:
3 files changed, 68 insertions(+), 66 deletions(-)
diff --git a/src/file_browser.c b/src/file_browser.c
@@ -19,3 +19,65 @@ Errno fb_open_dir(File_Browser *fb, const char *dir_path)
qsort(fb->files.items, fb->files.count, sizeof(*fb->files.items), file_cmp);
return 0;
}
+
+void fb_render(const File_Browser *fb, SDL_Window *window, Free_Glyph_Atlas *atlas, Simple_Renderer *sr)
+{
+ Vec2f cursor_pos = vec2f(0, -(float)fb->cursor * FREE_GLYPH_FONT_SIZE);
+
+ int w, h;
+ SDL_GetWindowSize(window, &w, &h);
+
+ float max_line_len = 0.0f;
+
+ sr->resolution = vec2f(w, h);
+ sr->time = (float) SDL_GetTicks() / 1000.0f;
+
+ simple_renderer_set_shader(sr, SHADER_FOR_COLOR);
+ if (fb->cursor < fb->files.count) {
+ const Vec2f begin = vec2f(0, -(float)fb->cursor * FREE_GLYPH_FONT_SIZE);
+ Vec2f end = begin;
+ free_glyph_atlas_measure_line_sized(
+ atlas, fb->files.items[fb->cursor], strlen(fb->files.items[fb->cursor]),
+ &end);
+ simple_renderer_solid_rect(sr, begin, vec2f(end.x - begin.x, FREE_GLYPH_FONT_SIZE), vec4f(.25, .25, .25, 1));
+ }
+ simple_renderer_flush(sr);
+
+ simple_renderer_set_shader(sr, SHADER_FOR_EPICNESS);
+ for (size_t row = 0; row < fb->files.count; ++row) {
+ const Vec2f begin = vec2f(0, -(float)row * FREE_GLYPH_FONT_SIZE);
+ Vec2f end = begin;
+ free_glyph_atlas_render_line_sized(
+ atlas, sr, fb->files.items[row], strlen(fb->files.items[row]),
+ &end,
+ vec4fs(0));
+ // TODO: the max_line_len should be calculated based on what's visible on the screen right now
+ float line_len = fabsf(end.x - begin.x);
+ if (line_len > max_line_len) {
+ max_line_len = line_len;
+ }
+ }
+
+ simple_renderer_flush(sr);
+
+ // Update camera
+ {
+ float target_scale = 3.0f;
+ if (max_line_len > 0.0f) {
+ target_scale = SCREEN_WIDTH / max_line_len;
+ }
+
+ if (target_scale > 3.0f) {
+ target_scale = 3.0f;
+ }
+
+
+ sr->camera_vel = vec2f_mul(
+ vec2f_sub(cursor_pos, sr->camera_pos),
+ vec2fs(2.0f));
+ sr->camera_scale_vel = (target_scale - sr->camera_scale) * 2.0f;
+
+ sr->camera_pos = vec2f_add(sr->camera_pos, vec2f_mul(sr->camera_vel, vec2fs(DELTA_TIME)));
+ sr->camera_scale = sr->camera_scale + sr->camera_scale_vel * DELTA_TIME;
+ }
+}
diff --git a/src/file_browser.h b/src/file_browser.h
@@ -2,6 +2,9 @@
#define FILE_BROWSER_H_
#include "common.h"
+#include "free_glyph.h"
+
+#include <SDL2/SDL.h>
typedef struct {
Files files;
@@ -9,5 +12,6 @@ typedef struct {
} File_Browser;
Errno fb_open_dir(File_Browser *fb, const char *dir_path);
+void fb_render(const File_Browser *fb, SDL_Window *window, Free_Glyph_Atlas *atlas, Simple_Renderer *sr);
#endif // FILE_BROWSER_H_
diff --git a/src/main.c b/src/main.c
@@ -23,8 +23,6 @@
// TODO: Save file dialog
// Needed when ded is ran without any file so it does not know where to save.
-// TODO: File Manager
-// Any modern Text Editor should also be a File Manager
// TODO: Jump forward/backward by a word
// TODO: Delete a word
@@ -51,68 +49,6 @@ static Simple_Renderer sr = {0};
static Editor editor = {0};
static File_Browser fb = {0};
-void render_file_browser(SDL_Window *window, Free_Glyph_Atlas *atlas, Simple_Renderer *sr, const File_Browser *fb)
-{
- Vec2f cursor_pos = vec2f(0, -(float)fb->cursor * FREE_GLYPH_FONT_SIZE);
-
- int w, h;
- SDL_GetWindowSize(window, &w, &h);
-
- float max_line_len = 0.0f;
-
- sr->resolution = vec2f(w, h);
- sr->time = (float) SDL_GetTicks() / 1000.0f;
-
- simple_renderer_set_shader(sr, SHADER_FOR_COLOR);
- if (fb->cursor < fb->files.count) {
- const Vec2f begin = vec2f(0, -(float)fb->cursor * FREE_GLYPH_FONT_SIZE);
- Vec2f end = begin;
- free_glyph_atlas_measure_line_sized(
- atlas, fb->files.items[fb->cursor], strlen(fb->files.items[fb->cursor]),
- &end);
- simple_renderer_solid_rect(sr, begin, vec2f(end.x - begin.x, FREE_GLYPH_FONT_SIZE), vec4f(.25, .25, .25, 1));
- }
- simple_renderer_flush(sr);
-
- simple_renderer_set_shader(sr, SHADER_FOR_EPICNESS);
- for (size_t row = 0; row < fb->files.count; ++row) {
- const Vec2f begin = vec2f(0, -(float)row * FREE_GLYPH_FONT_SIZE);
- Vec2f end = begin;
- free_glyph_atlas_render_line_sized(
- atlas, sr, fb->files.items[row], strlen(fb->files.items[row]),
- &end,
- vec4fs(0));
- // TODO: the max_line_len should be calculated based on what's visible on the screen right now
- float line_len = fabsf(end.x - begin.x);
- if (line_len > max_line_len) {
- max_line_len = line_len;
- }
- }
-
- simple_renderer_flush(sr);
-
- // Update camera
- {
- float target_scale = 3.0f;
- if (max_line_len > 0.0f) {
- target_scale = SCREEN_WIDTH / max_line_len;
- }
-
- if (target_scale > 3.0f) {
- target_scale = 3.0f;
- }
-
-
- sr->camera_vel = vec2f_mul(
- vec2f_sub(cursor_pos, sr->camera_pos),
- vec2fs(2.0f));
- sr->camera_scale_vel = (target_scale - sr->camera_scale) * 2.0f;
-
- sr->camera_pos = vec2f_add(sr->camera_pos, vec2f_mul(sr->camera_vel, vec2fs(DELTA_TIME)));
- sr->camera_scale = sr->camera_scale + sr->camera_scale_vel * DELTA_TIME;
- }
-}
-
// TODO: display errors reported via flash_error right in the text editor window somehow
#define flash_error(...) fprintf(stderr, __VA_ARGS__)
@@ -377,13 +313,13 @@ int main(int argc, char **argv)
// TODO(#19): update the viewport and the resolution only on actual window change
glViewport(0, 0, w, h);
}
-
+
Vec4f bg = hex_to_vec4f(0x181818FF);
glClearColor(bg.x, bg.y, bg.z, bg.w);
glClear(GL_COLOR_BUFFER_BIT);
if (file_browser) {
- render_file_browser(window, &atlas, &sr, &fb);
+ fb_render(&fb, window, &atlas, &sr);
} else {
editor_render(window, &atlas, &sr, &editor);
}