diff --git a/workspace/all/common/config.c b/workspace/all/common/config.c index e1ec3ba7b..91e01c659 100644 --- a/workspace/all/common/config.c +++ b/workspace/all/common/config.c @@ -57,6 +57,9 @@ void CFG_defaults(NextUISettings *cfg) .showRecents = CFG_DEFAULT_SHOWRECENTS, .showTools = CFG_DEFAULT_SHOWTOOLS, .showCollections = CFG_DEFAULT_SHOWCOLLECTIONS, + .showCollectionsPromotion = CFG_DEFAULT_SHOWCOLLECTIONSPROMOTION, + .sortCollectionsEntries = CFG_DEFAULT_SORTCOLLECTIONSENTRIES, + .useCollectionsNestedMap = CFG_DEFAULT_USECOLLECTIONSNESTEDMAP, .showGameArt = CFG_DEFAULT_SHOWGAMEART, .gameSwitcherScaling = CFG_DEFAULT_GAMESWITCHERSCALING, .defaultView = CFG_DEFAULT_VIEW, @@ -280,6 +283,21 @@ void CFG_init(FontLoad_callback_t cb, ColorSet_callback_t ccb) CFG_setShowCollections((bool)temp_value); continue; } + if (sscanf(line, "collectionspromotion=%i", &temp_value) == 1) + { + CFG_setShowCollectionsPromotion((bool)temp_value); + continue; + } + if (sscanf(line, "collectionsentriessort=%i", &temp_value) == 1) + { + CFG_setSortCollectionsEntries((bool)temp_value); + continue; + } + if (sscanf(line, "usecollectionsnestedmap=%i", &temp_value) == 1) + { + CFG_setUseCollectionsNestedMap((bool)temp_value); + continue; + } if (sscanf(line, "gameart=%i", &temp_value) == 1) { CFG_setShowGameArt((bool)temp_value); @@ -386,6 +404,11 @@ void CFG_init(FontLoad_callback_t cb, ColorSet_callback_t ccb) CFG_setShowQuickswitcherUI(temp_value); continue; } + if (sscanf(line, "quickSwitcherUiGames=%i", &temp_value) == 1) + { + CFG_setShowQuickswitcherUIGames(temp_value); + continue; + } if (sscanf(line, "wifiDiagnostics=%i", &temp_value) == 1) { CFG_setWifiDiagnostics(temp_value); @@ -842,6 +865,39 @@ void CFG_setShowCollections(bool show) CFG_sync(); } +bool CFG_getShowCollectionsPromotion(void) +{ + return settings.showCollectionsPromotion; +} + +void CFG_setShowCollectionsPromotion(bool show) +{ + settings.showCollectionsPromotion = show; + CFG_sync(); +} + +bool CFG_getSortCollectionsEntries(void) +{ + return settings.sortCollectionsEntries; +} + +void CFG_setSortCollectionsEntries(bool show) +{ + settings.sortCollectionsEntries = show; + CFG_sync(); +} + +bool CFG_getUseCollectionsNestedMap(void) +{ + return settings.useCollectionsNestedMap; +} + +void CFG_setUseCollectionsNestedMap(bool show) +{ + settings.useCollectionsNestedMap = show; + CFG_sync(); +} + bool CFG_getShowGameArt(void) { return settings.showGameArt; @@ -992,6 +1048,17 @@ void CFG_setShowQuickswitcherUI(bool on) CFG_sync(); } +bool CFG_getShowQuickswitcherUIGames(void) +{ + return settings.showQuickSwitcherUiGames; +} + +void CFG_setShowQuickswitcherUIGames(bool on) +{ + settings.showQuickSwitcherUiGames = on; + CFG_sync(); +} + bool CFG_getWifiDiagnostics(void) { return settings.wifiDiagnostics; @@ -1392,6 +1459,18 @@ void CFG_get(const char *key, char *value) else if (strcmp(key, "collections") == 0) { sprintf(value, "%i", CFG_getShowCollections()); + } + else if (strcmp(key, "collectionspromotion") == 0) + { + sprintf(value, "%i", CFG_getShowCollectionsPromotion()); + } + else if (strcmp(key, "collectionsentriessort") == 0) + { + sprintf(value, "%i", CFG_getSortCollectionsEntries()); + } + else if (strcmp(key, "usecollectionsnestedmap") == 0) + { + sprintf(value, "%i", CFG_getUseCollectionsNestedMap()); } else if (strcmp(key, "gameart") == 0) { @@ -1469,6 +1548,10 @@ void CFG_get(const char *key, char *value) { sprintf(value, "%i", (int)(CFG_getShowQuickswitcherUI())); } + else if (strcmp(key, "quickSwitcherUiGames") == 0) + { + sprintf(value, "%i", (int)(CFG_getShowQuickswitcherUIGames())); + } else if (strcmp(key, "wifiDiagnostics") == 0) { sprintf(value, "%i", (int)(CFG_getWifiDiagnostics())); @@ -1621,6 +1704,9 @@ void CFG_sync(void) fprintf(file, "recents=%i\n", settings.showRecents); fprintf(file, "tools=%i\n", settings.showTools); fprintf(file, "collections=%i\n", settings.showCollections); + fprintf(file, "collectionspromotion=%i\n", settings.showCollectionsPromotion); + fprintf(file, "collectionsentriessort=%i\n", settings.sortCollectionsEntries); + fprintf(file, "usecollectionsnestedmap=%i\n", settings.useCollectionsNestedMap); fprintf(file, "gameart=%i\n", settings.showGameArt); fprintf(file, "showfoldernamesatroot=%i\n", settings.showFolderNamesAtRoot); fprintf(file, "screentimeout=%i\n", settings.screenTimeoutSecs); @@ -1641,6 +1727,7 @@ void CFG_sync(void) fprintf(file, "wifi=%i\n", settings.wifi); fprintf(file, "defaultView=%i\n", settings.defaultView); fprintf(file, "quickSwitcherUi=%i\n", settings.showQuickSwitcherUi); + fprintf(file, "quickSwitcherUiGames=%i\n", settings.showQuickSwitcherUiGames); fprintf(file, "wifiDiagnostics=%i\n", settings.wifiDiagnostics); fprintf(file, "bluetooth=%i\n", settings.bluetooth); fprintf(file, "btDiagnostics=%i\n", settings.bluetoothDiagnostics); @@ -1695,6 +1782,9 @@ void CFG_print(void) printf("\t\"recents\": %i,\n", settings.showRecents); printf("\t\"tools\": %i,\n", settings.showTools); printf("\t\"collections\": %i,\n", settings.showCollections); + printf("\t\"collectionspromotion\": %i,\n", settings.showCollectionsPromotion); + printf("\t\"collectionsentriessort\": %i,\n", settings.sortCollectionsEntries); + printf("\t\"usecollectionsnestedmap\": %i,\n", settings.useCollectionsNestedMap); printf("\t\"gameart\": %i,\n", settings.showGameArt); printf("\t\"showfoldernamesatroot\": %i,\n", settings.showFolderNamesAtRoot); printf("\t\"screentimeout\": %i,\n", settings.screenTimeoutSecs); @@ -1715,6 +1805,7 @@ void CFG_print(void) printf("\t\"wifi\": %i,\n", settings.wifi); printf("\t\"defaultView\": %i,\n", settings.defaultView); printf("\t\"quickSwitcherUi\": %i,\n", settings.showQuickSwitcherUi); + printf("\t\"quickSwitcherUiGames\": %i,\n", settings.showQuickSwitcherUiGames); printf("\t\"wifiDiagnostics\": %i,\n", settings.wifiDiagnostics); printf("\t\"bluetooth\": %i,\n", settings.bluetooth); printf("\t\"btDiagnostics\": %i,\n", settings.bluetoothDiagnostics); diff --git a/workspace/all/common/config.h b/workspace/all/common/config.h index cdd577866..1a23cd526 100644 --- a/workspace/all/common/config.h +++ b/workspace/all/common/config.h @@ -135,10 +135,14 @@ typedef struct bool showRecents; bool showTools; bool showCollections; + bool showCollectionsPromotion; + bool sortCollectionsEntries; + bool useCollectionsNestedMap; bool showGameArt; bool showFolderNamesAtRoot; bool romsUseFolderBackground; bool showQuickSwitcherUi; + bool showQuickSwitcherUiGames; int defaultView; // Mute switch @@ -223,6 +227,9 @@ typedef struct #define CFG_DEFAULT_SHOWMENUTRANSITIONS TRANSITION_SNAPPY #define CFG_DEFAULT_SHOWRECENTS true #define CFG_DEFAULT_SHOWCOLLECTIONS true +#define CFG_DEFAULT_SHOWCOLLECTIONSPROMOTION true +#define CFG_DEFAULT_SORTCOLLECTIONSENTRIES true +#define CFG_DEFAULT_USECOLLECTIONSNESTEDMAP false #define CFG_DEFAULT_SHOWGAMEART true #define CFG_DEFAULT_SHOWFOLDERNAMESATROOT true #define CFG_DEFAULT_GAMESWITCHERSCALING GFX_SCALE_FULLSCREEN @@ -241,6 +248,7 @@ typedef struct #define CFG_DEFAULT_WIFI false #define CFG_DEFAULT_VIEW SCREEN_GAMELIST #define CFG_DEFAULT_SHOWQUICKWITCHERUI true +#define CFG_DEFAULT_SHOWQUICKWITCHERUIGAMES true #define CFG_DEFAULT_WIFI_DIAG false #define CFG_DEFAULT_SHOWTOOLS true #define CFG_DEFAULT_BLUETOOTH false @@ -356,6 +364,15 @@ void CFG_setShowTools(bool show); // Show/hide collections in the main menu. bool CFG_getShowCollections(void); void CFG_setShowCollections(bool show); +// Show/hide collections promotion in the main menu. +bool CFG_getShowCollectionsPromotion(void); +void CFG_setShowCollectionsPromotion(bool show); +// Sort collections entries for roms. +bool CFG_getSortCollectionsEntries(void); +void CFG_setSortCollectionsEntries(bool show); +// Use Nested Collections map.txt for roms. +bool CFG_getUseCollectionsNestedMap(void); +void CFG_setUseCollectionsNestedMap(bool show); // Show/hide game art in the main menu. bool CFG_getShowGameArt(void); void CFG_setShowGameArt(bool show); @@ -408,6 +425,9 @@ void CFG_setDefaultView(int view); // Quick switcher UI painting on/off bool CFG_getShowQuickswitcherUI(void); void CFG_setShowQuickswitcherUI(bool on); +// Quick switcher UI Games painting on/off +bool CFG_getShowQuickswitcherUIGames(void); +void CFG_setShowQuickswitcherUIGames(bool on); // WiFi diagnostic logging on/off bool CFG_getWifiDiagnostics(void); void CFG_setWifiDiagnostics(bool on); diff --git a/workspace/all/nextui/nextui.c b/workspace/all/nextui/nextui.c index 5ed6d612e..d8cd69e42 100644 --- a/workspace/all/nextui/nextui.c +++ b/workspace/all/nextui/nextui.c @@ -245,7 +245,24 @@ static void Directory_index(Directory* self) { Hash* map = NULL; char map_path[256]; - sprintf(map_path, "%s/map.txt", is_collection ? COLLECTIONS_PATH : self->path); + char base_path[256]; + + strcpy(base_path, self->path); + char* tmp = strrchr(base_path, '/') + 1; + tmp[0] = '\0'; + + sprintf(map_path, "%s/map.txt", is_collection ? COLLECTIONS_PATH : self->path); // previous logic + + if (is_collection && CFG_getUseCollectionsNestedMap()){ + if(suffixMatch(".txt", self->path)){ + sprintf(map_path, "%smap.txt", base_path); + } else { + sprintf(map_path, "%s/map.txt", self->path); + } + + if (!exists(map_path)) + sprintf(map_path, "%s/map.txt", COLLECTIONS_PATH); + } if (exists(map_path)) { FILE* file = fopen(map_path, "r"); @@ -294,7 +311,7 @@ static void Directory_index(Directory* self) { Array_free(self->entries); self->entries = entries; } - if (resort) EntryArray_sort(self->entries); + if ((resort && !is_collection) || (resort && is_collection && CFG_getSortCollectionsEntries())) EntryArray_sort(self->entries); } } @@ -371,7 +388,7 @@ static Directory* Directory_new(char* path, int selected) { self->entries = getRecents(); } else if (exactMatch(path, ROMS_PATH)) { - self->entries = getRoms(); + self->entries = getRoot(); } else if (!exactMatch(path, COLLECTIONS_PATH) && prefixMatch(COLLECTIONS_PATH, path) && suffixMatch(".txt", path)) { self->entries = getCollection(path); @@ -815,7 +832,8 @@ static Array* getQuickEntries(void) { Array_push(entries, Entry_new(COLLECTIONS_PATH, ENTRY_DIR)); // Not sure we need this, its just a button press away (B) - Array_push(entries, Entry_newNamed(ROMS_PATH, ENTRY_DIR, "Games")); + if(CFG_getShowQuickswitcherUIGames()) + Array_push(entries, Entry_newNamed(ROMS_PATH, ENTRY_DIR, "Games")); // Add tools if applicable if (hasTools() && !simple_mode) { @@ -861,7 +879,7 @@ static Array* getRoot(void) { // Handle collections if (hasCollections() && CFG_getShowCollections()) { - if (entries->count) { + if (entries->count || !CFG_getShowCollectionsPromotion()) { Array_push(root, Entry_new(COLLECTIONS_PATH, ENTRY_DIR)); } else { // No visible systems, promote collections to root Array *collections = getCollections(); diff --git a/workspace/all/settings/settings.cpp b/workspace/all/settings/settings.cpp index 7a3eeda49..27f1db477 100644 --- a/workspace/all/settings/settings.cpp +++ b/workspace/all/settings/settings.cpp @@ -465,6 +465,22 @@ int main(int argc, char *argv[]) []() -> std::any { return CFG_getShowTools(); }, [](const std::any &value) { CFG_setShowTools(std::any_cast(value)); }, []() { CFG_setShowTools(CFG_DEFAULT_SHOWTOOLS);}}); + appearanceItems.push_back(new MenuItem{ListItemType::Generic, "Show Collections", "Show \"Collections\" menu entry in game list.", {false, true}, on_off, + []() -> std::any { return CFG_getShowCollections(); }, + [](const std::any &value) { CFG_setShowCollections(std::any_cast(value)); }, + []() { CFG_setShowCollections(CFG_DEFAULT_SHOWCOLLECTIONS);}}); + appearanceItems.push_back(new MenuItem{ListItemType::Generic, "Show Collections Promotion", "Show \"Collections\" menu entries in root game list\nOnly occurs when all Game folders are hidden.", {false, true}, on_off, + []() -> std::any { return CFG_getShowCollectionsPromotion(); }, + [](const std::any &value) { CFG_setShowCollectionsPromotion(std::any_cast(value)); }, + []() { CFG_setShowCollectionsPromotion(CFG_DEFAULT_SHOWCOLLECTIONSPROMOTION);}}); + appearanceItems.push_back(new MenuItem{ListItemType::Generic, "Sort Collections Entries", "Sort \"Collections\" entries alphabetically.\nOtherwise uses order listed in Collection file.", {false, true}, on_off, + []() -> std::any { return CFG_getSortCollectionsEntries(); }, + [](const std::any &value) { CFG_setSortCollectionsEntries(std::any_cast(value)); }, + []() { CFG_setSortCollectionsEntries(CFG_DEFAULT_SORTCOLLECTIONSENTRIES);}}); + appearanceItems.push_back(new MenuItem{ListItemType::Generic, "Use Collections Nested Map", "Use map.txt contained within \"Collections\" subfolders.\nFalls back to map.txt in root Collections folder if not found.", {false, true}, on_off, + []() -> std::any { return CFG_getUseCollectionsNestedMap(); }, + [](const std::any &value) { CFG_setUseCollectionsNestedMap(std::any_cast(value)); }, + []() { CFG_setUseCollectionsNestedMap(CFG_DEFAULT_USECOLLECTIONSNESTEDMAP);}}); appearanceItems.push_back(new MenuItem{ListItemType::Generic, "Show game art", "Show game artwork in the main menu", {false, true}, on_off, []() -> std::any { return CFG_getShowGameArt(); }, [](const std::any &value) { CFG_setShowGameArt(std::any_cast(value)); },