#pragma once #include #include "GameFixes.h" #include // --- Must be defined before inclusion --- //struct GameFixes; extern void SaveSettings(); extern void SetFixesEnabled(GameFixes fix, bool value); // Checkboxes struct FixToggle { const char* label; bool* value; GameFixes fix; const char* tooltip = nullptr; }; /** * @brief Draws an ImGui checkbox to enable or disable a game fix. * @param Checkbox A Checkbox structure containing:\n * * - label: The text displayed next to the checkbox. * * - value: Pointer to the boolean controlling the fix state. * * - fix: Identifier of the fix to enable or disable. * * - tooltip: Optional tooltip text shown on hover (may be nullptr). * * @note The fix is applied only when the checkbox state is modified by ImGui. * Programmatic changes to the bound value must trigger fix application * logic elsewhere. */ static void DrawFixCheckbox(const FixToggle& Checkbox) { if (ImGui::Checkbox(Checkbox.label, Checkbox.value)) { if (SetFixesEnabled) SetFixesEnabled(Checkbox.fix, *Checkbox.value); SaveSettings(); } if (Checkbox.tooltip && ImGui::IsItemHovered()) { ImGui::BeginTooltip(); ImGui::TextUnformatted(Checkbox.tooltip); ImGui::EndTooltip(); } } // Sliders enum class SliderType { Int, Float }; using ApplyFn = std::variant< std::monostate, void (*)(int), void (*)(float) >; struct SliderFix { const char* collapsiblelabel; const char* label; SliderType type; void* value; float min; float max; ApplyFn apply; const char* format = nullptr; const char* tooltip = nullptr; }; /** * @brief Draws an ImGui slider to adjust a game fix value. * @param slider A SliderFix structure containing:\n * * - collapsiblelabel: Optional label for a collapsible section containing this slider. * * - label: The text displayed next to the slider. * * - type: Type of slider (e.g., float, int, etc.). * * - value: Pointer to the value being modified. * * - min: Minimum value of the slider. * * - max: Maximum value of the slider. * * - apply: Function called when the slider value changes. * * - format: Optional format string for displaying the value (eg %.2f or nullptr). * * - tooltip: Optional tooltip text shown on hover (may be nullptr). * * @param width The width of the slider in ImGui units. * * @note The fix is applied only when the slider value changes via ImGui. * Programmatic changes to the bound value must trigger fix application * logic elsewhere. */ static void DrawSlider(const SliderFix& slider, float width) { if (ImGui::CollapsingHeader(slider.collapsiblelabel, ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::SetNextItemWidth(width); bool changed = false; if (slider.type == SliderType::Int) { int* v = static_cast(slider.value); changed = ImGui::SliderInt(slider.label, v, static_cast(slider.min), static_cast(slider.max)); if (changed && std::holds_alternative(slider.apply)) { auto fn = std::get(slider.apply); fn(*v); } } else { float* v = static_cast(slider.value); changed = ImGui::SliderFloat(slider.label, v, slider.min, slider.max, slider.format ? slider.format : "%.2f"); if (changed && std::holds_alternative(slider.apply)) { auto fn = std::get(slider.apply); fn(*v); } } if (changed) SaveSettings(); if (slider.tooltip && ImGui::IsItemHovered()) { ImGui::BeginTooltip(); ImGui::TextUnformatted(slider.tooltip); ImGui::EndTooltip(); } } }