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 {
nlohmann::json presetValues;
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;
@ -137,7 +138,8 @@ void DrawSectionCheck(const std::string& name, bool empty, bool* pointer, std::s
} else {
ImGui::PushFont(OTRGlobals::Instance->fontMono);
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();
}
}
@ -152,7 +154,8 @@ void LoadPresets() {
auto json = nlohmann::json::parse(ifs);
try {
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;
}
presets[json["presetName"]].presetValues = json;
@ -172,11 +175,15 @@ void SavePreset(std::string& presetName) {
file.close();
}
std::vector<std::string> sections = { 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 };
std::vector<std::string> sections = {
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 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) {
ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest);
@ -185,43 +192,69 @@ void PresetsCustomWidget(WidgetInfo& info) {
}
ImGui::SetNextWindowSize({ 400, 400 });
if (ImGui::BeginPopup("newPreset", ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize |
ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings |
ImGuiWindowFlags_NoTitleBar)) {
ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar |
ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoTitleBar)) {
bool nameExists = presets.contains(newPresetName);
UIWidgets::InputString("Preset Name", &newPresetName, UIWidgets::InputOptions().Color(THEME_COLOR).Size({200, 40})
.ComponentAlignment(UIWidgets::ComponentAlignments::Right).LabelPosition(UIWidgets::LabelPositions::Near).ErrorText("Preset name already exists").HasError(nameExists));
UIWidgets::InputString("Preset Name", &newPresetName,
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);
bool noneSelected = !newPresetSettings && !newPresetEnhancements && !newPresetAudio && !newPresetCosmetics && !newPresetRando && !newPresetTrackers;
const char* disabledTooltip = (newPresetName.empty() ? "Preset name is empty" : (noneSelected ? "No sections selected" : "Preset name already exists"));
UIWidgets::Checkbox("Save Settings", &newPresetSettings, UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({6.0f, 6.0f}));
UIWidgets::Checkbox("Save Enhancements", &newPresetEnhancements, UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({6.0f, 6.0f}));
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))) {
bool noneSelected = !newPresetSettings && !newPresetEnhancements && !newPresetAudio && !newPresetCosmetics &&
!newPresetRando && !newPresetTrackers;
const char* disabledTooltip =
(newPresetName.empty() ? "Preset name is empty"
: (noneSelected ? "No sections selected" : "Preset name already exists"));
UIWidgets::Checkbox("Save Settings", &newPresetSettings,
UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({ 6.0f, 6.0f }));
UIWidgets::Checkbox("Save Enhancements", &newPresetEnhancements,
UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({ 6.0f, 6.0f }));
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] = {};
auto config = Ship::Context::GetInstance()->GetConfig()->GetNestedJson();
if (newPresetSettings) {
presets[newPresetName].presetValues["blocks"]["settings"][CVAR_PREFIX_SETTING] = config["CVars"][CVAR_PREFIX_SETTING];
presets[newPresetName].presetValues["blocks"]["windows"][CVAR_PREFIX_WINDOW] = config["CVars"][CVAR_PREFIX_WINDOW];
presets[newPresetName].presetValues["blocks"]["settings"][CVAR_PREFIX_SETTING] =
config["CVars"][CVAR_PREFIX_SETTING];
presets[newPresetName].presetValues["blocks"]["windows"][CVAR_PREFIX_WINDOW] =
config["CVars"][CVAR_PREFIX_WINDOW];
}
if (newPresetEnhancements) {
presets[newPresetName].presetValues["blocks"]["enhancements"][CVAR_PREFIX_ENHANCEMENT] = config["CVars"][CVAR_PREFIX_ENHANCEMENT];
presets[newPresetName].presetValues["blocks"]["randoEnhancements"][CVAR_PREFIX_RANDOMIZER_ENHANCEMENT] = config["CVars"][CVAR_PREFIX_RANDOMIZER_ENHANCEMENT];
presets[newPresetName].presetValues["blocks"]["enhancements"][CVAR_PREFIX_ENHANCEMENT] =
config["CVars"][CVAR_PREFIX_ENHANCEMENT];
presets[newPresetName].presetValues["blocks"]["randoEnhancements"][CVAR_PREFIX_RANDOMIZER_ENHANCEMENT] =
config["CVars"][CVAR_PREFIX_RANDOMIZER_ENHANCEMENT];
}
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) {
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) {
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) {
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;
SavePreset(newPresetName);
@ -242,8 +275,10 @@ void PresetsCustomWidget(WidgetInfo& info) {
ImGui::TableSetupColumn("Cosmetics");
ImGui::TableSetupColumn("Randomizer");
ImGui::TableSetupColumn("Trackers");
ImGui::TableSetupColumn("Apply", ImGuiTableColumnFlags_WidthFixed, ImGui::CalcTextSize("Apply").x + ImGui::GetStyle().FramePadding.x * 2);
ImGui::TableSetupColumn("Delete", ImGuiTableColumnFlags_WidthFixed, ImGui::CalcTextSize("Delete").x + ImGui::GetStyle().FramePadding.x * 2);
ImGui::TableSetupColumn("Apply", ImGuiTableColumnFlags_WidthFixed,
ImGui::CalcTextSize("Apply").x + ImGui::GetStyle().FramePadding.x * 2);
ImGui::TableSetupColumn("Delete", ImGuiTableColumnFlags_WidthFixed,
ImGui::CalcTextSize("Delete").x + ImGui::GetStyle().FramePadding.x * 2);
BlankButton();
ImGui::TableNextRow();
ImGui::TableNextColumn();
@ -285,11 +320,13 @@ void PresetsCustomWidget(WidgetInfo& info) {
ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("settings"), &info.applySettings, "settings");
ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("enhancements"), &info.applyEnhancements, "enhancements");
DrawSectionCheck(name, !info.presetValues["blocks"].contains("enhancements"), &info.applyEnhancements,
"enhancements");
ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("audio"), &info.applyAudio, "audio");
ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("cosmetics"), &info.applyCosmetics, "cosmetics");
DrawSectionCheck(name, !info.presetValues["blocks"].contains("cosmetics"), &info.applyCosmetics,
"cosmetics");
ImGui::TableNextColumn();
DrawSectionCheck(name, !info.presetValues["blocks"].contains("rando"), &info.applyRando, "rando");
ImGui::TableNextColumn();
@ -302,7 +339,8 @@ void PresetsCustomWidget(WidgetInfo& info) {
if (section[item.key()].is_null()) {
CVarClearBlock(item.key().c_str());
} 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();
}
}
@ -332,8 +370,7 @@ void PresetsCustomWidget(WidgetInfo& info) {
void RegisterPresetsWidgets() {
SohGui::mSohMenu->AddSidebarEntry("Settings", "Presets", 1);
WidgetPath path = { "Settings", "Presets", SECTION_COLUMN_1 };
SohGui::mSohMenu->AddWidget(path, "PresetsWidget", WIDGET_CUSTOM)
.CustomFunction(PresetsCustomWidget);
SohGui::mSohMenu->AddWidget(path, "PresetsWidget", WIDGET_CUSTOM).CustomFunction(PresetsCustomWidget);
presetFolder = Ship::Context::GetInstance()->GetPathRelativeToAppDirectory("presets");
LoadPresets();
}

View file

@ -3672,7 +3672,8 @@ void RandomizerSettingsWindow::DrawElement() {
// ImGui::SetCursorPosY(ImGui::GetCursorPos().y + 35.f);
// if (UIWidgets::Button(
// "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()) {
// 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));
}
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());
} else {
color.r = (uint8_t)(colorVec.x * 255.0f);