From 6f7c2489d56668998830e3fb28b117ae67b5312b Mon Sep 17 00:00:00 2001 From: LiquidFenrir Date: Wed, 4 Apr 2018 22:04:45 +0200 Subject: [PATCH] Different sorting modes (#143) (#145) --- include/common.h | 1 + include/instructions.h | 6 +++--- include/loading.h | 14 ++++++++++++++ romfs/sort.png | Bin 0 -> 291 bytes source/draw.c | 5 ++++- source/loading.c | 41 +++++++++++++++++++++++++++++++++++------ source/main.c | 35 ++++++++++++++++++++++++++++++++++- 7 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 romfs/sort.png diff --git a/include/common.h b/include/common.h index b8fc25b..c4661c8 100644 --- a/include/common.h +++ b/include/common.h @@ -62,6 +62,7 @@ enum TextureID { TEXTURE_SHUFFLE, TEXTURE_INSTALLED, TEXTURE_PREVIEW_ICON, + TEXTURE_SORT, TEXTURE_DOWNLOAD, TEXTURE_BROWSE, TEXTURE_LIST, diff --git a/include/instructions.h b/include/instructions.h index 6490e93..0aa341c 100644 --- a/include/instructions.h +++ b/include/instructions.h @@ -108,11 +108,11 @@ Instructions_s extra_instructions = { }, { L"\uE07B Browse ThemePlaza", - NULL + L"\uE07C Sort by filename" }, { - NULL, - NULL + L"\uE004 Sort by name", + L"\uE005 Sort by author" }, { L"Exit", diff --git a/include/loading.h b/include/loading.h index f63bf33..b52ea59 100644 --- a/include/loading.h +++ b/include/loading.h @@ -38,6 +38,14 @@ enum ICON_IDS_OFFSET { ICONS_OFFSET_AMOUNT, }; +typedef enum { + SORT_NONE, + + SORT_NAME, + SORT_AUTHOR, + SORT_PATH, +} SortMode; + typedef struct { u8 _padding1[4 + 2 + 2]; @@ -88,6 +96,8 @@ typedef struct { int entries_loaded; int entry_size; + SortMode current_sort; + json_int_t tp_current_page; json_int_t tp_page_count; char * tp_search; @@ -98,6 +108,10 @@ typedef struct { volatile bool run_thread; } Thread_Arg_s; +void sort_by_name(Entry_List_s * list); +void sort_by_author(Entry_List_s * list); +void sort_by_filename(Entry_List_s * list); + void delete_entry(Entry_s * entry, bool is_file); Result load_entries(const char * loading_path, Entry_List_s * list); bool load_preview(Entry_List_s list, int * preview_offset); diff --git a/romfs/sort.png b/romfs/sort.png new file mode 100644 index 0000000000000000000000000000000000000000..92c56ccc8d73017bd8ed5112d10cecae354a6ed7 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4k}Avwk069rD4cRw0m5O>h|((0$KDxL>qXIzWF g7IVd?VAUSRLbvK8-_;+m1KrBt>FVdQ&MBb@0A~nmp8x;= literal 0 HcmV?d00001 diff --git a/source/draw.c b/source/draw.c index edfd18b..b8e7a31 100644 --- a/source/draw.c +++ b/source/draw.c @@ -43,8 +43,9 @@ void init_screens(void) pp2d_load_texture_png(TEXTURE_ARROW_SIDE, "romfs:/arrow_side.png"); pp2d_load_texture_png(TEXTURE_SHUFFLE, "romfs:/shuffle.png"); pp2d_load_texture_png(TEXTURE_INSTALLED, "romfs:/installed.png"); - pp2d_load_texture_png(TEXTURE_DOWNLOAD, "romfs:/download.png"); pp2d_load_texture_png(TEXTURE_PREVIEW_ICON, "romfs:/preview.png"); + pp2d_load_texture_png(TEXTURE_SORT, "romfs:/sort.png"); + pp2d_load_texture_png(TEXTURE_DOWNLOAD, "romfs:/download.png"); pp2d_load_texture_png(TEXTURE_BROWSE, "romfs:/browse.png"); pp2d_load_texture_png(TEXTURE_LIST, "romfs:/list.png"); pp2d_load_texture_png(TEXTURE_EXIT, "romfs:/exit.png"); @@ -408,6 +409,7 @@ void draw_interface(Entry_List_s* list, Instructions_s instructions) pp2d_draw_on(GFX_BOTTOM, GFX_LEFT); + pp2d_draw_texture_blend(TEXTURE_SORT, 320-144, 0, COLOR_WHITE); pp2d_draw_texture_blend(TEXTURE_DOWNLOAD, 320-120, 0, COLOR_WHITE); pp2d_draw_texture_blend(TEXTURE_BROWSE, 320-96, 0, COLOR_WHITE); pp2d_draw_texture_blend(TEXTURE_EXIT, 320-72, 0, COLOR_WHITE); @@ -434,6 +436,7 @@ void draw_interface(Entry_List_s* list, Instructions_s instructions) break; } + pp2d_draw_texture_blend(TEXTURE_SORT, 320-144, 0, COLOR_WHITE); pp2d_draw_texture_blend(TEXTURE_DOWNLOAD, 320-120, 0, COLOR_WHITE); pp2d_draw_texture_blend(TEXTURE_BROWSE, 320-96, 0, COLOR_WHITE); pp2d_draw_texture_blend(TEXTURE_EXIT, 320-72, 0, COLOR_WHITE); diff --git a/source/loading.c b/source/loading.c index 7f3ceb6..eaecbcd 100644 --- a/source/loading.c +++ b/source/loading.c @@ -104,20 +104,51 @@ static void load_smdh_icon(Entry_s entry, const ssize_t textureID) free(image); } -static int compare_entries(const void * a, const void * b) +typedef int (*sort_comparator)(const void *, const void *); +static int compare_entries_by_name(const void * a, const void * b) { Entry_s *entry_a = (Entry_s *)a; Entry_s *entry_b = (Entry_s *)b; return memcmp(entry_a->name, entry_b->name, 0x40*sizeof(u16)); } - -static void sort_list(Entry_List_s * list) +static int compare_entries_by_author(const void * a, const void * b) { - if(list->entries != NULL) + Entry_s *entry_a = (Entry_s *)a; + Entry_s *entry_b = (Entry_s *)b; + + return memcmp(entry_a->author, entry_b->author, 0x40*sizeof(u16)); +} +static int compare_entries_by_filename(const void * a, const void * b) +{ + Entry_s *entry_a = (Entry_s *)a; + Entry_s *entry_b = (Entry_s *)b; + + return memcmp(entry_a->path, entry_b->path, 0x106*sizeof(u16)); +} + +static void sort_list(Entry_List_s * list, sort_comparator compare_entries) +{ + if(list->entries != NULL && list->entries != NULL) qsort(list->entries, list->entries_count, sizeof(Entry_s), compare_entries); //alphabet sort } +void sort_by_name(Entry_List_s * list) +{ + sort_list(list, compare_entries_by_name); + list->current_sort = SORT_NAME; +} +void sort_by_author(Entry_List_s * list) +{ + sort_list(list, compare_entries_by_author); + list->current_sort = SORT_AUTHOR; +} +void sort_by_filename(Entry_List_s * list) +{ + sort_list(list, compare_entries_by_filename); + list->current_sort = SORT_PATH; +} + Result load_entries(const char * loading_path, Entry_List_s * list) { Handle dir_handle; @@ -165,8 +196,6 @@ Result load_entries(const char * loading_path, Entry_List_s * list) FSDIR_Close(dir_handle); - sort_list(list); - return res; } diff --git a/source/main.c b/source/main.c index 7543c16..3a4c036 100644 --- a/source/main.c +++ b/source/main.c @@ -187,6 +187,8 @@ static void load_lists(Entry_List_s * lists) if(current_list->entries_count > current_list->entries_loaded*ICONS_OFFSET_AMOUNT) iconLoadingThread_arg.run_thread = true; + sort_by_name(current_list); + DEBUG("total: %i\n", current_list->entries_count); current_list->texture_id_offset = texture_id_offset; @@ -542,12 +544,26 @@ int main(void) } else if((kDown | kHeld) & KEY_DRIGHT) { - + sort_path: + sort_by_filename(current_list); + load_icons_first(current_list, false); } else if((kDown | kHeld) & KEY_DDOWN) { load_icons_first(current_list, false); } + else if(((kDown | kHeld)) & KEY_L) + { + sort_name: + sort_by_name(current_list); + load_icons_first(current_list, false); + } + else if(((kDown | kHeld)) & KEY_R) + { + sort_author: + sort_by_author(current_list); + load_icons_first(current_list, false); + } } continue; } @@ -665,6 +681,23 @@ int main(void) { change_selected(current_list, -current_list->entries_per_screen_v); } + else if(BETWEEN(320-144, x, 320-120)) + { + switch(current_list->current_sort) + { + case SORT_NAME: + goto sort_author; + break; + case SORT_AUTHOR: + goto sort_path; + break; + case SORT_PATH: + goto sort_name; + break; + default: + break; + } + } else if(BETWEEN(320-120, x, 320-96)) { goto enable_qr;