diff --git a/arm9/src/backupmenu.c b/arm9/src/backupmenu.c index 0161573..c923ce8 100644 --- a/arm9/src/backupmenu.c +++ b/arm9/src/backupmenu.c @@ -160,6 +160,8 @@ static void generateList(Menu* m) closedir(dir); + sortMenuItems(m); + m->nextPage = done; if (m->cursor >= m->itemCount) diff --git a/arm9/src/installmenu.c b/arm9/src/installmenu.c index 83426f3..79cf8d1 100644 --- a/arm9/src/installmenu.c +++ b/arm9/src/installmenu.c @@ -221,6 +221,8 @@ static void generateList(Menu* m) closedir(dir); + sortMenuItems(m); + m->nextPage = done; if (m->cursor >= m->itemCount) diff --git a/arm9/src/menu.c b/arm9/src/menu.c index 733216c..b9c5cb9 100644 --- a/arm9/src/menu.c +++ b/arm9/src/menu.c @@ -56,6 +56,24 @@ void addMenuItem(Menu* m, char const* label, char const* value, bool directory) m->itemCount += 1; } +static int alphabeticalCompare(const void* a, const void* b) +{ + const Item* itemA = (const Item*)a; + const Item* itemB = (const Item*)b; + + if (itemA->directory && !itemB->directory) + return -1; + else if (!itemA->directory && itemB->directory) + return 1; + else + return strcasecmp(itemA->label, itemB->label); +} + +void sortMenuItems(Menu* m) +{ + qsort(m->items, m->itemCount, sizeof(Item), alphabeticalCompare); +} + void setMenuHeader(Menu* m, char* str) { if (!m) return; diff --git a/arm9/src/menu.h b/arm9/src/menu.h index 088905c..ea0ebc5 100644 --- a/arm9/src/menu.h +++ b/arm9/src/menu.h @@ -25,6 +25,7 @@ Menu* newMenu(); void freeMenu(Menu* m); void addMenuItem(Menu* m, char const* label, char const* value, bool directory); +void sortMenuItems(Menu* m); void setMenuHeader(Menu* m, char* str); void resetMenu(Menu* m); diff --git a/arm9/src/titlemenu.c b/arm9/src/titlemenu.c index efc97b4..5ae2433 100644 --- a/arm9/src/titlemenu.c +++ b/arm9/src/titlemenu.c @@ -174,6 +174,8 @@ static void generateList(Menu* m) free(dirPath); } + sortMenuItems(m); + m->nextPage = done; if (m->cursor >= m->itemCount)