Mercurial > minori
view src/core/config.cc @ 101:c537996cf67b
*: multitude of config changes
1. theme is now configurable from the settings menu
(but you have to restart for it to apply)
2. config is now stored in an INI file, with no method of
conversion from json (this repo is private-ish anyway)
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Fri, 03 Nov 2023 14:06:02 -0400 |
parents | c4bb49c2f6eb |
children | b315f3759c56 |
line wrap: on
line source
/** * config.cpp: * parses the config... lol **/ #include "core/config.h" #include "core/strings.h" #include "core/anime.h" #include "core/filesystem.h" #include "core/json.h" #include "gui/translate/anime.h" #include "gui/translate/config.h" #include "ini.h" // mINI #include <algorithm> #include <cstdlib> #include <cstring> #include <filesystem> #include <fstream> #include <limits.h> /* I'm not exactly fond of using JSON for a config file, but it's better than no config I guess. I'd like to have something more readable, e.g. YAML or even INI. */ static bool string_to_bool(const std::string& s, bool def = false) { bool b; std::istringstream is(Strings::ToLower(s)); is >> std::boolalpha >> b; return b; } static std::string bool_to_string(bool b) { std::ostringstream stream; stream << std::boolalpha << b; return stream.str(); } int Config::Load() { Filesystem::Path cfg_path = Filesystem::GetConfigPath(); if (!cfg_path.Exists()) return 0; mINI::INIFile file(cfg_path.GetPath()); mINI::INIStructure ini; file.read(ini); service = Translate::ToService(ini.get("General").get("Service")); anime_list.language = Translate::ToLanguage(ini.get("Anime List").get("Title language")); anime_list.display_aired_episodes = string_to_bool(ini.get("Anime List").get("Display only aired episodes"), true); anime_list.display_available_episodes = string_to_bool(ini.get("Anime List").get("Display only available episodes in library"), true); anime_list.highlight_anime_if_available = string_to_bool(ini.get("Anime List").get("Highlight anime if available"), true); anime_list.highlighted_anime_above_others = string_to_bool(ini.get("Anime List").get("Display highlighted anime above others")); anilist.auth_token = ini.get("AniList").get("Auth Token"); anilist.user_id = Strings::ToInt(ini.get("AniList").get("User ID")); theme = Translate::ToTheme(ini.get("Appearance").get("Theme")); return 0; } int Config::Save() { Filesystem::Path cfg_path = Filesystem::GetConfigPath(); if (!cfg_path.GetParent().Exists()) cfg_path.GetParent().CreateDirectories(); mINI::INIFile file(cfg_path.GetPath()); mINI::INIStructure ini; ini["General"]["Service"] = Translate::ToString(service); ini["Anime List"]["Title language"] = Translate::ToString(anime_list.language); ini["Anime List"]["Display only aired episodes"] = bool_to_string(anime_list.display_aired_episodes); ini["Anime List"]["Display only available episodes in library"] = bool_to_string(anime_list.display_available_episodes); ini["Anime List"]["Highlight anime if available"] = bool_to_string(anime_list.highlight_anime_if_available); ini["Anime List"]["Display highlighted anime above others"] = bool_to_string(anime_list.highlighted_anime_above_others); ini["AniList"]["Auth Token"] = anilist.auth_token; ini["AniList"]["User ID"] = std::to_string(anilist.user_id); ini["Appearance"]["Theme"] = Translate::ToString(theme); file.generate(ini); return 0; }