diff --git a/data/share/tweaks/dxvk.json b/data/share/tweaks/compat/dxvk.json similarity index 100% rename from data/share/tweaks/dxvk.json rename to data/share/tweaks/compat/dxvk.json diff --git a/data/share/tweaks/proton.json b/data/share/tweaks/compat/proton.json similarity index 100% rename from data/share/tweaks/proton.json rename to data/share/tweaks/compat/proton.json diff --git a/data/share/tweaks/gpu_amd.json b/data/share/tweaks/gpu/amd.json similarity index 100% rename from data/share/tweaks/gpu_amd.json rename to data/share/tweaks/gpu/amd.json diff --git a/data/share/tweaks/gpu_nvidia.json b/data/share/tweaks/gpu/nvidia.json similarity index 100% rename from data/share/tweaks/gpu_nvidia.json rename to data/share/tweaks/gpu/nvidia.json diff --git a/data/share/tweaks/mangohud.json b/data/share/tweaks/overlays/mangohud.json similarity index 100% rename from data/share/tweaks/mangohud.json rename to data/share/tweaks/overlays/mangohud.json diff --git a/data/share/tweaks/gamemode.json b/data/share/tweaks/performance/gamemode.json similarity index 100% rename from data/share/tweaks/gamemode.json rename to data/share/tweaks/performance/gamemode.json diff --git a/data/share/tweaks/libstrangle.json b/data/share/tweaks/performance/libstrangle.json similarity index 100% rename from data/share/tweaks/libstrangle.json rename to data/share/tweaks/performance/libstrangle.json diff --git a/data/share/tweaks/vkbasalt.json b/data/share/tweaks/postprocessing/vkbasalt.json similarity index 100% rename from data/share/tweaks/vkbasalt.json rename to data/share/tweaks/postprocessing/vkbasalt.json diff --git a/src/data/tweaks/Tweak.vala b/src/data/tweaks/Tweak.vala index dccf73fe..3e504d55 100644 --- a/src/data/tweaks/Tweak.vala +++ b/src/data/tweaks/Tweak.vala @@ -239,58 +239,64 @@ namespace GameHub.Data.Tweaks } } - private static HashMap? tweaks = null; + private static HashMap? cached_tweaks = null; public static HashMap load_tweaks(bool refresh=false) { - if(tweaks != null && tweaks.size > 0 && !refresh) + if(cached_tweaks != null && cached_tweaks.size > 0 && !refresh) { - return tweaks; + return cached_tweaks; } - tweaks = new HashMap(); + cached_tweaks = new HashMap(); foreach(var data_dir in FS.get_data_dirs("tweaks")) { - if(GameHub.Application.log_verbose) + var dir_tweaks = load_tweaks_recursive(data_dir); + if(dir_tweaks != null && dir_tweaks.size > 0) { - debug("[Tweak.load_tweaks] Directory: '%s'", data_dir.get_path()); + foreach(var tweak in dir_tweaks) + { + cached_tweaks.set(tweak.id, tweak); + } } + } - try + return cached_tweaks; + } + + private static ArrayList? load_tweaks_recursive(File directory) + { + var tweaks = new ArrayList(); + try + { + FileInfo? finfo = null; + var enumerator = directory.enumerate_children("standard::*", FileQueryInfoFlags.NOFOLLOW_SYMLINKS); + while((finfo = enumerator.next_file()) != null) { - FileInfo? finfo = null; - var enumerator = data_dir.enumerate_children("standard::*", FileQueryInfoFlags.NOFOLLOW_SYMLINKS); - while((finfo = enumerator.next_file()) != null) + var fname = finfo.get_name(); + var file = directory.get_child(fname); + if(finfo.get_file_type() == FileType.DIRECTORY) { - var fname = finfo.get_name(); - if(fname.down().has_suffix(".json")) + var subdir_tweaks = load_tweaks_recursive(file); + if(subdir_tweaks != null && subdir_tweaks.size > 0) { - var file = data_dir.get_child(fname); - var loaded_tweaks = load_from_file(file); - - if(GameHub.Application.log_verbose) - { - debug("[Tweak.load_tweaks] File: '%s'; %d tweak(s):", file.get_path(), loaded_tweaks.size); - } - - foreach(var tweak in loaded_tweaks) - { - tweaks.set(tweak.id, tweak); - - if(GameHub.Application.log_verbose) - { - debug("[Tweak.load_tweaks] %s", Json.to_string(new Json.Node(Json.NodeType.OBJECT).init_object(tweak.to_json()), false)); - } - } + tweaks.add_all(subdir_tweaks); + } + } + else if(fname.down().has_suffix(".json")) + { + var file_tweaks = load_from_file(file); + if(file_tweaks != null && file_tweaks.size > 0) + { + tweaks.add_all(file_tweaks); } } - } - catch(Error e) - { - warning("[Tweak.load_tweaks] %s", e.message); } } - + catch(Error e) + { + warning("[Tweak.load_tweaks_recursive] Error while loading tweaks from '%s': %s", directory.get_path(), e.message); + } return tweaks; } diff --git a/src/ui/widgets/tweaks/TweaksList.vala b/src/ui/widgets/tweaks/TweaksList.vala index 52024f59..620ccc7b 100644 --- a/src/ui/widgets/tweaks/TweaksList.vala +++ b/src/ui/widgets/tweaks/TweaksList.vala @@ -51,9 +51,18 @@ namespace GameHub.UI.Widgets.Tweaks if(tweaks != null && tweaks.size > 0) { - foreach(var group in tweaks.entries) + var tab_names = new ArrayList(); + tab_names.add_all(tweaks.keys); + tab_names.sort((first, second) => { + if(first == null && second == null) return 0; + if(first != null && second == null) return -1; + if(first == null && second != null) return 1; + return first.collate(second); + }); + + foreach(var tab_name in tab_names) { - var tab = new TweakGroupTab(game, compat_tool, group.key ?? _("Ungrouped"), group.value); + var tab = new TweakGroupTab(game, compat_tool, tab_name ?? _("Ungrouped"), tweaks[tab_name]); append_page(tab, new Label(tab.group)); } show_tabs = tweaks.size > 1;