Browse Source

Move file browser rendering to file_browser translation unit

rexim 2 years ago
parent
commit
6fe5418f9b
3 changed files with 68 additions and 66 deletions
  1. 62 0
      src/file_browser.c
  2. 4 0
      src/file_browser.h
  3. 2 66
      src/main.c

+ 62 - 0
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);
     qsort(fb->files.items, fb->files.count, sizeof(*fb->files.items), file_cmp);
     return 0;
     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;
+    }
+}

+ 4 - 0
src/file_browser.h

@@ -2,6 +2,9 @@
 #define FILE_BROWSER_H_
 #define FILE_BROWSER_H_
 
 
 #include "common.h"
 #include "common.h"
+#include "free_glyph.h"
+
+#include <SDL2/SDL.h>
 
 
 typedef struct {
 typedef struct {
     Files files;
     Files files;
@@ -9,5 +12,6 @@ typedef struct {
 } File_Browser;
 } File_Browser;
 
 
 Errno fb_open_dir(File_Browser *fb, const char *dir_path);
 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_
 #endif // FILE_BROWSER_H_

+ 2 - 66
src/main.c

@@ -23,8 +23,6 @@
 
 
 // TODO: Save file dialog
 // TODO: Save file dialog
 // Needed when ded is ran without any file so it does not know where to save.
 // 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: Jump forward/backward by a word
 // TODO: Delete a word
 // TODO: Delete a word
@@ -51,68 +49,6 @@ static Simple_Renderer sr = {0};
 static Editor editor = {0};
 static Editor editor = {0};
 static File_Browser fb = {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
 // TODO: display errors reported via flash_error right in the text editor window somehow
 #define flash_error(...) fprintf(stderr, __VA_ARGS__)
 #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
             // TODO(#19): update the viewport and the resolution only on actual window change
             glViewport(0, 0, w, h);
             glViewport(0, 0, w, h);
         }
         }
-        
+
         Vec4f bg = hex_to_vec4f(0x181818FF);
         Vec4f bg = hex_to_vec4f(0x181818FF);
         glClearColor(bg.x, bg.y, bg.z, bg.w);
         glClearColor(bg.x, bg.y, bg.z, bg.w);
         glClear(GL_COLOR_BUFFER_BIT);
         glClear(GL_COLOR_BUFFER_BIT);
 
 
         if (file_browser) {
         if (file_browser) {
-            render_file_browser(window, &atlas, &sr, &fb);
+            fb_render(&fb, window, &atlas, &sr);
         } else {
         } else {
             editor_render(window, &atlas, &sr, &editor);
             editor_render(window, &atlas, &sr, &editor);
         }
         }