From 3c9268353c943b32ca517945c42dfb8c0b8484f8 Mon Sep 17 00:00:00 2001 From: Michael Pavone Date: Sun, 26 Nov 2017 17:33:39 -0800 Subject: Sort directory listing in Nuklear UI file browser --HG-- branch : nuklear_ui --- menu.c | 13 +------------ nuklear_ui/blastem_nuklear.c | 3 +++ util.c | 16 ++++++++++++++++ util.h | 2 ++ 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/menu.c b/menu.c index b789d23..52ea468 100644 --- a/menu.c +++ b/menu.c @@ -41,17 +41,6 @@ uint16_t menu_read_w(uint32_t address, void * vcontext) } } -int menu_dir_sort(const void *a, const void *b) -{ - const dir_entry *da, *db; - da = a; - db = b; - if (da->is_dir != db->is_dir) { - return db->is_dir - da->is_dir; - } - return strcasecmp(((dir_entry *)a)->name, ((dir_entry *)b)->name); -} - void copy_string_from_guest(m68k_context *m68k, uint32_t guest_addr, char *buf, size_t maxchars) { char *cur; @@ -163,7 +152,7 @@ void * menu_write_w(uint32_t address, void * context, uint16_t value) size_t num_entries; dir_entry *entries = get_dir_list(menu->curpath, &num_entries); if (entries) { - qsort(entries, num_entries, sizeof(dir_entry), menu_dir_sort); + sort_dir_list(entries, num_entries); } else { warning("Failed to open directory %s: %s\n", menu->curpath, strerror(errno)); entries = malloc(sizeof(dir_entry)); diff --git a/nuklear_ui/blastem_nuklear.c b/nuklear_ui/blastem_nuklear.c index 96f8a5d..44861d9 100644 --- a/nuklear_ui/blastem_nuklear.c +++ b/nuklear_ui/blastem_nuklear.c @@ -33,6 +33,9 @@ void view_load(struct nk_context *context) } if (!entries) { entries = get_dir_list(current_path, &num_entries); + if (entries) { + sort_dir_list(entries, num_entries); + } } uint32_t width = render_width(); uint32_t height = render_height(); diff --git a/util.c b/util.c index 8601fca..09128c8 100644 --- a/util.c +++ b/util.c @@ -680,6 +680,22 @@ void free_dir_list(dir_entry *list, size_t numentries) free(list); } +static int sort_dir_alpha(const void *a, const void *b) +{ + const dir_entry *da, *db; + da = a; + db = b; + if (da->is_dir != db->is_dir) { + return db->is_dir - da->is_dir; + } + return strcasecmp(((dir_entry *)a)->name, ((dir_entry *)b)->name); +} + +void sort_dir_list(dir_entry *list, size_t num_entries) +{ + qsort(list, num_entries, sizeof(dir_entry), sort_dir_alpha); +} + #ifdef __ANDROID__ #include diff --git a/util.h b/util.h index a426edb..c8a68eb 100644 --- a/util.h +++ b/util.h @@ -62,6 +62,8 @@ char *read_bundled_file(char *name, uint32_t *sizeret); dir_entry *get_dir_list(char *path, size_t *numret); //Frees a dir list returned by get_dir_list void free_dir_list(dir_entry *list, size_t numentries); +//Performs a case-insensitive sort by file name on a dir list +void sort_dir_list(dir_entry *list, size_t num_entries); //Gets the modification time of a file time_t get_modification_time(char *path); //Recusrively creates a directory if it does not exist -- cgit v1.2.3