From b54af62ad2906c35d7ef52c2da118f2156e2a697 Mon Sep 17 00:00:00 2001 From: Emmanuel AYME Date: Sun, 4 Jan 2026 21:30:36 +0100 Subject: [PATCH] Add Reshade ImGui widgets building --- includes/ImGuiWidgets.h | 136 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 includes/ImGuiWidgets.h diff --git a/includes/ImGuiWidgets.h b/includes/ImGuiWidgets.h new file mode 100644 index 0000000..9d5bf1c --- /dev/null +++ b/includes/ImGuiWidgets.h @@ -0,0 +1,136 @@ +#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(); + } + } +}