diff --git a/source/ui/section/extsavedata.c b/source/ui/section/extsavedata.c index 104e00a..290c255 100644 --- a/source/ui/section/extsavedata.c +++ b/source/ui/section/extsavedata.c @@ -23,6 +23,7 @@ typedef struct { bool showSD; bool showNAND; + bool sortById; bool sortByName; bool populated; @@ -116,7 +117,23 @@ static void extsavedata_options_update(ui_view* view, void* data, linked_list* i bool* val = (bool*) selected->data; *val = !(*val); - selected->color = *val ? COLOR_ENABLED : COLOR_DISABLED; + if(*val && (val == &listData->sortById || val == &listData->sortByName)) { + if(val == &listData->sortById) { + listData->sortByName = false; + } else if(val == &listData->sortByName) { + listData->sortById = false; + } + + linked_list_iter iter; + linked_list_iterate(items, &iter); + while(linked_list_iter_has_next(&iter)) { + list_item* item = (list_item*) linked_list_iter_next(&iter); + + item->color = *(bool*) item->data ? COLOR_ENABLED : COLOR_DISABLED; + } + } else { + selected->color = *val ? COLOR_ENABLED : COLOR_DISABLED; + } listData->populated = false; } @@ -124,6 +141,7 @@ static void extsavedata_options_update(ui_view* view, void* data, linked_list* i if(linked_list_size(items) == 0) { extsavedata_options_add_entry(items, "Show SD", &listData->showSD); extsavedata_options_add_entry(items, "Show NAND", &listData->showNAND); + extsavedata_options_add_entry(items, "Sort by ID", &listData->sortById); extsavedata_options_add_entry(items, "Sort by name", &listData->sortByName); } } @@ -208,17 +226,22 @@ static int extsavedata_compare(void* data, const void* p1, const void* p2) { list_item* info1 = (list_item*) p1; list_item* info2 = (list_item*) p2; - ext_save_data_info* title1 = (ext_save_data_info*) info1->data; - ext_save_data_info* title2 = (ext_save_data_info*) info2->data; + ext_save_data_info* data1 = (ext_save_data_info*) info1->data; + ext_save_data_info* data2 = (ext_save_data_info*) info2->data; - if(title1->mediaType > title2->mediaType) { + if(data1->mediaType > data2->mediaType) { return -1; - } else if(title1->mediaType < title2->mediaType) { + } else if(data1->mediaType < data2->mediaType) { return 1; } else { - if(listData->sortByName) { - bool title1HasName = title1->hasMeta && !util_is_string_empty(title1->meta.shortDescription); - bool title2HasName = title2->hasMeta && !util_is_string_empty(title2->meta.shortDescription); + if(listData->sortById) { + u64 id1 = data1->extSaveDataId; + u64 id2 = data2->extSaveDataId; + + return id1 > id2 ? 1 : id1 < id2 ? -1 : 0; + } else if(listData->sortByName) { + bool title1HasName = data1->hasMeta && !util_is_string_empty(data1->meta.shortDescription); + bool title2HasName = data2->hasMeta && !util_is_string_empty(data2->meta.shortDescription); if(title1HasName && !title2HasName) { return -1; @@ -228,10 +251,7 @@ static int extsavedata_compare(void* data, const void* p1, const void* p2) { return strcasecmp(info1->name, info2->name); } } else { - u64 id1 = title1->extSaveDataId; - u64 id2 = title2->extSaveDataId; - - return id1 > id2 ? 1 : id1 < id2 ? -1 : 0; + return 0; } } } @@ -252,6 +272,7 @@ void extsavedata_open() { data->showSD = true; data->showNAND = true; + data->sortById = false; data->sortByName = true; list_display("Ext Save Data", "A: Select, B: Return, X: Refresh, Select: Options", data, extsavedata_update, extsavedata_draw_top); diff --git a/source/ui/section/titles.c b/source/ui/section/titles.c index 5273694..869a682 100644 --- a/source/ui/section/titles.c +++ b/source/ui/section/titles.c @@ -33,7 +33,9 @@ typedef struct { bool showGameCard; bool showSD; bool showNAND; + bool sortById; bool sortByName; + bool sortBySize; bool populated; } titles_data; @@ -151,7 +153,28 @@ static void titles_options_update(ui_view* view, void* data, linked_list* items, bool* val = (bool*) selected->data; *val = !(*val); - selected->color = *val ? COLOR_ENABLED : COLOR_DISABLED; + if(*val && (val == &listData->sortById || val == &listData->sortByName || val == &listData->sortBySize)) { + if(val == &listData->sortById) { + listData->sortByName = false; + listData->sortBySize = false; + } else if(val == &listData->sortByName) { + listData->sortById = false; + listData->sortBySize = false; + } else if(val == &listData->sortBySize) { + listData->sortById = false; + listData->sortByName = false; + } + + linked_list_iter iter; + linked_list_iterate(items, &iter); + while(linked_list_iter_has_next(&iter)) { + list_item* item = (list_item*) linked_list_iter_next(&iter); + + item->color = *(bool*) item->data ? COLOR_ENABLED : COLOR_DISABLED; + } + } else { + selected->color = *val ? COLOR_ENABLED : COLOR_DISABLED; + } listData->populated = false; } @@ -160,7 +183,9 @@ static void titles_options_update(ui_view* view, void* data, linked_list* items, titles_options_add_entry(items, "Show game card", &listData->showGameCard); titles_options_add_entry(items, "Show SD", &listData->showSD); titles_options_add_entry(items, "Show NAND", &listData->showNAND); + titles_options_add_entry(items, "Sort by ID", &listData->sortById); titles_options_add_entry(items, "Sort by name", &listData->sortByName); + titles_options_add_entry(items, "Sort by size", &listData->sortBySize); } } @@ -260,7 +285,12 @@ static int titles_compare(void* data, const void* p1, const void* p2) { } else if(title1->twl && !title2->twl) { return 1; } else { - if(listData->sortByName) { + if(listData->sortById) { + u64 id1 = title1->titleId; + u64 id2 = title2->titleId; + + return id1 > id2 ? 1 : id1 < id2 ? -1 : 0; + } else if(listData->sortByName) { bool title1HasName = title1->hasMeta && !util_is_string_empty(title1->meta.shortDescription); bool title2HasName = title2->hasMeta && !util_is_string_empty(title2->meta.shortDescription); @@ -271,11 +301,13 @@ static int titles_compare(void* data, const void* p1, const void* p2) { } else { return strcasecmp(info1->name, info2->name); } - } else { - u64 id1 = title1->titleId; - u64 id2 = title2->titleId; + } else if(listData->sortBySize) { + u64 size1 = title1->installedSize; + u64 size2 = title2->installedSize; - return id1 > id2 ? 1 : id1 < id2 ? -1 : 0; + return size1 > size2 ? -1 : size1 < size2 ? 1 : 0; + } else { + return 0; } } } @@ -298,7 +330,9 @@ void titles_open() { data->showGameCard = true; data->showSD = true; data->showNAND = true; + data->sortById = false; data->sortByName = true; + data->sortBySize = false; list_display("Titles", "A: Select, B: Return, X: Refresh, Select: Options", data, titles_update, titles_draw_top); } \ No newline at end of file