This commit is contained in:
Malkierian 2025-04-28 19:14:36 -07:00
commit 0166448dc5
4 changed files with 126 additions and 87 deletions

View file

@ -114,7 +114,8 @@ enum PresetSection {
struct PresetInfo { struct PresetInfo {
nlohmann::json presetValues; nlohmann::json presetValues;
std::string fileName; std::string fileName;
bool applySettings = true, applyEnhancements = true, applyAudio = true, applyCosmetics = true, applyRando = true, applyTrackers = true; bool applySettings = true, applyEnhancements = true, applyAudio = true, applyCosmetics = true, applyRando = true,
applyTrackers = true;
}; };
static std::map<std::string, PresetInfo> presets; static std::map<std::string, PresetInfo> presets;
@ -137,7 +138,8 @@ void DrawSectionCheck(const std::string& name, bool empty, bool* pointer, std::s
} else { } else {
ImGui::PushFont(OTRGlobals::Instance->fontMono); ImGui::PushFont(OTRGlobals::Instance->fontMono);
ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::GetStyle().FramePadding.y)); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::GetStyle().FramePadding.y));
UIWidgets::Checkbox(("##" + name + section).c_str(), pointer, {.defaultValue = true, .padding = {6.0f, 6.0f}, .color = THEME_COLOR}); UIWidgets::Checkbox(("##" + name + section).c_str(), pointer,
{ .defaultValue = true, .padding = { 6.0f, 6.0f }, .color = THEME_COLOR });
ImGui::PopFont(); ImGui::PopFont();
} }
} }
@ -152,7 +154,8 @@ void LoadPresets() {
auto json = nlohmann::json::parse(ifs); auto json = nlohmann::json::parse(ifs);
try { try {
if (!json.contains("presetName")) { if (!json.contains("presetName")) {
spdlog::error(fmt::format("Attempted to load file {} as a preset, but was not a preset file.", preset.path().filename().string())); spdlog::error(fmt::format("Attempted to load file {} as a preset, but was not a preset file.",
preset.path().filename().string()));
return; return;
} }
presets[json["presetName"]].presetValues = json; presets[json["presetName"]].presetValues = json;
@ -172,11 +175,15 @@ void SavePreset(std::string& presetName) {
file.close(); file.close();
} }
std::vector<std::string> sections = { CVAR_PREFIX_SETTING, CVAR_PREFIX_WINDOW, CVAR_PREFIX_ENHANCEMENT, CVAR_PREFIX_RANDOMIZER_ENHANCEMENT, std::vector<std::string> sections = {
CVAR_PREFIX_AUDIO, CVAR_PREFIX_COSMETIC, CVAR_PREFIX_RANDOMIZER_SETTING, CVAR_PREFIX_TRACKER, CVAR_PREFIX_CHEAT }; CVAR_PREFIX_SETTING, CVAR_PREFIX_WINDOW, CVAR_PREFIX_ENHANCEMENT, CVAR_PREFIX_RANDOMIZER_ENHANCEMENT,
CVAR_PREFIX_AUDIO, CVAR_PREFIX_COSMETIC, CVAR_PREFIX_RANDOMIZER_SETTING, CVAR_PREFIX_TRACKER,
CVAR_PREFIX_CHEAT
};
static std::string newPresetName; static std::string newPresetName;
static bool newPresetSettings = true, newPresetEnhancements = true, newPresetAudio = true, newPresetCosmetics = true, newPresetRando = true, newPresetTrackers = true; static bool newPresetSettings = true, newPresetEnhancements = true, newPresetAudio = true, newPresetCosmetics = true,
newPresetRando = true, newPresetTrackers = true;
void PresetsCustomWidget(WidgetInfo& info) { void PresetsCustomWidget(WidgetInfo& info) {
ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest);
@ -185,43 +192,69 @@ void PresetsCustomWidget(WidgetInfo& info) {
} }
ImGui::SetNextWindowSize({ 400, 400 }); ImGui::SetNextWindowSize({ 400, 400 });
if (ImGui::BeginPopup("newPreset", ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | if (ImGui::BeginPopup("newPreset", ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize |
ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar |
ImGuiWindowFlags_NoTitleBar)) { ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoTitleBar)) {
bool nameExists = presets.contains(newPresetName); bool nameExists = presets.contains(newPresetName);
UIWidgets::InputString("Preset Name", &newPresetName, UIWidgets::InputOptions().Color(THEME_COLOR).Size({200, 40}) UIWidgets::InputString("Preset Name", &newPresetName,
.ComponentAlignment(UIWidgets::ComponentAlignments::Right).LabelPosition(UIWidgets::LabelPositions::Near).ErrorText("Preset name already exists").HasError(nameExists)); UIWidgets::InputOptions()
.Color(THEME_COLOR)
.Size({ 200, 40 })
.ComponentAlignment(UIWidgets::ComponentAlignments::Right)
.LabelPosition(UIWidgets::LabelPositions::Near)
.ErrorText("Preset name already exists")
.HasError(nameExists));
nameExists = presets.contains(newPresetName); nameExists = presets.contains(newPresetName);
bool noneSelected = !newPresetSettings && !newPresetEnhancements && !newPresetAudio && !newPresetCosmetics && !newPresetRando && !newPresetTrackers; bool noneSelected = !newPresetSettings && !newPresetEnhancements && !newPresetAudio && !newPresetCosmetics &&
const char* disabledTooltip = (newPresetName.empty() ? "Preset name is empty" : (noneSelected ? "No sections selected" : "Preset name already exists")); !newPresetRando && !newPresetTrackers;
UIWidgets::Checkbox("Save Settings", &newPresetSettings, UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({6.0f, 6.0f})); const char* disabledTooltip =
UIWidgets::Checkbox("Save Enhancements", &newPresetEnhancements, UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({6.0f, 6.0f})); (newPresetName.empty() ? "Preset name is empty"
UIWidgets::Checkbox("Save Audio", &newPresetAudio, UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({6.0f, 6.0f})); : (noneSelected ? "No sections selected" : "Preset name already exists"));
UIWidgets::Checkbox("Save Cosmetics", &newPresetCosmetics, UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({6.0f, 6.0f})); UIWidgets::Checkbox("Save Settings", &newPresetSettings,
UIWidgets::Checkbox("Save Rando Settings", &newPresetRando, UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({6.0f, 6.0f})); UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({ 6.0f, 6.0f }));
UIWidgets::Checkbox("Save Trackers", &newPresetTrackers, UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({6.0f, 6.0f})); UIWidgets::Checkbox("Save Enhancements", &newPresetEnhancements,
if (UIWidgets::Button("Save", UIWidgets::ButtonOptions({.disabled = nameExists || noneSelected || newPresetName.empty(), .disabledTooltip = disabledTooltip}) UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({ 6.0f, 6.0f }));
.Padding({6.0f, 6.0f}).Color(THEME_COLOR))) { UIWidgets::Checkbox("Save Audio", &newPresetAudio,
UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({ 6.0f, 6.0f }));
UIWidgets::Checkbox("Save Cosmetics", &newPresetCosmetics,
UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({ 6.0f, 6.0f }));
UIWidgets::Checkbox("Save Rando Settings", &newPresetRando,
UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({ 6.0f, 6.0f }));
UIWidgets::Checkbox("Save Trackers", &newPresetTrackers,
UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({ 6.0f, 6.0f }));
if (UIWidgets::Button(
"Save", UIWidgets::ButtonOptions({ .disabled = nameExists || noneSelected || newPresetName.empty(),
.disabledTooltip = disabledTooltip })
.Padding({ 6.0f, 6.0f })
.Color(THEME_COLOR))) {
presets[newPresetName] = {}; presets[newPresetName] = {};
auto config = Ship::Context::GetInstance()->GetConfig()->GetNestedJson(); auto config = Ship::Context::GetInstance()->GetConfig()->GetNestedJson();
if (newPresetSettings) { if (newPresetSettings) {
presets[newPresetName].presetValues["blocks"]["settings"][CVAR_PREFIX_SETTING] = config["CVars"][CVAR_PREFIX_SETTING]; presets[newPresetName].presetValues["blocks"]["settings"][CVAR_PREFIX_SETTING] =
presets[newPresetName].presetValues["blocks"]["windows"][CVAR_PREFIX_WINDOW] = config["CVars"][CVAR_PREFIX_WINDOW]; config["CVars"][CVAR_PREFIX_SETTING];
presets[newPresetName].presetValues["blocks"]["windows"][CVAR_PREFIX_WINDOW] =
config["CVars"][CVAR_PREFIX_WINDOW];
} }
if (newPresetEnhancements) { if (newPresetEnhancements) {
presets[newPresetName].presetValues["blocks"]["enhancements"][CVAR_PREFIX_ENHANCEMENT] = config["CVars"][CVAR_PREFIX_ENHANCEMENT]; presets[newPresetName].presetValues["blocks"]["enhancements"][CVAR_PREFIX_ENHANCEMENT] =
presets[newPresetName].presetValues["blocks"]["randoEnhancements"][CVAR_PREFIX_RANDOMIZER_ENHANCEMENT] = config["CVars"][CVAR_PREFIX_RANDOMIZER_ENHANCEMENT]; config["CVars"][CVAR_PREFIX_ENHANCEMENT];
presets[newPresetName].presetValues["blocks"]["randoEnhancements"][CVAR_PREFIX_RANDOMIZER_ENHANCEMENT] =
config["CVars"][CVAR_PREFIX_RANDOMIZER_ENHANCEMENT];
} }
if (newPresetAudio) { if (newPresetAudio) {
presets[newPresetName].presetValues["blocks"]["audio"][CVAR_PREFIX_AUDIO] = config["CVars"][CVAR_PREFIX_AUDIO]; presets[newPresetName].presetValues["blocks"]["audio"][CVAR_PREFIX_AUDIO] =
config["CVars"][CVAR_PREFIX_AUDIO];
} }
if (newPresetCosmetics) { if (newPresetCosmetics) {
presets[newPresetName].presetValues["blocks"]["cosmetics"][CVAR_PREFIX_COSMETIC] = config["CVars"][CVAR_PREFIX_COSMETIC]; presets[newPresetName].presetValues["blocks"]["cosmetics"][CVAR_PREFIX_COSMETIC] =
config["CVars"][CVAR_PREFIX_COSMETIC];
} }
if (newPresetRando) { if (newPresetRando) {
presets[newPresetName].presetValues["blocks"]["rando"][CVAR_PREFIX_RANDOMIZER_SETTING] = config["CVars"][CVAR_PREFIX_RANDOMIZER_SETTING]; presets[newPresetName].presetValues["blocks"]["rando"][CVAR_PREFIX_RANDOMIZER_SETTING] =
config["CVars"][CVAR_PREFIX_RANDOMIZER_SETTING];
} }
if (newPresetTrackers) { if (newPresetTrackers) {
presets[newPresetName].presetValues["blocks"]["trackers"][CVAR_PREFIX_TRACKER] = config["CVars"][CVAR_PREFIX_TRACKER]; presets[newPresetName].presetValues["blocks"]["trackers"][CVAR_PREFIX_TRACKER] =
config["CVars"][CVAR_PREFIX_TRACKER];
} }
presets[newPresetName].fileName = newPresetName; presets[newPresetName].fileName = newPresetName;
SavePreset(newPresetName); SavePreset(newPresetName);
@ -242,8 +275,10 @@ void PresetsCustomWidget(WidgetInfo& info) {
ImGui::TableSetupColumn("Cosmetics"); ImGui::TableSetupColumn("Cosmetics");
ImGui::TableSetupColumn("Randomizer"); ImGui::TableSetupColumn("Randomizer");
ImGui::TableSetupColumn("Trackers"); ImGui::TableSetupColumn("Trackers");
ImGui::TableSetupColumn("Apply", ImGuiTableColumnFlags_WidthFixed, ImGui::CalcTextSize("Apply").x + ImGui::GetStyle().FramePadding.x * 2); ImGui::TableSetupColumn("Apply", ImGuiTableColumnFlags_WidthFixed,
ImGui::TableSetupColumn("Delete", ImGuiTableColumnFlags_WidthFixed, ImGui::CalcTextSize("Delete").x + ImGui::GetStyle().FramePadding.x * 2); ImGui::CalcTextSize("Apply").x + ImGui::GetStyle().FramePadding.x * 2);
ImGui::TableSetupColumn("Delete", ImGuiTableColumnFlags_WidthFixed,
ImGui::CalcTextSize("Delete").x + ImGui::GetStyle().FramePadding.x * 2);
BlankButton(); BlankButton();
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::TableNextColumn(); ImGui::TableNextColumn();
@ -285,11 +320,13 @@ void PresetsCustomWidget(WidgetInfo& info) {
ImGui::TableNextColumn(); ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("settings"), &info.applySettings, "settings"); DrawSectionCheck(name, !info.presetValues["blocks"].contains("settings"), &info.applySettings, "settings");
ImGui::TableNextColumn(); ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("enhancements"), &info.applyEnhancements, "enhancements"); DrawSectionCheck(name, !info.presetValues["blocks"].contains("enhancements"), &info.applyEnhancements,
"enhancements");
ImGui::TableNextColumn(); ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("audio"), &info.applyAudio, "audio"); DrawSectionCheck(name, !info.presetValues["blocks"].contains("audio"), &info.applyAudio, "audio");
ImGui::TableNextColumn(); ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("cosmetics"), &info.applyCosmetics, "cosmetics"); DrawSectionCheck(name, !info.presetValues["blocks"].contains("cosmetics"), &info.applyCosmetics,
"cosmetics");
ImGui::TableNextColumn(); ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("rando"), &info.applyRando, "rando"); DrawSectionCheck(name, !info.presetValues["blocks"].contains("rando"), &info.applyRando, "rando");
ImGui::TableNextColumn(); ImGui::TableNextColumn();
@ -302,7 +339,8 @@ void PresetsCustomWidget(WidgetInfo& info) {
if (section[item.key()].is_null()) { if (section[item.key()].is_null()) {
CVarClearBlock(item.key().c_str()); CVarClearBlock(item.key().c_str());
} else { } else {
Ship::Context::GetInstance()->GetConfig()->SetBlock(fmt::format("{}.{}", "CVars", item.key()), item.value()); Ship::Context::GetInstance()->GetConfig()->SetBlock(
fmt::format("{}.{}", "CVars", item.key()), item.value());
Ship::Context::GetInstance()->GetConsoleVariables()->Load(); Ship::Context::GetInstance()->GetConsoleVariables()->Load();
} }
} }
@ -332,8 +370,7 @@ void PresetsCustomWidget(WidgetInfo& info) {
void RegisterPresetsWidgets() { void RegisterPresetsWidgets() {
SohGui::mSohMenu->AddSidebarEntry("Settings", "Presets", 1); SohGui::mSohMenu->AddSidebarEntry("Settings", "Presets", 1);
WidgetPath path = { "Settings", "Presets", SECTION_COLUMN_1 }; WidgetPath path = { "Settings", "Presets", SECTION_COLUMN_1 };
SohGui::mSohMenu->AddWidget(path, "PresetsWidget", WIDGET_CUSTOM) SohGui::mSohMenu->AddWidget(path, "PresetsWidget", WIDGET_CUSTOM).CustomFunction(PresetsCustomWidget);
.CustomFunction(PresetsCustomWidget);
presetFolder = Ship::Context::GetInstance()->GetPathRelativeToAppDirectory("presets"); presetFolder = Ship::Context::GetInstance()->GetPathRelativeToAppDirectory("presets");
LoadPresets(); LoadPresets();
} }

View file

@ -3672,7 +3672,8 @@ void RandomizerSettingsWindow::DrawElement() {
// ImGui::SetCursorPosY(ImGui::GetCursorPos().y + 35.f); // ImGui::SetCursorPosY(ImGui::GetCursorPos().y + 35.f);
// if (UIWidgets::Button( // if (UIWidgets::Button(
// "Apply Preset##Randomizer", // "Apply Preset##Randomizer",
// UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f)))) { // UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f))))
// {
// if (randomizerPresetSelected >= presetTypeDef.presets.size()) { // if (randomizerPresetSelected >= presetTypeDef.presets.size()) {
// randomizerPresetSelected = 0; // randomizerPresetSelected = 0;
// } // }

View file

@ -972,7 +972,8 @@ bool CVarColorPicker(const char* label, const char* cvarName, Color_RGBA8 defaul
UIWidgets::CheckboxOptions({ { .tooltip = "Prevents this color from being changed" } }).Color(themeColor)); UIWidgets::CheckboxOptions({ { .tooltip = "Prevents this color from being changed" } }).Color(themeColor));
} }
if (changed) { if (changed) {
if (color.r == defaultColor.r && color.g == defaultColor.g && color.b == defaultColor.b && color.a == defaultColor.a) { if (color.r == defaultColor.r && color.g == defaultColor.g && color.b == defaultColor.b &&
color.a == defaultColor.a) {
CVarClear(valueCVar.c_str()); CVarClear(valueCVar.c_str());
} else { } else {
color.r = (uint8_t)(colorVec.x * 255.0f); color.r = (uint8_t)(colorVec.x * 255.0f);