settings: Retro-port Citra Settings work

This has yet to be PR'd on Citra, but regressions on yuzu that have
been fixed in Citra needed to appear here.
This commit is contained in:
lat9nq 2023-09-13 13:31:46 -04:00
parent 85e1754728
commit 0098ecb609
2 changed files with 38 additions and 8 deletions

View file

@ -225,6 +225,16 @@ public:
*/ */
[[nodiscard]] virtual constexpr u32 EnumIndex() const = 0; [[nodiscard]] virtual constexpr u32 EnumIndex() const = 0;
/**
* @returns True if the underlying type is a floating point storage
*/
[[nodiscard]] virtual constexpr bool IsFloatingPoint() const = 0;
/**
* @returns True if the underlying type is a integer storage
*/
[[nodiscard]] virtual constexpr bool IsIntegral() const = 0;
/* /*
* Switchable settings * Switchable settings
*/ */

View file

@ -10,6 +10,7 @@
#include <string> #include <string>
#include <typeindex> #include <typeindex>
#include <typeinfo> #include <typeinfo>
#include <fmt/core.h>
#include "common/common_types.h" #include "common/common_types.h"
#include "common/settings_common.h" #include "common/settings_common.h"
#include "common/settings_enums.h" #include "common/settings_enums.h"
@ -112,11 +113,12 @@ protected:
return value_.has_value() ? std::to_string(*value_) : "none"; return value_.has_value() ? std::to_string(*value_) : "none";
} else if constexpr (std::is_same_v<Type, bool>) { } else if constexpr (std::is_same_v<Type, bool>) {
return value_ ? "true" : "false"; return value_ ? "true" : "false";
} else if constexpr (std::is_same_v<Type, AudioEngine>) { } else if constexpr (std::is_floating_point_v<Type>) {
// Compatibility with old AudioEngine setting being a string return fmt::format("{:f}", value_);
return CanonicalizeEnum(value_); } else if constexpr (std::is_enum_v<Type>) {
return std::to_string(static_cast<u32>(value_));
} else { } else {
return std::to_string(static_cast<u64>(value_)); return std::to_string(value_);
} }
} }
@ -180,13 +182,15 @@ public:
this->SetValue(static_cast<u32>(std::stoul(input))); this->SetValue(static_cast<u32>(std::stoul(input)));
} else if constexpr (std::is_same_v<Type, bool>) { } else if constexpr (std::is_same_v<Type, bool>) {
this->SetValue(input == "true"); this->SetValue(input == "true");
} else if constexpr (std::is_same_v<Type, AudioEngine>) { } else if constexpr (std::is_same_v<Type, float>) {
this->SetValue(ToEnum<Type>(input)); this->SetValue(std::stof(input));
} else { } else {
this->SetValue(static_cast<Type>(std::stoll(input))); this->SetValue(static_cast<Type>(std::stoll(input)));
} }
} catch (std::invalid_argument&) { } catch (std::invalid_argument&) {
this->SetValue(this->GetDefault()); this->SetValue(this->GetDefault());
} catch (std::out_of_range&) {
this->SetValue(this->GetDefault());
} }
} }
@ -215,12 +219,28 @@ public:
} }
} }
[[nodiscard]] constexpr bool IsFloatingPoint() const final {
return std::is_floating_point_v<Type>;
}
[[nodiscard]] constexpr bool IsIntegral() const final {
return std::is_integral_v<Type>;
}
[[nodiscard]] std::string MinVal() const override final { [[nodiscard]] std::string MinVal() const override final {
if constexpr (std::is_arithmetic_v<Type> && !ranged) {
return this->ToString(std::numeric_limits<Type>::min());
} else {
return this->ToString(minimum); return this->ToString(minimum);
} }
}
[[nodiscard]] std::string MaxVal() const override final { [[nodiscard]] std::string MaxVal() const override final {
if constexpr (std::is_arithmetic_v<Type> && !ranged) {
return this->ToString(std::numeric_limits<Type>::max());
} else {
return this->ToString(maximum); return this->ToString(maximum);
} }
}
[[nodiscard]] constexpr bool Ranged() const override { [[nodiscard]] constexpr bool Ranged() const override {
return ranged; return ranged;