summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2017-11-26 17:33:39 -0800
committerMichael Pavone <pavone@retrodev.com>2017-11-26 17:33:39 -0800
commit3c9268353c943b32ca517945c42dfb8c0b8484f8 (patch)
tree17e84a7ba10b3b85d0ba97485915bb7330403dc4
parentf4767bb05392fa4a04d72969fa35aa91b688c8cb (diff)
Sort directory listing in Nuklear UI file browser
--HG-- branch : nuklear_ui
-rw-r--r--menu.c13
-rw-r--r--nuklear_ui/blastem_nuklear.c3
-rw-r--r--util.c16
-rw-r--r--util.h2
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 <SDL.h>
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