From 968bbd92cf9bf9cc364baa973d81f4dcfa647ca3 Mon Sep 17 00:00:00 2001 From: Leo Tenenbaum Date: Fri, 22 Jan 2021 16:06:31 -0500 Subject: show working directory in file selector --- arr.c | 10 +++++----- config.c | 6 ++++++ menu.c | 6 +++--- ted.cfg | 1 + ui.c | 27 +++++++++++++++++---------- 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/arr.c b/arr.c index 93f6198..75c5d90 100644 --- a/arr.c +++ b/arr.c @@ -208,18 +208,18 @@ static inline void arr_set_len_(void **arr, size_t member_size, size_t n) { } while (0) -static void arr_append_str_(char **a, char const *s) { +static void arr_append_strn_(char **a, char const *s, size_t s_len) { size_t curr_len = arr_len(*a); - size_t s_len = strlen(s); - if (curr_len) --curr_len; // don't include null terminator arr_set_len(*a, curr_len + s_len + 1); memcpy(*a + curr_len, s, s_len + 1); } -// appends a C-string array with -#define arr_append_str(a, s) arr_append_str_(&(a), (s)) +// append to a C-string array +#define arr_append_str(a, s) arr_append_strn_(&(a), (s), strlen(s)) +// take at most n bytes from s +#define arr_append_strn(a, s, n) arr_append_strn_(&(a), (s), (n)) static void arr_test(void) { u32 *arr = NULL; diff --git a/config.c b/config.c index 458b455..e9ecbf3 100644 --- a/config.c +++ b/config.c @@ -306,6 +306,12 @@ void config_read(Ted *ted, char const *filename) { } else { config_err(cfg, "Invalid max menu width: %s.", value); } + } else if (streq(key, "padding")) { + if (is_integer && integer >= 10 && integer < 100) { + settings->padding = (u8)integer; + } else { + config_err(cfg, "Invalid padding: %s.", value); + } } else { config_err(cfg, "Unrecognized core setting: %s.", key); } diff --git a/menu.c b/menu.c index a4f9c11..af47393 100644 --- a/menu.c +++ b/menu.c @@ -50,8 +50,8 @@ static void menu_update(Ted *ted, Menu menu) { } static void menu_render(Ted *ted, Menu menu) { - Settings *settings = &ted->settings; - u32 *colors = settings->colors; + Settings const *settings = &ted->settings; + u32 const *colors = settings->colors; float window_width = ted->window_width, window_height = ted->window_height; // render backdrop @@ -62,7 +62,7 @@ static void menu_render(Ted *ted, Menu menu) { if (menu == MENU_OPEN) { - float padding = 20; + float padding = settings->padding; float menu_x1 = window_width * 0.5f - 300; float menu_x2 = window_width * 0.5f + 300; menu_x1 = maxf(menu_x1, padding); diff --git a/ted.cfg b/ted.cfg index 05ea53f..108808f 100644 --- a/ted.cfg +++ b/ted.cfg @@ -12,6 +12,7 @@ undo-save-time = 6 text-size = 16 border-thickness = 1 max-menu-width = 600 +padding = 10 [keyboard] # motion and selection diff --git a/ui.c b/ui.c index 04680d2..7b36c81 100644 --- a/ui.c +++ b/ui.c @@ -3,10 +3,11 @@ static bool file_selector_entry_pos(Ted const *ted, FileSelector const *fs, u32 i, Rect *r) { Rect bounds = fs->bounds; + float padding = ted->settings.padding; float char_height = text_font_char_height(ted->font); *r = rect(V2(bounds.pos.x, bounds.pos.y + char_height // make room for cwd - + char_height * 1.5f // make room for line buffer + + char_height * 1.5f + padding // make room for line buffer + char_height * (float)i), V2(bounds.size.x, char_height)); return rect_clip_to_rect(r, bounds); @@ -52,11 +53,15 @@ void file_selector_cd(Ted *ted, FileSelector *fs, char const *path) { // this is an absolute path. discard our previous cwd. arr_clear(fs->cwd); } - if (strlen(fs->cwd) > 0 && fs->cwd[strlen(fs->cwd) - 1] != PATH_SEPARATOR) { - // add path separator to end if not already there - arr_append_str(fs->cwd, PATH_SEPARATOR_STR); - } - arr_append_str(fs->cwd, path); + size_t path_len = strlen(path); + if (!path_len) return; + + if (path_len > 1 && path[path_len - 1] == PATH_SEPARATOR) + --path_len; + + // add path separator to end + arr_append_str(fs->cwd, PATH_SEPARATOR_STR); + arr_append_strn(fs->cwd, path, path_len); // clear search term buffer_clear(&ted->line_buffer); @@ -127,7 +132,6 @@ static char *file_selector_update(Ted *ted, FileSelector *fs) { char **files = fs_list_directory(fs->cwd); if (files) { char const *cwd = fs->cwd; - bool cwd_has_path_sep = cwd[strlen(cwd) - 1] == PATH_SEPARATOR; u32 nfiles; for (nfiles = 0; files[nfiles]; ++nfiles); @@ -161,7 +165,7 @@ static char *file_selector_update(Ted *ted, FileSelector *fs) { size_t path_size = strlen(name) + strlen(cwd) + 3; char *path = ted_calloc(ted, 1, path_size); if (path) { - snprintf(path, path_size - 1, "%s%s%s", cwd, cwd_has_path_sep ? "" : PATH_SEPARATOR_STR, name); + snprintf(path, path_size - 1, "%s%s%s", cwd, PATH_SEPARATOR_STR, name); entries[i].path = path; entries[i].type = fs_path_type(path); } else { @@ -189,12 +193,15 @@ static void file_selector_render(Ted *ted, FileSelector *fs) { u32 n_entries = fs->n_entries; FileEntry const *entries = fs->entries; Font *font = ted->font; + float padding = settings->padding; float char_height = text_font_char_height(ted->font); float x1, y1, x2, y2; rect_coords(bounds, &x1, &y1, &x2, &y2); - // current working directory @TODO - + // current working directory + gl_color_rgba(colors[COLOR_TEXT]); + text_render(font, fs->cwd, x1, y1); + y1 += char_height + padding; // search buffer float line_buffer_height = char_height * 1.5f; -- cgit v1.2.3