Add Reshade ImGui widgets building
This commit is contained in:
136
includes/ImGuiWidgets.h
Normal file
136
includes/ImGuiWidgets.h
Normal file
@@ -0,0 +1,136 @@
|
||||
#pragma once
|
||||
#include <variant>
|
||||
#include "GameFixes.h"
|
||||
#include <imgui.h>
|
||||
|
||||
// --- 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<int*>(slider.value);
|
||||
changed = ImGui::SliderInt(slider.label, v, static_cast<int>(slider.min), static_cast<int>(slider.max));
|
||||
|
||||
if (changed && std::holds_alternative<void (*)(int)>(slider.apply)) {
|
||||
auto fn = std::get<void (*)(int)>(slider.apply);
|
||||
fn(*v);
|
||||
}
|
||||
}
|
||||
else {
|
||||
float* v = static_cast<float*>(slider.value);
|
||||
changed = ImGui::SliderFloat(slider.label, v, slider.min, slider.max, slider.format ? slider.format : "%.2f");
|
||||
|
||||
if (changed && std::holds_alternative<void (*)(float)>(slider.apply)) {
|
||||
auto fn = std::get<void (*)(float)>(slider.apply);
|
||||
fn(*v);
|
||||
}
|
||||
}
|
||||
|
||||
if (changed) SaveSettings();
|
||||
|
||||
if (slider.tooltip && ImGui::IsItemHovered()) {
|
||||
ImGui::BeginTooltip();
|
||||
ImGui::TextUnformatted(slider.tooltip);
|
||||
ImGui::EndTooltip();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user