diff --git a/source/core/linkedlist.c b/source/core/linkedlist.c index 9ac791b..80a7d12 100644 --- a/source/core/linkedlist.c +++ b/source/core/linkedlist.c @@ -141,6 +141,24 @@ bool linked_list_add_at(linked_list* list, unsigned int index, void* value) { return true; } +void linked_list_add_sorted(linked_list* list, void* value, void* userData, int (*compare)(void* userData, const void* p1, const void* p2)) { + if(compare != NULL) { + unsigned int i = 0; + linked_list_node* node = list->first; + while(node != NULL) { + if(compare(userData, value, node->value) < 0) { + linked_list_add_at(list, i, value); + return; + } + + i++; + node = node->next; + } + } + + linked_list_add(list, value); +} + static void linked_list_remove_node(linked_list* list, linked_list_node* node) { if(node->prev != NULL) { node->prev->next = node->next; diff --git a/source/core/linkedlist.h b/source/core/linkedlist.h index 73a69ac..7b10784 100644 --- a/source/core/linkedlist.h +++ b/source/core/linkedlist.h @@ -30,6 +30,7 @@ int linked_list_index_of(linked_list* list, void* value); void* linked_list_get(linked_list* list, unsigned int index); bool linked_list_add(linked_list* list, void* value); bool linked_list_add_at(linked_list* list, unsigned int index, void* value); +void linked_list_add_sorted(linked_list* list, void* value, void* userData, int (*compare)(void* userData, const void* p1, const void* p2)); bool linked_list_remove(linked_list* list, void* value); bool linked_list_remove_at(linked_list* list, unsigned int index); void linked_list_sort(linked_list* list, void* userData, int (*compare)(void* userData, const void* p1, const void* p2)); diff --git a/source/ui/section/task/listextsavedata.c b/source/ui/section/task/listextsavedata.c index 5120d8d..b13c2fa 100644 --- a/source/ui/section/task/listextsavedata.c +++ b/source/ui/section/task/listextsavedata.c @@ -81,11 +81,7 @@ static Result task_populate_ext_save_data_from(populate_ext_save_data_data* data item->data = extSaveDataInfo; - linked_list_add(data->items, item); - - if(data->compare != NULL) { - linked_list_sort(data->items, data->userData, data->compare); - } + linked_list_add_sorted(data->items, item, data->userData, data->compare); } else { free(item); diff --git a/source/ui/section/task/listtitles.c b/source/ui/section/task/listtitles.c index 413c9b0..8fbbc12 100644 --- a/source/ui/section/task/listtitles.c +++ b/source/ui/section/task/listtitles.c @@ -75,7 +75,7 @@ static Result task_populate_titles_add_ctr(populate_titles_data* data, FS_MediaT item->data = titleInfo; - linked_list_add(data->items, item); + linked_list_add_sorted(data->items, item, data->userData, data->compare); } else { free(item); @@ -206,7 +206,7 @@ static Result task_populate_titles_add_twl(populate_titles_data* data, FS_MediaT item->color = COLOR_DS_TITLE; item->data = titleInfo; - linked_list_add(data->items, item); + linked_list_add_sorted(data->items, item, data->userData, data->compare); } else { free(item); @@ -256,9 +256,7 @@ static Result task_populate_titles_from(populate_titles_data* data, FS_MediaType continue; } - if(R_SUCCEEDED(res = dsiWare ? task_populate_titles_add_twl(data, mediaType, titleIds[i]) : task_populate_titles_add_ctr(data, mediaType, titleIds[i])) && data->compare != NULL) { - linked_list_sort(data->items, data->userData, data->compare); - } + res = dsiWare ? task_populate_titles_add_twl(data, mediaType, titleIds[i]) : task_populate_titles_add_ctr(data, mediaType, titleIds[i]); } } }