Mercurial > minori
comparison src/core/config.cc @ 90:c4bb49c2f6eb
config: improve handling of vars
: )
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Tue, 31 Oct 2023 23:41:53 -0400 |
| parents | 9b2b41f83a5e |
| children | c537996cf67b |
comparison
equal
deleted
inserted
replaced
| 89:e6fab256ddc4 | 90:c4bb49c2f6eb |
|---|---|
| 4 **/ | 4 **/ |
| 5 #include "core/config.h" | 5 #include "core/config.h" |
| 6 #include "core/anime.h" | 6 #include "core/anime.h" |
| 7 #include "core/filesystem.h" | 7 #include "core/filesystem.h" |
| 8 #include "core/json.h" | 8 #include "core/json.h" |
| 9 #include "gui/translate/anime.h" | |
| 10 #include "gui/translate/config.h" | |
| 9 #include <cstdlib> | 11 #include <cstdlib> |
| 10 #include <cstring> | 12 #include <cstring> |
| 11 #include <filesystem> | 13 #include <filesystem> |
| 12 #include <fstream> | 14 #include <fstream> |
| 13 #include <limits.h> | 15 #include <limits.h> |
| 14 | |
| 15 std::map<std::string, Themes> StringToTheme = { | |
| 16 {"Default", Themes::OS }, | |
| 17 {"Light", Themes::LIGHT}, | |
| 18 {"Dark", Themes::DARK } | |
| 19 }; | |
| 20 | |
| 21 std::map<Themes, std::string> ThemeToString = { | |
| 22 {Themes::OS, "Default"}, | |
| 23 {Themes::LIGHT, "Light" }, | |
| 24 {Themes::DARK, "Dark" } | |
| 25 }; | |
| 26 | |
| 27 std::map<Anime::Services, std::string> ServiceToString{ | |
| 28 {Anime::Services::NONE, "None" }, | |
| 29 {Anime::Services::ANILIST, "AniList"} | |
| 30 }; | |
| 31 | |
| 32 std::map<std::string, Anime::Services> StringToService{ | |
| 33 {"None", Anime::Services::NONE }, | |
| 34 {"AniList", Anime::Services::ANILIST} | |
| 35 }; | |
| 36 | |
| 37 std::map<Anime::TitleLanguage, std::string> AnimeTitleToStringMap = { | |
| 38 {Anime::TitleLanguage::ROMAJI, "Romaji" }, | |
| 39 {Anime::TitleLanguage::NATIVE, "Native" }, | |
| 40 {Anime::TitleLanguage::ENGLISH, "English"} | |
| 41 }; | |
| 42 | |
| 43 std::map<std::string, Anime::TitleLanguage> StringToAnimeTitleMap = { | |
| 44 {"Romaji", Anime::TitleLanguage::ROMAJI }, | |
| 45 {"Native", Anime::TitleLanguage::NATIVE }, | |
| 46 {"English", Anime::TitleLanguage::ENGLISH} | |
| 47 }; | |
| 48 | 16 |
| 49 int Config::Load() { | 17 int Config::Load() { |
| 50 Filesystem::Path cfg_path = Filesystem::GetConfigPath(); | 18 Filesystem::Path cfg_path = Filesystem::GetConfigPath(); |
| 51 if (!cfg_path.Exists()) | 19 if (!cfg_path.Exists()) |
| 52 return 0; | 20 return 0; |
| 53 std::ifstream config(cfg_path.GetPath(), std::ifstream::in); | 21 std::ifstream config(cfg_path.GetPath(), std::ifstream::in); |
| 54 auto config_js = nlohmann::json::parse(config); | 22 auto config_js = nlohmann::json::parse(config); |
| 55 service = StringToService[JSON::GetString(config_js, "/General/Service"_json_pointer)]; | 23 service = Translate::ToService(JSON::GetString(config_js, "/General/Service"_json_pointer, "None")); |
| 56 anime_list.language = | 24 anime_list.language = Translate::ToLanguage(JSON::GetString(config_js, "/Anime List/Title language"_json_pointer, "Romaji")); |
| 57 StringToAnimeTitleMap[JSON::GetString(config_js, "/Anime List/Title language"_json_pointer, "Romaji")]; | 25 anime_list.display_aired_episodes = JSON::GetBoolean(config_js, "/Anime List/Display only aired episodes"_json_pointer, true); |
| 58 anime_list.display_aired_episodes = | 26 anime_list.display_available_episodes = JSON::GetBoolean(config_js, "/Anime List/Display only available episodes in library"_json_pointer, true); |
| 59 JSON::GetBoolean(config_js, "/Anime List/Display only aired episodes"_json_pointer, true); | 27 anime_list.highlight_anime_if_available = JSON::GetBoolean(config_js, "/Anime List/Highlight anime if available"_json_pointer, true); |
| 60 anime_list.display_available_episodes = | 28 anime_list.highlighted_anime_above_others = JSON::GetBoolean(config_js, "/Anime List/Display highlighted anime above others"_json_pointer); |
| 61 JSON::GetBoolean(config_js, "/Anime List/Display only available episodes in library"_json_pointer, true); | |
| 62 anime_list.highlight_anime_if_available = | |
| 63 JSON::GetBoolean(config_js, "/Anime List/Highlight anime if available"_json_pointer, true); | |
| 64 anime_list.highlighted_anime_above_others = | |
| 65 JSON::GetBoolean(config_js, "/Anime List/Display highlighted anime above others"_json_pointer); | |
| 66 anilist.auth_token = JSON::GetString(config_js, "/Authorization/AniList/Auth Token"_json_pointer); | 29 anilist.auth_token = JSON::GetString(config_js, "/Authorization/AniList/Auth Token"_json_pointer); |
| 67 anilist.username = JSON::GetString(config_js, "/Authorization/AniList/Username"_json_pointer); | 30 anilist.username = JSON::GetString(config_js, "/Authorization/AniList/Username"_json_pointer); |
| 68 anilist.user_id = JSON::GetInt(config_js, "/Authorization/AniList/User ID"_json_pointer); | 31 anilist.user_id = JSON::GetInt(config_js, "/Authorization/AniList/User ID"_json_pointer); |
| 69 theme = StringToTheme[JSON::GetString(config_js, "/Appearance/Theme"_json_pointer)]; | 32 theme = Translate::ToTheme(JSON::GetString(config_js, "/Appearance/Theme"_json_pointer, "Default")); |
| 70 config.close(); | 33 config.close(); |
| 71 return 0; | 34 return 0; |
| 72 } | 35 } |
| 73 | 36 |
| 74 int Config::Save() { | 37 int Config::Save() { |
| 77 cfg_path.GetParent().CreateDirectories(); | 40 cfg_path.GetParent().CreateDirectories(); |
| 78 std::ofstream config(cfg_path.GetPath(), std::ofstream::out | std::ofstream::trunc); | 41 std::ofstream config(cfg_path.GetPath(), std::ofstream::out | std::ofstream::trunc); |
| 79 /* clang-format off */ | 42 /* clang-format off */ |
| 80 nlohmann::json config_js = { | 43 nlohmann::json config_js = { |
| 81 {"General", { | 44 {"General", { |
| 82 {"Service", ServiceToString[service]} | 45 {"Service", Translate::ToString(service)} |
| 83 }}, | 46 }}, |
| 84 {"Anime List", { | 47 {"Anime List", { |
| 85 {"Title language", AnimeTitleToStringMap[anime_list.language]}, | 48 {"Title language", Translate::ToString(anime_list.language)}, |
| 86 {"Display only aired episodes", anime_list.display_aired_episodes}, | 49 {"Display only aired episodes", anime_list.display_aired_episodes}, |
| 87 {"Display only available episodes in library", anime_list.display_available_episodes}, | 50 {"Display only available episodes in library", anime_list.display_available_episodes}, |
| 88 {"Highlight anime if available", anime_list.highlight_anime_if_available}, | 51 {"Highlight anime if available", anime_list.highlight_anime_if_available}, |
| 89 {"Display highlighted anime above others", anime_list.highlighted_anime_above_others} | 52 {"Display highlighted anime above others", anime_list.highlighted_anime_above_others} |
| 90 }}, | 53 }}, |
| 94 {"Username", anilist.username}, | 57 {"Username", anilist.username}, |
| 95 {"User ID", anilist.user_id} | 58 {"User ID", anilist.user_id} |
| 96 }} | 59 }} |
| 97 }}, | 60 }}, |
| 98 {"Appearance", { | 61 {"Appearance", { |
| 99 {"Theme", ThemeToString[theme]} | 62 {"Theme", Translate::ToString(theme)} |
| 100 }} | 63 }} |
| 101 }; | 64 }; |
| 102 /* clang-format on */ | 65 /* clang-format on */ |
| 103 config << std::setw(4) << config_js << std::endl; | 66 config << std::setw(4) << config_js << std::endl; |
| 104 config.close(); | 67 config.close(); |
