Different sorting modes (#143) (#145)

This commit is contained in:
LiquidFenrir
2018-04-04 22:04:45 +02:00
committed by GitHub
parent 38e70df17b
commit 6f7c2489d5
7 changed files with 91 additions and 11 deletions

View File

@@ -62,6 +62,7 @@ enum TextureID {
TEXTURE_SHUFFLE, TEXTURE_SHUFFLE,
TEXTURE_INSTALLED, TEXTURE_INSTALLED,
TEXTURE_PREVIEW_ICON, TEXTURE_PREVIEW_ICON,
TEXTURE_SORT,
TEXTURE_DOWNLOAD, TEXTURE_DOWNLOAD,
TEXTURE_BROWSE, TEXTURE_BROWSE,
TEXTURE_LIST, TEXTURE_LIST,

View File

@@ -108,11 +108,11 @@ Instructions_s extra_instructions = {
}, },
{ {
L"\uE07B Browse ThemePlaza", L"\uE07B Browse ThemePlaza",
NULL L"\uE07C Sort by filename"
}, },
{ {
NULL, L"\uE004 Sort by name",
NULL L"\uE005 Sort by author"
}, },
{ {
L"Exit", L"Exit",

View File

@@ -38,6 +38,14 @@ enum ICON_IDS_OFFSET {
ICONS_OFFSET_AMOUNT, ICONS_OFFSET_AMOUNT,
}; };
typedef enum {
SORT_NONE,
SORT_NAME,
SORT_AUTHOR,
SORT_PATH,
} SortMode;
typedef struct { typedef struct {
u8 _padding1[4 + 2 + 2]; u8 _padding1[4 + 2 + 2];
@@ -88,6 +96,8 @@ typedef struct {
int entries_loaded; int entries_loaded;
int entry_size; int entry_size;
SortMode current_sort;
json_int_t tp_current_page; json_int_t tp_current_page;
json_int_t tp_page_count; json_int_t tp_page_count;
char * tp_search; char * tp_search;
@@ -98,6 +108,10 @@ typedef struct {
volatile bool run_thread; volatile bool run_thread;
} Thread_Arg_s; } 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); void delete_entry(Entry_s * entry, bool is_file);
Result load_entries(const char * loading_path, Entry_List_s * list); Result load_entries(const char * loading_path, Entry_List_s * list);
bool load_preview(Entry_List_s list, int * preview_offset); bool load_preview(Entry_List_s list, int * preview_offset);

BIN
romfs/sort.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

View File

@@ -43,8 +43,9 @@ void init_screens(void)
pp2d_load_texture_png(TEXTURE_ARROW_SIDE, "romfs:/arrow_side.png"); 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_SHUFFLE, "romfs:/shuffle.png");
pp2d_load_texture_png(TEXTURE_INSTALLED, "romfs:/installed.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_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_BROWSE, "romfs:/browse.png");
pp2d_load_texture_png(TEXTURE_LIST, "romfs:/list.png"); pp2d_load_texture_png(TEXTURE_LIST, "romfs:/list.png");
pp2d_load_texture_png(TEXTURE_EXIT, "romfs:/exit.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_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_DOWNLOAD, 320-120, 0, COLOR_WHITE);
pp2d_draw_texture_blend(TEXTURE_BROWSE, 320-96, 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); 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; 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_DOWNLOAD, 320-120, 0, COLOR_WHITE);
pp2d_draw_texture_blend(TEXTURE_BROWSE, 320-96, 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); pp2d_draw_texture_blend(TEXTURE_EXIT, 320-72, 0, COLOR_WHITE);

View File

@@ -104,20 +104,51 @@ static void load_smdh_icon(Entry_s entry, const ssize_t textureID)
free(image); 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_a = (Entry_s *)a;
Entry_s *entry_b = (Entry_s *)b; Entry_s *entry_b = (Entry_s *)b;
return memcmp(entry_a->name, entry_b->name, 0x40*sizeof(u16)); return memcmp(entry_a->name, entry_b->name, 0x40*sizeof(u16));
} }
static int compare_entries_by_author(const void * a, const void * b)
static void sort_list(Entry_List_s * list)
{ {
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 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) Result load_entries(const char * loading_path, Entry_List_s * list)
{ {
Handle dir_handle; Handle dir_handle;
@@ -165,8 +196,6 @@ Result load_entries(const char * loading_path, Entry_List_s * list)
FSDIR_Close(dir_handle); FSDIR_Close(dir_handle);
sort_list(list);
return res; return res;
} }

View File

@@ -187,6 +187,8 @@ static void load_lists(Entry_List_s * lists)
if(current_list->entries_count > current_list->entries_loaded*ICONS_OFFSET_AMOUNT) if(current_list->entries_count > current_list->entries_loaded*ICONS_OFFSET_AMOUNT)
iconLoadingThread_arg.run_thread = true; iconLoadingThread_arg.run_thread = true;
sort_by_name(current_list);
DEBUG("total: %i\n", current_list->entries_count); DEBUG("total: %i\n", current_list->entries_count);
current_list->texture_id_offset = texture_id_offset; current_list->texture_id_offset = texture_id_offset;
@@ -542,12 +544,26 @@ int main(void)
} }
else if((kDown | kHeld) & KEY_DRIGHT) 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) else if((kDown | kHeld) & KEY_DDOWN)
{ {
load_icons_first(current_list, false); 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; continue;
} }
@@ -665,6 +681,23 @@ int main(void)
{ {
change_selected(current_list, -current_list->entries_per_screen_v); 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)) else if(BETWEEN(320-120, x, 320-96))
{ {
goto enable_qr; goto enable_qr;