@@ -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,
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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
BIN
romfs/sort.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 291 B |
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user