Home menu: add optional special label overrides

This commit is contained in:
Megamouse 2023-07-08 11:26:55 +02:00
parent d909bbc297
commit 358735a199
3 changed files with 28 additions and 16 deletions

View File

@ -120,9 +120,10 @@ namespace rsx
struct home_menu_slider : public home_menu_setting<T, C>
{
public:
home_menu_slider(C* setting, const std::string& text, const std::string& suffix, T minimum = C::min, T maximum = C::max)
home_menu_slider(C* setting, const std::string& text, const std::string& suffix, std::map<T, std::string> special_labels = {}, T minimum = C::min, T maximum = C::max)
: home_menu_setting<T, C>(setting, text)
, m_suffix(suffix)
, m_special_labels(std::move(special_labels))
, m_minimum(minimum)
, m_maximum(maximum)
{
@ -148,15 +149,25 @@ namespace rsx
m_slider.set_pos(m_slider.x, this->y + (this->h - m_slider.h) / 2);
m_handle.set_pos(m_slider.x + static_cast<u16>(percentage * (m_slider.w - m_handle.w)), this->y + (this->h - m_handle.h) / 2);
if constexpr (std::is_floating_point<T>::value)
const auto set_label_text = [this]() -> void
{
m_value_label.set_text(fmt::format("%.2f%s", this->m_last_value, m_suffix));
}
else
{
m_value_label.set_text(fmt::format("%d%s", this->m_last_value, m_suffix));
}
if (const auto it = m_special_labels.find(this->m_last_value); it != m_special_labels.cend())
{
m_value_label.set_text(it->second);
return;
}
if constexpr (std::is_floating_point<T>::value)
{
m_value_label.set_text(fmt::format("%.2f%s", this->m_last_value, m_suffix));
}
else
{
m_value_label.set_text(fmt::format("%d%s", this->m_last_value, m_suffix));
}
};
set_label_text();
m_value_label.auto_resize();
constexpr u16 handle_margin = 10;
@ -184,6 +195,7 @@ namespace rsx
overlay_element m_handle;
label m_value_label;
std::string m_suffix;
std::map<T, std::string> m_special_labels;
T m_minimum{};
T m_maximum{};
};

View File

@ -43,7 +43,7 @@ namespace rsx
: home_menu_settings_page(x, y, width, height, use_separators, parent, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_VIDEO))
{
add_dropdown(&g_cfg.video.frame_limit, "Frame Limit");
add_unsigned_slider(&g_cfg.video.anisotropic_level_override, "Anisotropic Filter Override", "", 2);
add_unsigned_slider(&g_cfg.video.anisotropic_level_override, "Anisotropic Filter Override", "", 2, {{0, "Auto"}});
add_dropdown(&g_cfg.video.output_scaling, "Output Scaling");
if (g_cfg.video.renderer == video_renderer::vulkan && g_cfg.video.output_scaling == output_scaling_mode::fsr)
@ -65,7 +65,7 @@ namespace rsx
add_checkbox(&g_cfg.core.rsx_accurate_res_access, "Accurate RSX reservation access");
add_dropdown(&g_cfg.core.sleep_timers_accuracy, "Sleep Timers Accuracy");
add_unsigned_slider(&g_cfg.video.driver_wakeup_delay, "Driver Wake-Up Delay", " µs", 20, g_cfg.video.driver_wakeup_delay.min, 800);
add_unsigned_slider(&g_cfg.video.driver_wakeup_delay, "Driver Wake-Up Delay", " µs", 20, {}, g_cfg.video.driver_wakeup_delay.min, 800);
add_signed_slider(&g_cfg.video.vblank_rate, "VBlank Frequency", " Hz", 30);
add_checkbox(&g_cfg.video.vblank_ntsc, "VBlank NTSC Fixup");

View File

@ -88,10 +88,10 @@ namespace rsx
}
template <s64 Min, s64 Max>
void add_signed_slider(cfg::_int<Min, Max>* setting, const std::string& text, const std::string& suffix, s64 step_size, s64 minimum = Min, s64 maximum = Max)
void add_signed_slider(cfg::_int<Min, Max>* setting, const std::string& text, const std::string& suffix, s64 step_size, std::map<s64, std::string> special_labels = {}, s64 minimum = Min, s64 maximum = Max)
{
ensure(setting && setting->get_is_dynamic());
std::unique_ptr<overlay_element> elem = std::make_unique<home_menu_signed_slider<Min, Max>>(setting, text, suffix, minimum, maximum);
std::unique_ptr<overlay_element> elem = std::make_unique<home_menu_signed_slider<Min, Max>>(setting, text, suffix, special_labels, minimum, maximum);
add_item(elem, [this, setting, text, step_size, minimum, maximum](pad_button btn) -> page_navigation
{
@ -127,10 +127,10 @@ namespace rsx
}
template <u64 Min, u64 Max>
void add_unsigned_slider(cfg::uint<Min, Max>* setting, const std::string& text, const std::string& suffix, u64 step_size, u64 minimum = Min, u64 maximum = Max)
void add_unsigned_slider(cfg::uint<Min, Max>* setting, const std::string& text, const std::string& suffix, u64 step_size, std::map<u64, std::string> special_labels = {}, u64 minimum = Min, u64 maximum = Max)
{
ensure(setting && setting->get_is_dynamic());
std::unique_ptr<overlay_element> elem = std::make_unique<home_menu_unsigned_slider<Min, Max>>(setting, text, suffix, minimum, maximum);
std::unique_ptr<overlay_element> elem = std::make_unique<home_menu_unsigned_slider<Min, Max>>(setting, text, suffix, special_labels, minimum, maximum);
add_item(elem, [this, setting, text, step_size, minimum, maximum](pad_button btn) -> page_navigation
{
@ -166,10 +166,10 @@ namespace rsx
}
template <s32 Min, s32 Max>
void add_float_slider(cfg::_float<Min, Max>* setting, const std::string& text, const std::string& suffix, f32 step_size, s32 minimum = Min, s32 maximum = Max)
void add_float_slider(cfg::_float<Min, Max>* setting, const std::string& text, const std::string& suffix, f32 step_size, std::map<f64, std::string> special_labels = {}, s32 minimum = Min, s32 maximum = Max)
{
ensure(setting && setting->get_is_dynamic());
std::unique_ptr<overlay_element> elem = std::make_unique<home_menu_float_slider<Min, Max>>(setting, text, suffix, minimum, maximum);
std::unique_ptr<overlay_element> elem = std::make_unique<home_menu_float_slider<Min, Max>>(setting, text, suffix, special_labels, minimum, maximum);
add_item(elem, [this, setting, text, step_size, minimum, maximum](pad_button btn) -> page_navigation
{