mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-11-04 04:34:07 +01:00 
			
		
		
		
	Merge pull request #11492 from lat9nq/c-numeric-conversions
general: Remove uncaught usages of C++ string number conversions
This commit is contained in:
		
						commit
						c05ea35f78
					
				@ -282,7 +282,7 @@ void Config::ReadValues() {
 | 
			
		||||
    std::stringstream ss(title_list);
 | 
			
		||||
    std::string line;
 | 
			
		||||
    while (std::getline(ss, line, '|')) {
 | 
			
		||||
        const auto title_id = std::stoul(line, nullptr, 16);
 | 
			
		||||
        const auto title_id = std::strtoul(line.c_str(), nullptr, 16);
 | 
			
		||||
        const auto disabled_list = config->Get("AddOns", "disabled_" + line, "");
 | 
			
		||||
 | 
			
		||||
        std::stringstream inner_ss(disabled_list);
 | 
			
		||||
 | 
			
		||||
@ -225,6 +225,16 @@ public:
 | 
			
		||||
     */
 | 
			
		||||
    [[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 an integer storage
 | 
			
		||||
     */
 | 
			
		||||
    [[nodiscard]] virtual constexpr bool IsIntegral() const = 0;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Switchable settings
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,7 @@
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <typeindex>
 | 
			
		||||
#include <typeinfo>
 | 
			
		||||
#include <fmt/core.h>
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "common/settings_common.h"
 | 
			
		||||
#include "common/settings_enums.h"
 | 
			
		||||
@ -115,8 +116,12 @@ protected:
 | 
			
		||||
        } else if constexpr (std::is_same_v<Type, AudioEngine>) {
 | 
			
		||||
            // Compatibility with old AudioEngine setting being a string
 | 
			
		||||
            return CanonicalizeEnum(value_);
 | 
			
		||||
        } else if constexpr (std::is_floating_point_v<Type>) {
 | 
			
		||||
            return fmt::format("{:f}", value_);
 | 
			
		||||
        } else if constexpr (std::is_enum_v<Type>) {
 | 
			
		||||
            return std::to_string(static_cast<u32>(value_));
 | 
			
		||||
        } else {
 | 
			
		||||
            return std::to_string(static_cast<u64>(value_));
 | 
			
		||||
            return std::to_string(value_);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -180,13 +185,15 @@ public:
 | 
			
		||||
                this->SetValue(static_cast<u32>(std::stoul(input)));
 | 
			
		||||
            } else if constexpr (std::is_same_v<Type, bool>) {
 | 
			
		||||
                this->SetValue(input == "true");
 | 
			
		||||
            } else if constexpr (std::is_same_v<Type, AudioEngine>) {
 | 
			
		||||
                this->SetValue(ToEnum<Type>(input));
 | 
			
		||||
            } else if constexpr (std::is_same_v<Type, float>) {
 | 
			
		||||
                this->SetValue(std::stof(input));
 | 
			
		||||
            } else {
 | 
			
		||||
                this->SetValue(static_cast<Type>(std::stoll(input)));
 | 
			
		||||
            }
 | 
			
		||||
        } catch (std::invalid_argument&) {
 | 
			
		||||
            this->SetValue(this->GetDefault());
 | 
			
		||||
        } catch (std::out_of_range&) {
 | 
			
		||||
            this->SetValue(this->GetDefault());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -215,11 +222,27 @@ 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 {
 | 
			
		||||
        return this->ToString(minimum);
 | 
			
		||||
        if constexpr (std::is_arithmetic_v<Type> && !ranged) {
 | 
			
		||||
            return this->ToString(std::numeric_limits<Type>::min());
 | 
			
		||||
        } else {
 | 
			
		||||
            return this->ToString(minimum);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    [[nodiscard]] std::string MaxVal() const override final {
 | 
			
		||||
        return this->ToString(maximum);
 | 
			
		||||
        if constexpr (std::is_arithmetic_v<Type> && !ranged) {
 | 
			
		||||
            return this->ToString(std::numeric_limits<Type>::max());
 | 
			
		||||
        } else {
 | 
			
		||||
            return this->ToString(maximum);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [[nodiscard]] constexpr bool Ranged() const override {
 | 
			
		||||
 | 
			
		||||
@ -724,14 +724,14 @@ void KeyManager::LoadFromFile(const std::filesystem::path& file_path, bool is_ti
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                const auto index = std::stoul(out[0].substr(8, 2), nullptr, 16);
 | 
			
		||||
                const auto index = std::strtoul(out[0].substr(8, 2).c_str(), nullptr, 16);
 | 
			
		||||
                keyblobs[index] = Common::HexStringToArray<0x90>(out[1]);
 | 
			
		||||
            } else if (out[0].compare(0, 18, "encrypted_keyblob_") == 0) {
 | 
			
		||||
                if (!ValidCryptoRevisionString(out[0], 18, 2)) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                const auto index = std::stoul(out[0].substr(18, 2), nullptr, 16);
 | 
			
		||||
                const auto index = std::strtoul(out[0].substr(18, 2).c_str(), nullptr, 16);
 | 
			
		||||
                encrypted_keyblobs[index] = Common::HexStringToArray<0xB0>(out[1]);
 | 
			
		||||
            } else if (out[0].compare(0, 20, "eticket_extended_kek") == 0) {
 | 
			
		||||
                eticket_extended_kek = Common::HexStringToArray<576>(out[1]);
 | 
			
		||||
@ -750,7 +750,7 @@ void KeyManager::LoadFromFile(const std::filesystem::path& file_path, bool is_ti
 | 
			
		||||
                    }
 | 
			
		||||
                    if (out[0].compare(0, kv.second.size(), kv.second) == 0) {
 | 
			
		||||
                        const auto index =
 | 
			
		||||
                            std::stoul(out[0].substr(kv.second.size(), 2), nullptr, 16);
 | 
			
		||||
                            std::strtoul(out[0].substr(kv.second.size(), 2).c_str(), nullptr, 16);
 | 
			
		||||
                        const auto sub = kv.first.second;
 | 
			
		||||
                        if (sub == 0) {
 | 
			
		||||
                            s128_keys[{kv.first.first, index, 0}] =
 | 
			
		||||
@ -770,7 +770,7 @@ void KeyManager::LoadFromFile(const std::filesystem::path& file_path, bool is_ti
 | 
			
		||||
                    const auto& match = kak_names[j];
 | 
			
		||||
                    if (out[0].compare(0, std::strlen(match), match) == 0) {
 | 
			
		||||
                        const auto index =
 | 
			
		||||
                            std::stoul(out[0].substr(std::strlen(match), 2), nullptr, 16);
 | 
			
		||||
                            std::strtoul(out[0].substr(std::strlen(match), 2).c_str(), nullptr, 16);
 | 
			
		||||
                        s128_keys[{S128KeyType::KeyArea, index, j}] =
 | 
			
		||||
                            Common::HexStringToArray<16>(out[1]);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@ -165,7 +165,7 @@ static std::string EscapeStringSequences(std::string in) {
 | 
			
		||||
void IPSwitchCompiler::ParseFlag(const std::string& line) {
 | 
			
		||||
    if (StartsWith(line, "@flag offset_shift ")) {
 | 
			
		||||
        // Offset Shift Flag
 | 
			
		||||
        offset_shift = std::stoll(line.substr(19), nullptr, 0);
 | 
			
		||||
        offset_shift = std::strtoll(line.substr(19).c_str(), nullptr, 0);
 | 
			
		||||
    } else if (StartsWith(line, "@little-endian")) {
 | 
			
		||||
        // Set values to read as little endian
 | 
			
		||||
        is_little_endian = true;
 | 
			
		||||
@ -263,7 +263,7 @@ void IPSwitchCompiler::Parse() {
 | 
			
		||||
                // 11 - 8 hex digit offset + space + minimum two digit overwrite val
 | 
			
		||||
                if (patch_line.length() < 11)
 | 
			
		||||
                    break;
 | 
			
		||||
                auto offset = std::stoul(patch_line.substr(0, 8), nullptr, 16);
 | 
			
		||||
                auto offset = std::strtoul(patch_line.substr(0, 8).c_str(), nullptr, 16);
 | 
			
		||||
                offset += static_cast<unsigned long>(offset_shift);
 | 
			
		||||
 | 
			
		||||
                std::vector<u8> replace;
 | 
			
		||||
 | 
			
		||||
@ -154,7 +154,7 @@ std::vector<CheatEntry> TextCheatParser::Parse(std::string_view data) const {
 | 
			
		||||
                return {};
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const auto value = static_cast<u32>(std::stoul(hex, nullptr, 0x10));
 | 
			
		||||
            const auto value = static_cast<u32>(std::strtoul(hex.c_str(), nullptr, 0x10));
 | 
			
		||||
            out[*current_entry].definition.opcodes[out[*current_entry].definition.num_opcodes++] =
 | 
			
		||||
                value;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@
 | 
			
		||||
#include "yuzu/configuration/configure_ui.h"
 | 
			
		||||
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
#include <set>
 | 
			
		||||
#include <stdexcept>
 | 
			
		||||
#include <string>
 | 
			
		||||
@ -94,11 +95,7 @@ static void PopulateResolutionComboBox(QComboBox* screenshot_height, QWidget* pa
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static u32 ScreenshotDimensionToInt(const QString& height) {
 | 
			
		||||
    try {
 | 
			
		||||
        return std::stoi(height.toStdString());
 | 
			
		||||
    } catch (std::invalid_argument&) {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return std::strtoul(height.toUtf8(), nullptr, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ConfigureUi::ConfigureUi(Core::System& system_, QWidget* parent)
 | 
			
		||||
 | 
			
		||||
@ -63,7 +63,7 @@ static QString DefaultSuffix(QWidget* parent, Settings::BasicSetting& setting) {
 | 
			
		||||
        return tr("%", context.c_str());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return QStringLiteral("");
 | 
			
		||||
    return default_suffix;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPushButton* Widget::CreateRestoreGlobalButton(bool using_global, QWidget* parent) {
 | 
			
		||||
@ -71,7 +71,7 @@ QPushButton* Widget::CreateRestoreGlobalButton(bool using_global, QWidget* paren
 | 
			
		||||
 | 
			
		||||
    QStyle* style = parent->style();
 | 
			
		||||
    QIcon* icon = new QIcon(style->standardIcon(QStyle::SP_LineEditClearButton));
 | 
			
		||||
    QPushButton* restore_button = new QPushButton(*icon, QStringLiteral(""), parent);
 | 
			
		||||
    QPushButton* restore_button = new QPushButton(*icon, QStringLiteral(), parent);
 | 
			
		||||
    restore_button->setObjectName(QStringLiteral("RestoreButton%1").arg(restore_button_count));
 | 
			
		||||
    restore_button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
 | 
			
		||||
 | 
			
		||||
@ -151,7 +151,7 @@ QWidget* Widget::CreateCombobox(std::function<std::string()>& serializer,
 | 
			
		||||
        return -1;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const u32 setting_value = std::stoi(setting.ToString());
 | 
			
		||||
    const u32 setting_value = std::strtoul(setting.ToString().c_str(), nullptr, 0);
 | 
			
		||||
    combobox->setCurrentIndex(find_index(setting_value));
 | 
			
		||||
 | 
			
		||||
    serializer = [this, enumeration]() {
 | 
			
		||||
@ -160,7 +160,7 @@ QWidget* Widget::CreateCombobox(std::function<std::string()>& serializer,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    restore_func = [this, find_index]() {
 | 
			
		||||
        const u32 global_value = std::stoi(RelevantDefault(setting));
 | 
			
		||||
        const u32 global_value = std::strtoul(RelevantDefault(setting).c_str(), nullptr, 0);
 | 
			
		||||
        combobox->setCurrentIndex(find_index(global_value));
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@ -209,7 +209,7 @@ QWidget* Widget::CreateRadioGroup(std::function<std::string()>& serializer,
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const u32 setting_value = std::stoi(setting.ToString());
 | 
			
		||||
    const u32 setting_value = std::strtoul(setting.ToString().c_str(), nullptr, 0);
 | 
			
		||||
    set_index(setting_value);
 | 
			
		||||
 | 
			
		||||
    serializer = [get_selected]() {
 | 
			
		||||
@ -218,7 +218,7 @@ QWidget* Widget::CreateRadioGroup(std::function<std::string()>& serializer,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    restore_func = [this, set_index]() {
 | 
			
		||||
        const u32 global_value = std::stoi(RelevantDefault(setting));
 | 
			
		||||
        const u32 global_value = std::strtoul(RelevantDefault(setting).c_str(), nullptr, 0);
 | 
			
		||||
        set_index(global_value);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@ -255,6 +255,59 @@ QWidget* Widget::CreateLineEdit(std::function<std::string()>& serializer,
 | 
			
		||||
    return line_edit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void CreateIntSlider(Settings::BasicSetting& setting, bool reversed, float multiplier,
 | 
			
		||||
                            QLabel* feedback, const QString& use_format, QSlider* slider,
 | 
			
		||||
                            std::function<std::string()>& serializer,
 | 
			
		||||
                            std::function<void()>& restore_func) {
 | 
			
		||||
    const int max_val = std::strtol(setting.MaxVal().c_str(), nullptr, 0);
 | 
			
		||||
 | 
			
		||||
    const auto update_feedback = [=](int value) {
 | 
			
		||||
        int present = (reversed ? max_val - value : value) * multiplier + 0.5f;
 | 
			
		||||
        feedback->setText(use_format.arg(QVariant::fromValue(present).value<QString>()));
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    QObject::connect(slider, &QAbstractSlider::valueChanged, update_feedback);
 | 
			
		||||
    update_feedback(std::strtol(setting.ToString().c_str(), nullptr, 0));
 | 
			
		||||
 | 
			
		||||
    slider->setMinimum(std::strtol(setting.MinVal().c_str(), nullptr, 0));
 | 
			
		||||
    slider->setMaximum(max_val);
 | 
			
		||||
    slider->setValue(std::strtol(setting.ToString().c_str(), nullptr, 0));
 | 
			
		||||
 | 
			
		||||
    serializer = [slider]() { return std::to_string(slider->value()); };
 | 
			
		||||
    restore_func = [slider, &setting]() {
 | 
			
		||||
        slider->setValue(std::strtol(RelevantDefault(setting).c_str(), nullptr, 0));
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void CreateFloatSlider(Settings::BasicSetting& setting, bool reversed, float multiplier,
 | 
			
		||||
                              QLabel* feedback, const QString& use_format, QSlider* slider,
 | 
			
		||||
                              std::function<std::string()>& serializer,
 | 
			
		||||
                              std::function<void()>& restore_func) {
 | 
			
		||||
    const float max_val = std::strtof(setting.MaxVal().c_str(), nullptr);
 | 
			
		||||
    const float min_val = std::strtof(setting.MinVal().c_str(), nullptr);
 | 
			
		||||
    const float use_multiplier =
 | 
			
		||||
        multiplier == default_multiplier ? default_float_multiplier : multiplier;
 | 
			
		||||
 | 
			
		||||
    const auto update_feedback = [=](float value) {
 | 
			
		||||
        int present = (reversed ? max_val - value : value) + 0.5f;
 | 
			
		||||
        feedback->setText(use_format.arg(QVariant::fromValue(present).value<QString>()));
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    QObject::connect(slider, &QAbstractSlider::valueChanged, update_feedback);
 | 
			
		||||
    update_feedback(std::strtof(setting.ToString().c_str(), nullptr));
 | 
			
		||||
 | 
			
		||||
    slider->setMinimum(min_val * use_multiplier);
 | 
			
		||||
    slider->setMaximum(max_val * use_multiplier);
 | 
			
		||||
    slider->setValue(std::strtof(setting.ToString().c_str(), nullptr) * use_multiplier);
 | 
			
		||||
 | 
			
		||||
    serializer = [slider, use_multiplier]() {
 | 
			
		||||
        return std::to_string(slider->value() / use_multiplier);
 | 
			
		||||
    };
 | 
			
		||||
    restore_func = [slider, &setting, use_multiplier]() {
 | 
			
		||||
        slider->setValue(std::strtof(RelevantDefault(setting).c_str(), nullptr) * use_multiplier);
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QWidget* Widget::CreateSlider(bool reversed, float multiplier, const QString& given_suffix,
 | 
			
		||||
                              std::function<std::string()>& serializer,
 | 
			
		||||
                              std::function<void()>& restore_func,
 | 
			
		||||
@ -278,27 +331,19 @@ QWidget* Widget::CreateSlider(bool reversed, float multiplier, const QString& gi
 | 
			
		||||
 | 
			
		||||
    layout->setContentsMargins(0, 0, 0, 0);
 | 
			
		||||
 | 
			
		||||
    int max_val = std::stoi(setting.MaxVal());
 | 
			
		||||
 | 
			
		||||
    QString suffix =
 | 
			
		||||
        given_suffix == QStringLiteral("") ? DefaultSuffix(this, setting) : given_suffix;
 | 
			
		||||
    QString suffix = given_suffix == default_suffix ? DefaultSuffix(this, setting) : given_suffix;
 | 
			
		||||
 | 
			
		||||
    const QString use_format = QStringLiteral("%1").append(suffix);
 | 
			
		||||
 | 
			
		||||
    QObject::connect(slider, &QAbstractSlider::valueChanged, [=](int value) {
 | 
			
		||||
        int present = (reversed ? max_val - value : value) * multiplier + 0.5f;
 | 
			
		||||
        feedback->setText(use_format.arg(QVariant::fromValue(present).value<QString>()));
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    slider->setMinimum(std::stoi(setting.MinVal()));
 | 
			
		||||
    slider->setMaximum(max_val);
 | 
			
		||||
    slider->setValue(std::stoi(setting.ToString()));
 | 
			
		||||
    if (setting.IsIntegral()) {
 | 
			
		||||
        CreateIntSlider(setting, reversed, multiplier, feedback, use_format, slider, serializer,
 | 
			
		||||
                        restore_func);
 | 
			
		||||
    } else {
 | 
			
		||||
        CreateFloatSlider(setting, reversed, multiplier, feedback, use_format, slider, serializer,
 | 
			
		||||
                          restore_func);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    slider->setInvertedAppearance(reversed);
 | 
			
		||||
    slider->setInvertedControls(reversed);
 | 
			
		||||
 | 
			
		||||
    serializer = [this]() { return std::to_string(slider->value()); };
 | 
			
		||||
    restore_func = [this]() { slider->setValue(std::stoi(RelevantDefault(setting))); };
 | 
			
		||||
 | 
			
		||||
    if (!Settings::IsConfiguringGlobal()) {
 | 
			
		||||
        QObject::connect(slider, &QAbstractSlider::actionTriggered, [touch]() { touch(); });
 | 
			
		||||
@ -311,14 +356,11 @@ QWidget* Widget::CreateSpinBox(const QString& given_suffix,
 | 
			
		||||
                               std::function<std::string()>& serializer,
 | 
			
		||||
                               std::function<void()>& restore_func,
 | 
			
		||||
                               const std::function<void()>& touch) {
 | 
			
		||||
    const int min_val =
 | 
			
		||||
        setting.Ranged() ? std::stoi(setting.MinVal()) : std::numeric_limits<int>::min();
 | 
			
		||||
    const int max_val =
 | 
			
		||||
        setting.Ranged() ? std::stoi(setting.MaxVal()) : std::numeric_limits<int>::max();
 | 
			
		||||
    const int default_val = std::stoi(setting.ToString());
 | 
			
		||||
    const auto min_val = std::strtol(setting.MinVal().c_str(), nullptr, 0);
 | 
			
		||||
    const auto max_val = std::strtol(setting.MaxVal().c_str(), nullptr, 0);
 | 
			
		||||
    const auto default_val = std::strtol(setting.ToString().c_str(), nullptr, 0);
 | 
			
		||||
 | 
			
		||||
    QString suffix =
 | 
			
		||||
        given_suffix == QStringLiteral("") ? DefaultSuffix(this, setting) : given_suffix;
 | 
			
		||||
    QString suffix = given_suffix == default_suffix ? DefaultSuffix(this, setting) : given_suffix;
 | 
			
		||||
 | 
			
		||||
    spinbox = new QSpinBox(this);
 | 
			
		||||
    spinbox->setRange(min_val, max_val);
 | 
			
		||||
@ -329,13 +371,13 @@ QWidget* Widget::CreateSpinBox(const QString& given_suffix,
 | 
			
		||||
    serializer = [this]() { return std::to_string(spinbox->value()); };
 | 
			
		||||
 | 
			
		||||
    restore_func = [this]() {
 | 
			
		||||
        auto value{std::stol(RelevantDefault(setting))};
 | 
			
		||||
        auto value{std::strtol(RelevantDefault(setting).c_str(), nullptr, 0)};
 | 
			
		||||
        spinbox->setValue(value);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (!Settings::IsConfiguringGlobal()) {
 | 
			
		||||
        QObject::connect(spinbox, QOverload<int>::of(&QSpinBox::valueChanged), [this, touch]() {
 | 
			
		||||
            if (spinbox->value() != std::stoi(setting.ToStringGlobal())) {
 | 
			
		||||
            if (spinbox->value() != std::strtol(setting.ToStringGlobal().c_str(), nullptr, 0)) {
 | 
			
		||||
                touch();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
@ -344,6 +386,42 @@ QWidget* Widget::CreateSpinBox(const QString& given_suffix,
 | 
			
		||||
    return spinbox;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QWidget* Widget::CreateDoubleSpinBox(const QString& given_suffix,
 | 
			
		||||
                                     std::function<std::string()>& serializer,
 | 
			
		||||
                                     std::function<void()>& restore_func,
 | 
			
		||||
                                     const std::function<void()>& touch) {
 | 
			
		||||
    const auto min_val = std::strtod(setting.MinVal().c_str(), nullptr);
 | 
			
		||||
    const auto max_val = std::strtod(setting.MaxVal().c_str(), nullptr);
 | 
			
		||||
    const auto default_val = std::strtod(setting.ToString().c_str(), nullptr);
 | 
			
		||||
 | 
			
		||||
    QString suffix = given_suffix == default_suffix ? DefaultSuffix(this, setting) : given_suffix;
 | 
			
		||||
 | 
			
		||||
    double_spinbox = new QDoubleSpinBox(this);
 | 
			
		||||
    double_spinbox->setRange(min_val, max_val);
 | 
			
		||||
    double_spinbox->setValue(default_val);
 | 
			
		||||
    double_spinbox->setSuffix(suffix);
 | 
			
		||||
    double_spinbox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
 | 
			
		||||
 | 
			
		||||
    serializer = [this]() { return fmt::format("{:f}", double_spinbox->value()); };
 | 
			
		||||
 | 
			
		||||
    restore_func = [this]() {
 | 
			
		||||
        auto value{std::strtod(RelevantDefault(setting).c_str(), nullptr)};
 | 
			
		||||
        double_spinbox->setValue(value);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (!Settings::IsConfiguringGlobal()) {
 | 
			
		||||
        QObject::connect(double_spinbox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
 | 
			
		||||
                         [this, touch]() {
 | 
			
		||||
                             if (double_spinbox->value() !=
 | 
			
		||||
                                 std::strtod(setting.ToStringGlobal().c_str(), nullptr)) {
 | 
			
		||||
                                 touch();
 | 
			
		||||
                             }
 | 
			
		||||
                         });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return double_spinbox;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QWidget* Widget::CreateHexEdit(std::function<std::string()>& serializer,
 | 
			
		||||
                               std::function<void()>& restore_func,
 | 
			
		||||
                               const std::function<void()>& touch) {
 | 
			
		||||
@ -353,7 +431,8 @@ QWidget* Widget::CreateHexEdit(std::function<std::string()>& serializer,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto to_hex = [=](const std::string& input) {
 | 
			
		||||
        return QString::fromStdString(fmt::format("{:08x}", std::stoul(input)));
 | 
			
		||||
        return QString::fromStdString(
 | 
			
		||||
            fmt::format("{:08x}", std::strtoul(input.c_str(), nullptr, 0)));
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    QRegularExpressionValidator* regex = new QRegularExpressionValidator(
 | 
			
		||||
@ -366,7 +445,7 @@ QWidget* Widget::CreateHexEdit(std::function<std::string()>& serializer,
 | 
			
		||||
    line_edit->setValidator(regex);
 | 
			
		||||
 | 
			
		||||
    auto hex_to_dec = [this]() -> std::string {
 | 
			
		||||
        return std::to_string(std::stoul(line_edit->text().toStdString(), nullptr, 16));
 | 
			
		||||
        return std::to_string(std::strtoul(line_edit->text().toStdString().c_str(), nullptr, 16));
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    serializer = [hex_to_dec]() { return hex_to_dec(); };
 | 
			
		||||
@ -386,7 +465,8 @@ QWidget* Widget::CreateDateTimeEdit(bool disabled, bool restrict,
 | 
			
		||||
                                    std::function<void()>& restore_func,
 | 
			
		||||
                                    const std::function<void()>& touch) {
 | 
			
		||||
    const long long current_time = QDateTime::currentSecsSinceEpoch();
 | 
			
		||||
    const s64 the_time = disabled ? current_time : std::stoll(setting.ToString());
 | 
			
		||||
    const s64 the_time =
 | 
			
		||||
        disabled ? current_time : std::strtoll(setting.ToString().c_str(), nullptr, 0);
 | 
			
		||||
    const auto default_val = QDateTime::fromSecsSinceEpoch(the_time);
 | 
			
		||||
 | 
			
		||||
    date_time_edit = new QDateTimeEdit(this);
 | 
			
		||||
@ -399,7 +479,7 @@ QWidget* Widget::CreateDateTimeEdit(bool disabled, bool restrict,
 | 
			
		||||
    auto get_clear_val = [this, restrict, current_time]() {
 | 
			
		||||
        return QDateTime::fromSecsSinceEpoch([this, restrict, current_time]() {
 | 
			
		||||
            if (restrict && checkbox->checkState() == Qt::Checked) {
 | 
			
		||||
                return std::stoll(RelevantDefault(setting));
 | 
			
		||||
                return std::strtoll(RelevantDefault(setting).c_str(), nullptr, 0);
 | 
			
		||||
            }
 | 
			
		||||
            return current_time;
 | 
			
		||||
        }());
 | 
			
		||||
@ -506,8 +586,7 @@ void Widget::SetupComponent(const QString& label, std::function<void()>& load_fu
 | 
			
		||||
        } else {
 | 
			
		||||
            data_component = CreateCombobox(serializer, restore_func, touch);
 | 
			
		||||
        }
 | 
			
		||||
    } else if (type == typeid(u32) || type == typeid(int) || type == typeid(u16) ||
 | 
			
		||||
               type == typeid(s64) || type == typeid(u8)) {
 | 
			
		||||
    } else if (setting.IsIntegral()) {
 | 
			
		||||
        switch (request) {
 | 
			
		||||
        case RequestType::Slider:
 | 
			
		||||
        case RequestType::ReverseSlider:
 | 
			
		||||
@ -534,6 +613,20 @@ void Widget::SetupComponent(const QString& label, std::function<void()>& load_fu
 | 
			
		||||
        default:
 | 
			
		||||
            UNIMPLEMENTED();
 | 
			
		||||
        }
 | 
			
		||||
    } else if (setting.IsFloatingPoint()) {
 | 
			
		||||
        switch (request) {
 | 
			
		||||
        case RequestType::Default:
 | 
			
		||||
        case RequestType::SpinBox:
 | 
			
		||||
            data_component = CreateDoubleSpinBox(suffix, serializer, restore_func, touch);
 | 
			
		||||
            break;
 | 
			
		||||
        case RequestType::Slider:
 | 
			
		||||
        case RequestType::ReverseSlider:
 | 
			
		||||
            data_component = CreateSlider(request == RequestType::ReverseSlider, multiplier, suffix,
 | 
			
		||||
                                          serializer, restore_func, touch);
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            UNIMPLEMENTED();
 | 
			
		||||
        }
 | 
			
		||||
    } else if (type == typeid(std::string)) {
 | 
			
		||||
        switch (request) {
 | 
			
		||||
        case RequestType::Default:
 | 
			
		||||
@ -638,10 +731,10 @@ Widget::Widget(Settings::BasicSetting* setting_, const TranslationMap& translati
 | 
			
		||||
            return std::pair{translations.at(id).first, translations.at(id).second};
 | 
			
		||||
        }
 | 
			
		||||
        LOG_WARNING(Frontend, "Translation table lacks entry for \"{}\"", setting_label);
 | 
			
		||||
        return std::pair{QString::fromStdString(setting_label), QStringLiteral("")};
 | 
			
		||||
        return std::pair{QString::fromStdString(setting_label), QStringLiteral()};
 | 
			
		||||
    }();
 | 
			
		||||
 | 
			
		||||
    if (label == QStringLiteral("")) {
 | 
			
		||||
    if (label == QStringLiteral()) {
 | 
			
		||||
        LOG_DEBUG(Frontend, "Translation table has empty entry for \"{}\", skipping...",
 | 
			
		||||
                  setting.GetLabel());
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
@ -22,6 +22,7 @@ class QObject;
 | 
			
		||||
class QPushButton;
 | 
			
		||||
class QSlider;
 | 
			
		||||
class QSpinBox;
 | 
			
		||||
class QDoubleSpinBox;
 | 
			
		||||
class QRadioButton;
 | 
			
		||||
 | 
			
		||||
namespace Settings {
 | 
			
		||||
@ -43,6 +44,10 @@ enum class RequestType {
 | 
			
		||||
    MaxEnum,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
constexpr float default_multiplier{1.f};
 | 
			
		||||
constexpr float default_float_multiplier{100.f};
 | 
			
		||||
static const QString default_suffix = QStringLiteral();
 | 
			
		||||
 | 
			
		||||
class Widget : public QWidget {
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
@ -66,8 +71,9 @@ public:
 | 
			
		||||
                    const ComboboxTranslationMap& combobox_translations, QWidget* parent,
 | 
			
		||||
                    bool runtime_lock, std::vector<std::function<void(bool)>>& apply_funcs_,
 | 
			
		||||
                    RequestType request = RequestType::Default, bool managed = true,
 | 
			
		||||
                    float multiplier = 1.0f, Settings::BasicSetting* other_setting = nullptr,
 | 
			
		||||
                    const QString& suffix = QStringLiteral(""));
 | 
			
		||||
                    float multiplier = default_multiplier,
 | 
			
		||||
                    Settings::BasicSetting* other_setting = nullptr,
 | 
			
		||||
                    const QString& suffix = default_suffix);
 | 
			
		||||
    virtual ~Widget();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@ -89,6 +95,7 @@ public:
 | 
			
		||||
    QPushButton* restore_button{}; ///< Restore button for custom configurations
 | 
			
		||||
    QLineEdit* line_edit{};        ///< QLineEdit, used for LineEdit and HexEdit
 | 
			
		||||
    QSpinBox* spinbox{};
 | 
			
		||||
    QDoubleSpinBox* double_spinbox{};
 | 
			
		||||
    QCheckBox* checkbox{};
 | 
			
		||||
    QSlider* slider{};
 | 
			
		||||
    QComboBox* combobox{};
 | 
			
		||||
@ -126,6 +133,9 @@ private:
 | 
			
		||||
                                const std::function<void()>& touch);
 | 
			
		||||
    QWidget* CreateSpinBox(const QString& suffix, std::function<std::string()>& serializer,
 | 
			
		||||
                           std::function<void()>& restore_func, const std::function<void()>& touch);
 | 
			
		||||
    QWidget* CreateDoubleSpinBox(const QString& suffix, std::function<std::string()>& serializer,
 | 
			
		||||
                                 std::function<void()>& restore_func,
 | 
			
		||||
                                 const std::function<void()>& touch);
 | 
			
		||||
 | 
			
		||||
    QWidget* parent;
 | 
			
		||||
    const TranslationMap& translations;
 | 
			
		||||
@ -145,14 +155,15 @@ public:
 | 
			
		||||
    Widget* BuildWidget(Settings::BasicSetting* setting,
 | 
			
		||||
                        std::vector<std::function<void(bool)>>& apply_funcs,
 | 
			
		||||
                        RequestType request = RequestType::Default, bool managed = true,
 | 
			
		||||
                        float multiplier = 1.0f, Settings::BasicSetting* other_setting = nullptr,
 | 
			
		||||
                        const QString& suffix = QStringLiteral("")) const;
 | 
			
		||||
                        float multiplier = default_multiplier,
 | 
			
		||||
                        Settings::BasicSetting* other_setting = nullptr,
 | 
			
		||||
                        const QString& suffix = default_suffix) const;
 | 
			
		||||
 | 
			
		||||
    Widget* BuildWidget(Settings::BasicSetting* setting,
 | 
			
		||||
                        std::vector<std::function<void(bool)>>& apply_funcs,
 | 
			
		||||
                        Settings::BasicSetting* other_setting,
 | 
			
		||||
                        RequestType request = RequestType::Default,
 | 
			
		||||
                        const QString& suffix = QStringLiteral("")) const;
 | 
			
		||||
                        const QString& suffix = default_suffix) const;
 | 
			
		||||
 | 
			
		||||
    const ComboboxTranslationMap& ComboboxTranslations() const;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -259,7 +259,7 @@ void Config::ReadValues() {
 | 
			
		||||
    std::stringstream ss(title_list);
 | 
			
		||||
    std::string line;
 | 
			
		||||
    while (std::getline(ss, line, '|')) {
 | 
			
		||||
        const auto title_id = std::stoul(line, nullptr, 16);
 | 
			
		||||
        const auto title_id = std::strtoul(line.c_str(), nullptr, 16);
 | 
			
		||||
        const auto disabled_list = sdl2_config->Get("AddOns", "disabled_" + line, "");
 | 
			
		||||
 | 
			
		||||
        std::stringstream inner_ss(disabled_list);
 | 
			
		||||
 | 
			
		||||
@ -264,8 +264,9 @@ int main(int argc, char** argv) {
 | 
			
		||||
                nickname = match[1];
 | 
			
		||||
                password = match[2];
 | 
			
		||||
                address = match[3];
 | 
			
		||||
                if (!match[4].str().empty())
 | 
			
		||||
                    port = static_cast<u16>(std::stoi(match[4]));
 | 
			
		||||
                if (!match[4].str().empty()) {
 | 
			
		||||
                    port = static_cast<u16>(std::strtoul(match[4].str().c_str(), nullptr, 0));
 | 
			
		||||
                }
 | 
			
		||||
                std::regex nickname_re("^[a-zA-Z0-9._\\- ]+$");
 | 
			
		||||
                if (!std::regex_match(nickname, nickname_re)) {
 | 
			
		||||
                    std::cout
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user