mirror of
https://github.com/open-goal/jak-project.git
synced 2024-11-27 08:20:47 +00:00
60db0e5ef9
This updates `fmt` to the latest version and moves to just being a copy of their repo to make updating easier (no editing their cmake / figuring out which files to minimally include). The motivation for this is now that we switched to C++ 20, there were a ton of deprecated function usages that is going away in future compiler versions. This gets rid of all those warnings.
104 lines
3.1 KiB
C++
104 lines
3.1 KiB
C++
#include "config.h"
|
|
|
|
#include "common/versions/versions.h"
|
|
|
|
#include "fmt/core.h"
|
|
|
|
namespace REPL {
|
|
void to_json(json& j, const Config& obj) {
|
|
j = json{
|
|
{"gameVersionFolder", obj.game_version_folder},
|
|
{"numConnectToTargetAttempts", obj.target_connect_attempts},
|
|
{"asmFileSearchDirs", obj.asm_file_search_dirs},
|
|
{"keybinds", obj.keybinds},
|
|
{"perGameHistory", obj.per_game_history},
|
|
};
|
|
}
|
|
|
|
void from_json(const json& j, Config& obj) {
|
|
if (j.contains("gameVersionFolder")) {
|
|
j.at("gameVersionFolder").get_to(obj.game_version_folder);
|
|
}
|
|
if (j.contains("numConnectToTargetAttempts")) {
|
|
j.at("numConnectToTargetAttempts").get_to(obj.target_connect_attempts);
|
|
}
|
|
if (j.contains("asmFileSearchDirs")) {
|
|
j.at("asmFileSearchDirs").get_to(obj.asm_file_search_dirs);
|
|
}
|
|
if (j.contains("appendKeybinds")) {
|
|
j.at("appendKeybinds").get_to(obj.append_keybinds);
|
|
}
|
|
if (j.contains("keybinds")) {
|
|
std::vector<KeyBind> keybinds = j.at("keybinds");
|
|
if (!obj.append_keybinds) {
|
|
obj.keybinds = keybinds;
|
|
} else {
|
|
// append the keybinds
|
|
// - start with the provided ones
|
|
// - skip ones from the default set if they have the same key + modifier combination
|
|
for (const auto& default_bind : obj.keybinds) {
|
|
// check if it's a duplicate bind
|
|
bool duplicate = false;
|
|
for (const auto& new_bind : keybinds) {
|
|
if (new_bind.key == default_bind.key && new_bind.modifier == default_bind.modifier) {
|
|
duplicate = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!duplicate) {
|
|
keybinds.push_back(default_bind);
|
|
}
|
|
}
|
|
obj.keybinds = keybinds;
|
|
}
|
|
}
|
|
if (j.contains("perGameHistory")) {
|
|
j.at("perGameHistory").get_to(obj.per_game_history);
|
|
}
|
|
// if there is game specific configuration, override any values we just set
|
|
if (j.contains(version_to_game_name(obj.game_version))) {
|
|
from_json(j.at(version_to_game_name(obj.game_version)), obj);
|
|
}
|
|
}
|
|
|
|
std::string KeyBind::string() const {
|
|
switch (modifier) {
|
|
case KeyBind::Modifier::CTRL:
|
|
return fmt::format("CTRL-{}", key);
|
|
case KeyBind::Modifier::SHIFT:
|
|
return fmt::format("SHIFT-{}", key);
|
|
case KeyBind::Modifier::META:
|
|
return fmt::format("META-{}", key);
|
|
}
|
|
}
|
|
|
|
void to_json(json& j, const KeyBind& obj) {
|
|
j = json{{"description", obj.description}, {"command", obj.command}, {"key", obj.key}};
|
|
switch (obj.modifier) {
|
|
case KeyBind::Modifier::CTRL:
|
|
j["modifier"] = "ctrl";
|
|
break;
|
|
case KeyBind::Modifier::SHIFT:
|
|
j["modifier"] = "shift";
|
|
break;
|
|
case KeyBind::Modifier::META:
|
|
j["modifier"] = "meta";
|
|
break;
|
|
}
|
|
}
|
|
|
|
void from_json(const json& j, KeyBind& obj) {
|
|
j.at("description").get_to(obj.description);
|
|
j.at("command").get_to(obj.command);
|
|
j.at("key").get_to(obj.key);
|
|
auto modString = j.at("modifier").get<std::string>();
|
|
if (modString == "ctrl") {
|
|
obj.modifier = KeyBind::Modifier::CTRL;
|
|
} else if (modString == "shift") {
|
|
obj.modifier = KeyBind::Modifier::SHIFT;
|
|
} else if (modString == "meta") {
|
|
obj.modifier = KeyBind::Modifier::META;
|
|
}
|
|
}
|
|
} // namespace REPL
|