Skip to content

Commit 06c45a1

Browse files
committed
feat(utils): allow custom setting value format
1 parent d7487b4 commit 06c45a1

1 file changed

Lines changed: 35 additions & 10 deletions

File tree

src/utils/settings.hpp

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ struct Setting {
6969
float min = 0.f;
7070
float max = 100.f;
7171
std::string format = "%.0f";
72+
std::function<std::string(float value)> value_format = nullptr;
7273

7374
std::function<bool()> is_enabled = [] {
7475
return true;
@@ -506,37 +507,61 @@ static void OnRegisterOverlay(reshade::api::effect_runtime* runtime) {
506507
slider_flags |= ImGuiSliderFlags_Logarithmic;
507508
}
508509
switch (setting->value_type) {
509-
case SettingValueType::FLOAT:
510+
case SettingValueType::FLOAT: {
511+
std::string fmt;
512+
if (setting->value_format) {
513+
fmt = setting->value_format(setting->value);
514+
} else {
515+
fmt = setting->format;
516+
}
517+
510518
changed |= ImGui::SliderFloat(
511519
setting->label.c_str(),
512520
&setting->value,
513521
setting->min,
514522
setting->max,
515-
setting->format.c_str(),
523+
fmt.c_str(),
516524
slider_flags);
517525
break;
518-
case SettingValueType::INTEGER:
526+
}
527+
case SettingValueType::INTEGER: {
528+
std::string int_fmt;
529+
if (setting->value_format) {
530+
int_fmt = setting->value_format(static_cast<float>(setting->value_as_int));
531+
} else if (!setting->labels.empty()) {
532+
int_fmt = setting->labels.at(setting->value_as_int);
533+
} else {
534+
int_fmt = setting->format;
535+
}
536+
519537
changed |= ImGui::SliderInt(
520538
setting->label.c_str(),
521539
&setting->value_as_int,
522540
setting->min,
523541
setting->GetMax(),
524-
setting->labels.empty()
525-
? setting->format.c_str()
526-
: setting->labels.at(setting->value_as_int).c_str(),
542+
int_fmt.c_str(),
527543
slider_flags | ImGuiSliderFlags_NoInput);
528544
break;
529-
case SettingValueType::BOOLEAN:
545+
}
546+
case SettingValueType::BOOLEAN: {
547+
std::string bool_fmt;
548+
if (setting->value_format) {
549+
bool_fmt = setting->value_format(static_cast<float>(setting->value_as_int));
550+
} else if (!setting->labels.empty()) {
551+
bool_fmt = setting->labels.at(setting->value_as_int);
552+
} else {
553+
bool_fmt = (setting->value_as_int == 0) ? "Off" : "On";
554+
}
555+
530556
changed |= ImGui::SliderInt(
531557
setting->label.c_str(),
532558
&setting->value_as_int,
533559
0,
534560
1,
535-
setting->labels.empty()
536-
? ((setting->value_as_int == 0) ? "Off" : "On") // NOLINT(readability-avoid-nested-conditional-operator)
537-
: setting->labels.at(setting->value_as_int).c_str(),
561+
bool_fmt.c_str(),
538562
slider_flags | ImGuiSliderFlags_NoInput);
539563
break;
564+
}
540565
case SettingValueType::BUTTON:
541566
if (ImGui::Button(setting->label.c_str())) {
542567
changed = setting->on_click();

0 commit comments

Comments
 (0)