diff options
| author | 2023-05-08 17:33:10 -0400 | |
|---|---|---|
| committer | 2023-07-21 10:56:07 -0400 | |
| commit | d35577d3ed0bfc56ddf85a2e8b163d9d02bec809 (patch) | |
| tree | 54ab3ccf2ac728a75993c9931a39d4739206e25a /src | |
| parent | configuration: Use buttons instead of highlights (diff) | |
| download | yuzu-d35577d3ed0bfc56ddf85a2e8b163d9d02bec809.tar.gz yuzu-d35577d3ed0bfc56ddf85a2e8b163d9d02bec809.tar.xz yuzu-d35577d3ed0bfc56ddf85a2e8b163d9d02bec809.zip | |
configuration: Implement slider
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/settings.h | 13 | ||||
| -rw-r--r-- | src/yuzu/configuration/configuration_shared.cpp | 203 | ||||
| -rw-r--r-- | src/yuzu/configuration/configuration_shared.h | 6 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.cpp | 31 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.h | 2 |
7 files changed, 188 insertions, 71 deletions
diff --git a/src/common/settings.h b/src/common/settings.h index 2879237cc..4ca8299b3 100644 --- a/src/common/settings.h +++ b/src/common/settings.h | |||
| @@ -200,6 +200,8 @@ public: | |||
| 200 | virtual bool RuntimeModfiable() const = 0; | 200 | virtual bool RuntimeModfiable() const = 0; |
| 201 | virtual void SetGlobal(bool global) {} | 201 | virtual void SetGlobal(bool global) {} |
| 202 | virtual constexpr u32 Id() const = 0; | 202 | virtual constexpr u32 Id() const = 0; |
| 203 | virtual std::string MinVal() const = 0; | ||
| 204 | virtual std::string MaxVal() const = 0; | ||
| 203 | virtual bool UsingGlobal() const { | 205 | virtual bool UsingGlobal() const { |
| 204 | return false; | 206 | return false; |
| 205 | } | 207 | } |
| @@ -336,7 +338,7 @@ protected: | |||
| 336 | if constexpr (std::is_same<Type, std::string>()) { | 338 | if constexpr (std::is_same<Type, std::string>()) { |
| 337 | return value_; | 339 | return value_; |
| 338 | } else if constexpr (std::is_same<Type, std::optional<u32>>()) { | 340 | } else if constexpr (std::is_same<Type, std::optional<u32>>()) { |
| 339 | return value_.has_value() ? std::to_string(*value_) : "0"; | 341 | return value_.has_value() ? std::to_string(*value_) : "none"; |
| 340 | } else if constexpr (std::is_same<Type, bool>()) { | 342 | } else if constexpr (std::is_same<Type, bool>()) { |
| 341 | return value_ ? "true" : "false"; | 343 | return value_ ? "true" : "false"; |
| 342 | } else { | 344 | } else { |
| @@ -401,7 +403,7 @@ public: | |||
| 401 | if constexpr (std::is_same<Type, std::string>()) { | 403 | if constexpr (std::is_same<Type, std::string>()) { |
| 402 | this->SetValue(input); | 404 | this->SetValue(input); |
| 403 | } else if constexpr (std::is_same<Type, std::optional<u32>>()) { | 405 | } else if constexpr (std::is_same<Type, std::optional<u32>>()) { |
| 404 | this->SetValue(static_cast<u32>(std::stoll(input))); | 406 | this->SetValue(static_cast<u32>(std::stoul(input))); |
| 405 | } else if constexpr (std::is_same<Type, bool>()) { | 407 | } else if constexpr (std::is_same<Type, bool>()) { |
| 406 | this->SetValue(input == "true"); | 408 | this->SetValue(input == "true"); |
| 407 | } else { | 409 | } else { |
| @@ -435,6 +437,13 @@ public: | |||
| 435 | return id; | 437 | return id; |
| 436 | } | 438 | } |
| 437 | 439 | ||
| 440 | virtual std::string MinVal() const override { | ||
| 441 | return this->ToString(minimum); | ||
| 442 | } | ||
| 443 | virtual std::string MaxVal() const override { | ||
| 444 | return this->ToString(maximum); | ||
| 445 | } | ||
| 446 | |||
| 438 | protected: | 447 | protected: |
| 439 | Type value{}; ///< The setting | 448 | Type value{}; ///< The setting |
| 440 | const Type default_value{}; ///< The default value | 449 | const Type default_value{}; ///< The default value |
diff --git a/src/yuzu/configuration/configuration_shared.cpp b/src/yuzu/configuration/configuration_shared.cpp index 45165c2e9..076d9cc0d 100644 --- a/src/yuzu/configuration/configuration_shared.cpp +++ b/src/yuzu/configuration/configuration_shared.cpp | |||
| @@ -13,10 +13,14 @@ | |||
| 13 | #include <QStyle> | 13 | #include <QStyle> |
| 14 | #include <QWidget> | 14 | #include <QWidget> |
| 15 | #include <qabstractbutton.h> | 15 | #include <qabstractbutton.h> |
| 16 | #include <qabstractslider.h> | ||
| 17 | #include <qboxlayout.h> | ||
| 16 | #include <qcheckbox.h> | 18 | #include <qcheckbox.h> |
| 17 | #include <qcombobox.h> | 19 | #include <qcombobox.h> |
| 18 | #include <qnamespace.h> | 20 | #include <qnamespace.h> |
| 21 | #include <qsize.h> | ||
| 19 | #include <qsizepolicy.h> | 22 | #include <qsizepolicy.h> |
| 23 | #include <qsurfaceformat.h> | ||
| 20 | #include "common/settings.h" | 24 | #include "common/settings.h" |
| 21 | #include "yuzu/configuration/configuration_shared.h" | 25 | #include "yuzu/configuration/configuration_shared.h" |
| 22 | #include "yuzu/configuration/configure_per_game.h" | 26 | #include "yuzu/configuration/configure_per_game.h" |
| @@ -24,7 +28,7 @@ | |||
| 24 | 28 | ||
| 25 | namespace ConfigurationShared { | 29 | namespace ConfigurationShared { |
| 26 | 30 | ||
| 27 | static QPushButton* CreateClearGlobalButton(QWidget* parent, Settings::BasicSetting* setting) { | 31 | static QPushButton* CreateRestoreGlobalButton(QWidget* parent, Settings::BasicSetting* setting) { |
| 28 | QStyle* style = parent->style(); | 32 | QStyle* style = parent->style(); |
| 29 | QIcon* icon = new QIcon(style->standardIcon(QStyle::SP_DialogResetButton)); | 33 | QIcon* icon = new QIcon(style->standardIcon(QStyle::SP_DialogResetButton)); |
| 30 | QPushButton* button = new QPushButton(*icon, QStringLiteral(""), parent); | 34 | QPushButton* button = new QPushButton(*icon, QStringLiteral(""), parent); |
| @@ -40,10 +44,8 @@ static QPushButton* CreateClearGlobalButton(QWidget* parent, Settings::BasicSett | |||
| 40 | return button; | 44 | return button; |
| 41 | } | 45 | } |
| 42 | 46 | ||
| 43 | static std::pair<QWidget*, std::function<void()>> CreateCheckBox(Settings::BasicSetting* setting, | 47 | static std::tuple<QWidget*, void*, QPushButton*, std::function<void()>> CreateCheckBox( |
| 44 | const QString& label, | 48 | Settings::BasicSetting* setting, const QString& label, QWidget* parent) { |
| 45 | QWidget* parent, | ||
| 46 | std::list<CheckState>& trackers) { | ||
| 47 | QWidget* widget = new QWidget(parent); | 49 | QWidget* widget = new QWidget(parent); |
| 48 | QHBoxLayout* layout = new QHBoxLayout(widget); | 50 | QHBoxLayout* layout = new QHBoxLayout(widget); |
| 49 | 51 | ||
| @@ -54,13 +56,15 @@ static std::pair<QWidget*, std::function<void()>> CreateCheckBox(Settings::Basic | |||
| 54 | 56 | ||
| 55 | std::function<void()> load_func; | 57 | std::function<void()> load_func; |
| 56 | 58 | ||
| 59 | QPushButton* button{nullptr}; | ||
| 60 | |||
| 57 | layout->addWidget(checkbox); | 61 | layout->addWidget(checkbox); |
| 58 | if (Settings::IsConfiguringGlobal()) { | 62 | if (Settings::IsConfiguringGlobal()) { |
| 59 | load_func = [setting, checkbox]() { | 63 | load_func = [setting, checkbox]() { |
| 60 | setting->LoadString(checkbox->checkState() == Qt::Checked ? "true" : "false"); | 64 | setting->LoadString(checkbox->checkState() == Qt::Checked ? "true" : "false"); |
| 61 | }; | 65 | }; |
| 62 | } else { | 66 | } else { |
| 63 | auto* button = CreateClearGlobalButton(parent, setting); | 67 | button = CreateRestoreGlobalButton(parent, setting); |
| 64 | layout->addWidget(button); | 68 | layout->addWidget(button); |
| 65 | 69 | ||
| 66 | QObject::connect(checkbox, &QCheckBox::stateChanged, [button](int) { | 70 | QObject::connect(checkbox, &QCheckBox::stateChanged, [button](int) { |
| @@ -86,7 +90,7 @@ static std::pair<QWidget*, std::function<void()>> CreateCheckBox(Settings::Basic | |||
| 86 | 90 | ||
| 87 | layout->setContentsMargins(0, 0, 0, 0); | 91 | layout->setContentsMargins(0, 0, 0, 0); |
| 88 | 92 | ||
| 89 | return {widget, load_func}; | 93 | return {widget, checkbox, button, load_func}; |
| 90 | } | 94 | } |
| 91 | 95 | ||
| 92 | static std::tuple<QWidget*, QComboBox*, QPushButton*, std::function<void()>> CreateCombobox( | 96 | static std::tuple<QWidget*, QComboBox*, QPushButton*, std::function<void()>> CreateCombobox( |
| @@ -122,7 +126,7 @@ static std::tuple<QWidget*, QComboBox*, QPushButton*, std::function<void()>> Cre | |||
| 122 | setting->LoadString(std::to_string(combobox->currentIndex())); | 126 | setting->LoadString(std::to_string(combobox->currentIndex())); |
| 123 | }; | 127 | }; |
| 124 | } else if (managed) { | 128 | } else if (managed) { |
| 125 | button = CreateClearGlobalButton(parent, setting); | 129 | button = CreateRestoreGlobalButton(parent, setting); |
| 126 | layout->addWidget(button); | 130 | layout->addWidget(button); |
| 127 | 131 | ||
| 128 | QObject::connect(button, &QAbstractButton::clicked, [button, combobox, setting](bool) { | 132 | QObject::connect(button, &QAbstractButton::clicked, [button, combobox, setting](bool) { |
| @@ -149,8 +153,8 @@ static std::tuple<QWidget*, QComboBox*, QPushButton*, std::function<void()>> Cre | |||
| 149 | return {group, combobox, button, load_func}; | 153 | return {group, combobox, button, load_func}; |
| 150 | } | 154 | } |
| 151 | 155 | ||
| 152 | static std::tuple<QWidget*, void*, std::function<void()>> CreateLineEdit( | 156 | static std::tuple<QWidget*, void*, QPushButton*, std::function<void()>> CreateLineEdit( |
| 153 | Settings::BasicSetting* setting, const QString& label, QWidget* parent) { | 157 | Settings::BasicSetting* setting, const QString& label, QWidget* parent, bool managed = true) { |
| 154 | QWidget* widget = new QWidget(parent); | 158 | QWidget* widget = new QWidget(parent); |
| 155 | widget->setObjectName(label); | 159 | widget->setObjectName(label); |
| 156 | 160 | ||
| @@ -160,58 +164,140 @@ static std::tuple<QWidget*, void*, std::function<void()>> CreateLineEdit( | |||
| 160 | const QString text = QString::fromStdString(setting->ToString()); | 164 | const QString text = QString::fromStdString(setting->ToString()); |
| 161 | line_edit->setText(text); | 165 | line_edit->setText(text); |
| 162 | 166 | ||
| 163 | std::function<void()> load_func; | 167 | std::function<void()> load_func = []() {}; |
| 164 | 168 | ||
| 169 | QLabel* q_label = new QLabel(label, widget); | ||
| 165 | // setSizePolicy lets widget expand and take an equal part of the space as the line edit | 170 | // setSizePolicy lets widget expand and take an equal part of the space as the line edit |
| 166 | if (Settings::IsConfiguringGlobal()) { | 171 | q_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); |
| 167 | QLabel* q_label = new QLabel(label, widget); | 172 | layout->addWidget(q_label); |
| 168 | q_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); | 173 | |
| 169 | layout->addWidget(q_label); | 174 | layout->addWidget(line_edit); |
| 170 | 175 | ||
| 176 | QPushButton* button{nullptr}; | ||
| 177 | |||
| 178 | if (Settings::IsConfiguringGlobal() && !managed) { | ||
| 171 | load_func = [line_edit, setting]() { | 179 | load_func = [line_edit, setting]() { |
| 172 | std::string load_text = line_edit->text().toStdString(); | 180 | std::string load_text = line_edit->text().toStdString(); |
| 173 | setting->LoadString(load_text); | 181 | setting->LoadString(load_text); |
| 174 | }; | 182 | }; |
| 175 | } else { | 183 | } else if (!managed) { |
| 176 | QCheckBox* checkbox = new QCheckBox(label, parent); | 184 | button = CreateRestoreGlobalButton(parent, setting); |
| 177 | checkbox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); | 185 | layout->addWidget(button); |
| 178 | layout->addWidget(checkbox); | ||
| 179 | |||
| 180 | const auto highlight_func = [widget, line_edit](int state) { | ||
| 181 | bool using_global = state != Qt::Checked; | ||
| 182 | SetHighlight(widget, !using_global); | ||
| 183 | line_edit->setEnabled(!using_global); | ||
| 184 | }; | ||
| 185 | 186 | ||
| 186 | QObject::connect(checkbox, qOverload<int>(&QCheckBox::stateChanged), widget, | 187 | QObject::connect(button, &QAbstractButton::clicked, [=](bool) { |
| 187 | highlight_func); | 188 | button->setEnabled(false); |
| 189 | button->setVisible(false); | ||
| 188 | 190 | ||
| 189 | checkbox->setCheckState(setting->UsingGlobal() ? Qt::Unchecked : Qt::Checked); | 191 | line_edit->setText(QString::fromStdString(setting->ToStringGlobal())); |
| 190 | highlight_func(checkbox->checkState()); | 192 | }); |
| 191 | 193 | ||
| 192 | load_func = [checkbox, setting, line_edit]() { | 194 | QObject::connect(line_edit, &QLineEdit::textChanged, [=](QString) { |
| 193 | if (checkbox->checkState() == Qt::Checked) { | 195 | button->setEnabled(true); |
| 194 | setting->SetGlobal(false); | 196 | button->setVisible(true); |
| 197 | }); | ||
| 195 | 198 | ||
| 196 | std::string load_text = line_edit->text().toStdString(); | 199 | load_func = [=]() { |
| 197 | setting->LoadString(load_text); | 200 | bool using_global = !button->isEnabled(); |
| 198 | } else { | 201 | setting->SetGlobal(using_global); |
| 199 | setting->SetGlobal(true); | 202 | if (!using_global) { |
| 203 | setting->LoadString(line_edit->text().toStdString()); | ||
| 200 | } | 204 | } |
| 201 | }; | 205 | }; |
| 202 | } | 206 | } |
| 203 | 207 | ||
| 204 | layout->addWidget(line_edit); | 208 | layout->setContentsMargins(0, 0, 0, 0); |
| 209 | |||
| 210 | return {widget, line_edit, button, load_func}; | ||
| 211 | } | ||
| 212 | |||
| 213 | static std::tuple<QWidget*, void*, QPushButton*, std::function<void()>> CreateSlider( | ||
| 214 | Settings::BasicSetting* setting, const QString& name, QWidget* parent, bool reversed, | ||
| 215 | float multiplier) { | ||
| 216 | QWidget* widget = new QWidget(parent); | ||
| 217 | QHBoxLayout* layout = new QHBoxLayout(widget); | ||
| 218 | QSlider* slider = new QSlider(Qt::Horizontal, widget); | ||
| 219 | QLabel* label = new QLabel(name, widget); | ||
| 220 | QPushButton* button{nullptr}; | ||
| 221 | QLabel* feedback = new QLabel(widget); | ||
| 222 | |||
| 223 | layout->addWidget(label); | ||
| 224 | layout->addWidget(slider); | ||
| 225 | layout->addWidget(feedback); | ||
| 226 | |||
| 227 | label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); | ||
| 205 | 228 | ||
| 206 | layout->setContentsMargins(0, 0, 0, 0); | 229 | layout->setContentsMargins(0, 0, 0, 0); |
| 207 | 230 | ||
| 208 | return {widget, line_edit, load_func}; | 231 | int max_val = std::stoi(setting->MaxVal()); |
| 232 | |||
| 233 | QObject::connect(slider, &QAbstractSlider::valueChanged, [=](int value) { | ||
| 234 | int present = (reversed ? max_val - value : value) * multiplier; | ||
| 235 | feedback->setText( | ||
| 236 | QStringLiteral("%1%").arg(QString::fromStdString(std::to_string(present)))); | ||
| 237 | }); | ||
| 238 | |||
| 239 | slider->setValue(std::stoi(setting->ToString())); | ||
| 240 | slider->setMinimum(std::stoi(setting->MinVal())); | ||
| 241 | slider->setMaximum(max_val); | ||
| 242 | |||
| 243 | if (reversed) { | ||
| 244 | slider->setInvertedAppearance(true); | ||
| 245 | } | ||
| 246 | |||
| 247 | std::function<void()> load_func; | ||
| 248 | |||
| 249 | if (Settings::IsConfiguringGlobal()) { | ||
| 250 | load_func = [=]() { setting->LoadString(std::to_string(slider->value())); }; | ||
| 251 | } else { | ||
| 252 | button = CreateRestoreGlobalButton(parent, setting); | ||
| 253 | layout->addWidget(button); | ||
| 254 | |||
| 255 | QObject::connect(button, &QAbstractButton::clicked, [=](bool) { | ||
| 256 | slider->setValue(std::stoi(setting->ToStringGlobal())); | ||
| 257 | |||
| 258 | button->setEnabled(false); | ||
| 259 | button->setVisible(false); | ||
| 260 | }); | ||
| 261 | |||
| 262 | QObject::connect(slider, &QAbstractSlider::sliderMoved, [=](int) { | ||
| 263 | button->setEnabled(true); | ||
| 264 | button->setVisible(true); | ||
| 265 | }); | ||
| 266 | |||
| 267 | load_func = [=]() { | ||
| 268 | bool using_global = !button->isEnabled(); | ||
| 269 | setting->SetGlobal(using_global); | ||
| 270 | if (!using_global) { | ||
| 271 | setting->LoadString(std::to_string(slider->value())); | ||
| 272 | } | ||
| 273 | }; | ||
| 274 | } | ||
| 275 | |||
| 276 | return {widget, slider, button, []() {}}; | ||
| 277 | } | ||
| 278 | |||
| 279 | static std::tuple<QWidget*, void*, void*, QPushButton*, std::function<void()>> | ||
| 280 | CreateCheckBoxWithLineEdit(Settings::BasicSetting* setting, const QString& label, QWidget* parent) { | ||
| 281 | auto tuple = CreateCheckBox(setting, label, parent); | ||
| 282 | auto* widget = std::get<0>(tuple); | ||
| 283 | auto* checkbox = std::get<1>(tuple); | ||
| 284 | auto* button = std::get<2>(tuple); | ||
| 285 | auto load_func = std::get<3>(tuple); | ||
| 286 | QHBoxLayout* layout = dynamic_cast<QHBoxLayout*>(widget->layout()); | ||
| 287 | |||
| 288 | auto line_edit_tuple = CreateLineEdit(setting, label, parent, false); | ||
| 289 | auto* line_edit_widget = std::get<0>(line_edit_tuple); | ||
| 290 | auto* line_edit = std::get<1>(line_edit_tuple); | ||
| 291 | |||
| 292 | layout->insertWidget(1, line_edit_widget); | ||
| 293 | |||
| 294 | return {widget, checkbox, line_edit, button, load_func}; | ||
| 209 | } | 295 | } |
| 210 | 296 | ||
| 211 | std::tuple<QWidget*, void*, QPushButton*> CreateWidget( | 297 | std::tuple<QWidget*, void*, QPushButton*> CreateWidget( |
| 212 | Settings::BasicSetting* setting, const TranslationMap& translations, QWidget* parent, | 298 | Settings::BasicSetting* setting, const TranslationMap& translations, QWidget* parent, |
| 213 | bool runtime_lock, std::forward_list<std::function<void(bool)>>& apply_funcs, | 299 | bool runtime_lock, std::forward_list<std::function<void(bool)>>& apply_funcs, |
| 214 | std::list<CheckState>& trackers, RequestType request, bool managed) { | 300 | RequestType request, bool managed, float multiplier, const std::string& text_box_default) { |
| 215 | if (!Settings::IsConfiguringGlobal() && !setting->Switchable()) { | 301 | if (!Settings::IsConfiguringGlobal() && !setting->Switchable()) { |
| 216 | LOG_DEBUG(Frontend, "\"{}\" is not switchable, skipping...", setting->GetLabel()); | 302 | LOG_DEBUG(Frontend, "\"{}\" is not switchable, skipping...", setting->GetLabel()); |
| 217 | return {nullptr, nullptr, nullptr}; | 303 | return {nullptr, nullptr, nullptr}; |
| @@ -242,9 +328,27 @@ std::tuple<QWidget*, void*, QPushButton*> CreateWidget( | |||
| 242 | QPushButton* button; | 328 | QPushButton* button; |
| 243 | 329 | ||
| 244 | if (type == typeid(bool)) { | 330 | if (type == typeid(bool)) { |
| 245 | auto pair = CreateCheckBox(setting, label, parent, trackers); | 331 | switch (request) { |
| 246 | widget = pair.first; | 332 | case RequestType::Default: { |
| 247 | load_func = pair.second; | 333 | auto tuple = CreateCheckBox(setting, label, parent); |
| 334 | widget = std::get<0>(tuple); | ||
| 335 | extra = std::get<1>(tuple); | ||
| 336 | button = std::get<2>(tuple); | ||
| 337 | load_func = std::get<3>(tuple); | ||
| 338 | break; | ||
| 339 | } | ||
| 340 | case RequestType::LineEdit: { | ||
| 341 | auto tuple = CreateCheckBoxWithLineEdit(setting, label, parent); | ||
| 342 | widget = std::get<0>(tuple); | ||
| 343 | break; | ||
| 344 | } | ||
| 345 | case RequestType::ComboBox: | ||
| 346 | case RequestType::SpinBox: | ||
| 347 | case RequestType::Slider: | ||
| 348 | case RequestType::ReverseSlider: | ||
| 349 | case RequestType::MaxEnum: | ||
| 350 | break; | ||
| 351 | } | ||
| 248 | } else if (setting->IsEnum()) { | 352 | } else if (setting->IsEnum()) { |
| 249 | auto tuple = CreateCombobox(setting, label, parent, managed); | 353 | auto tuple = CreateCombobox(setting, label, parent, managed); |
| 250 | widget = std::get<0>(tuple); | 354 | widget = std::get<0>(tuple); |
| @@ -253,11 +357,13 @@ std::tuple<QWidget*, void*, QPushButton*> CreateWidget( | |||
| 253 | load_func = std::get<3>(tuple); | 357 | load_func = std::get<3>(tuple); |
| 254 | } else if (type == typeid(u32) || type == typeid(int)) { | 358 | } else if (type == typeid(u32) || type == typeid(int)) { |
| 255 | switch (request) { | 359 | switch (request) { |
| 360 | case RequestType::LineEdit: | ||
| 256 | case RequestType::Default: { | 361 | case RequestType::Default: { |
| 257 | auto tuple = CreateLineEdit(setting, label, parent); | 362 | auto tuple = CreateLineEdit(setting, label, parent); |
| 258 | widget = std::get<0>(tuple); | 363 | widget = std::get<0>(tuple); |
| 259 | extra = std::get<1>(tuple); | 364 | extra = std::get<1>(tuple); |
| 260 | load_func = std::get<2>(tuple); | 365 | button = std::get<2>(tuple); |
| 366 | load_func = std::get<3>(tuple); | ||
| 261 | break; | 367 | break; |
| 262 | } | 368 | } |
| 263 | case RequestType::ComboBox: { | 369 | case RequestType::ComboBox: { |
| @@ -268,8 +374,17 @@ std::tuple<QWidget*, void*, QPushButton*> CreateWidget( | |||
| 268 | load_func = std::get<3>(tuple); | 374 | load_func = std::get<3>(tuple); |
| 269 | break; | 375 | break; |
| 270 | } | 376 | } |
| 271 | case RequestType::SpinBox: | ||
| 272 | case RequestType::Slider: | 377 | case RequestType::Slider: |
| 378 | case RequestType::ReverseSlider: { | ||
| 379 | auto tuple = CreateSlider(setting, label, parent, request == RequestType::ReverseSlider, | ||
| 380 | multiplier); | ||
| 381 | widget = std::get<0>(tuple); | ||
| 382 | extra = std::get<1>(tuple); | ||
| 383 | button = std::get<2>(tuple); | ||
| 384 | load_func = std::get<3>(tuple); | ||
| 385 | break; | ||
| 386 | } | ||
| 387 | case RequestType::SpinBox: | ||
| 273 | case RequestType::MaxEnum: | 388 | case RequestType::MaxEnum: |
| 274 | break; | 389 | break; |
| 275 | } | 390 | } |
diff --git a/src/yuzu/configuration/configuration_shared.h b/src/yuzu/configuration/configuration_shared.h index 63df11d26..ef3b7c9a9 100644 --- a/src/yuzu/configuration/configuration_shared.h +++ b/src/yuzu/configuration/configuration_shared.h | |||
| @@ -48,14 +48,16 @@ enum class RequestType { | |||
| 48 | ComboBox, | 48 | ComboBox, |
| 49 | SpinBox, | 49 | SpinBox, |
| 50 | Slider, | 50 | Slider, |
| 51 | ReverseSlider, | ||
| 52 | LineEdit, | ||
| 51 | MaxEnum, | 53 | MaxEnum, |
| 52 | }; | 54 | }; |
| 53 | 55 | ||
| 54 | std::tuple<QWidget*, void*, QPushButton*> CreateWidget( | 56 | std::tuple<QWidget*, void*, QPushButton*> CreateWidget( |
| 55 | Settings::BasicSetting* setting, const TranslationMap& translations, QWidget* parent, | 57 | Settings::BasicSetting* setting, const TranslationMap& translations, QWidget* parent, |
| 56 | bool runtime_lock, std::forward_list<std::function<void(bool)>>& apply_funcs, | 58 | bool runtime_lock, std::forward_list<std::function<void(bool)>>& apply_funcs, |
| 57 | std::list<CheckState>& trackers, RequestType request = RequestType::Default, | 59 | RequestType request = RequestType::Default, bool managed = true, float multiplier = 1.0f, |
| 58 | bool managed = true); | 60 | const std::string& text_box_default = ""); |
| 59 | 61 | ||
| 60 | // Global-aware apply and set functions | 62 | // Global-aware apply and set functions |
| 61 | 63 | ||
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 1145b6c43..d3ca7e8cc 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp | |||
| @@ -97,7 +97,6 @@ ConfigureGraphics::ConfigureGraphics( | |||
| 97 | Settings::values.bg_blue.GetValue())); | 97 | Settings::values.bg_blue.GetValue())); |
| 98 | UpdateAPILayout(); | 98 | UpdateAPILayout(); |
| 99 | PopulateVSyncModeSelection(); //< must happen after UpdateAPILayout | 99 | PopulateVSyncModeSelection(); //< must happen after UpdateAPILayout |
| 100 | // SetFSRIndicatorText(ui->fsr_sharpening_slider->sliderPosition()); | ||
| 101 | 100 | ||
| 102 | // VSync setting needs to be determined after populating the VSync combobox | 101 | // VSync setting needs to be determined after populating the VSync combobox |
| 103 | if (Settings::IsConfiguringGlobal()) { | 102 | if (Settings::IsConfiguringGlobal()) { |
| @@ -134,18 +133,13 @@ ConfigureGraphics::ConfigureGraphics( | |||
| 134 | // } | 133 | // } |
| 135 | // UpdateBackgroundColorButton(new_bg_color); | 134 | // UpdateBackgroundColorButton(new_bg_color); |
| 136 | // }); | 135 | // }); |
| 136 | // ui->bg_label->setVisible(Settings::IsConfiguringGlobal()); | ||
| 137 | // ui->bg_combobox->setVisible(!Settings::IsConfiguringGlobal()); | ||
| 137 | 138 | ||
| 138 | api_combobox->setEnabled(!UISettings::values.has_broken_vulkan && api_combobox->isEnabled()); | 139 | api_combobox->setEnabled(!UISettings::values.has_broken_vulkan && api_combobox->isEnabled()); |
| 139 | ui->api_widget->setEnabled( | 140 | ui->api_widget->setEnabled( |
| 140 | (!UISettings::values.has_broken_vulkan || Settings::IsConfiguringGlobal()) && | 141 | (!UISettings::values.has_broken_vulkan || Settings::IsConfiguringGlobal()) && |
| 141 | ui->api_widget->isEnabled()); | 142 | ui->api_widget->isEnabled()); |
| 142 | // ui->bg_label->setVisible(Settings::IsConfiguringGlobal()); | ||
| 143 | // ui->bg_combobox->setVisible(!Settings::IsConfiguringGlobal()); | ||
| 144 | |||
| 145 | // connect(ui->fsr_sharpening_slider, &QSlider::valueChanged, this, | ||
| 146 | // &ConfigureGraphics::SetFSRIndicatorText); | ||
| 147 | // ui->fsr_sharpening_combobox->setVisible(!Settings::IsConfiguringGlobal()); | ||
| 148 | // ui->fsr_sharpening_label->setVisible(Settings::IsConfiguringGlobal()); | ||
| 149 | } | 143 | } |
| 150 | 144 | ||
| 151 | void ConfigureGraphics::PopulateVSyncModeSelection() { | 145 | void ConfigureGraphics::PopulateVSyncModeSelection() { |
| @@ -230,11 +224,19 @@ void ConfigureGraphics::SetConfiguration() { | |||
| 230 | setting->Id() == Settings::values.shader_backend.Id() || | 224 | setting->Id() == Settings::values.shader_backend.Id() || |
| 231 | setting->Id() == Settings::values.vsync_mode.Id()) { | 225 | setting->Id() == Settings::values.vsync_mode.Id()) { |
| 232 | return ConfigurationShared::CreateWidget( | 226 | return ConfigurationShared::CreateWidget( |
| 233 | setting, translations, this, runtime_lock, apply_funcs, trackers, | 227 | setting, translations, this, runtime_lock, apply_funcs, |
| 234 | ConfigurationShared::RequestType::ComboBox, false); | 228 | ConfigurationShared::RequestType::ComboBox, false); |
| 229 | } else if (setting->Id() == Settings::values.fsr_sharpening_slider.Id()) { | ||
| 230 | return ConfigurationShared::CreateWidget( | ||
| 231 | setting, translations, this, runtime_lock, apply_funcs, | ||
| 232 | ConfigurationShared::RequestType::ReverseSlider, true, 0.5f); | ||
| 233 | } else if (setting->Id() == Settings::values.use_speed_limit.Id()) { | ||
| 234 | return ConfigurationShared::CreateWidget( | ||
| 235 | setting, translations, this, runtime_lock, apply_funcs, | ||
| 236 | ConfigurationShared::RequestType::LineEdit, true, 1.0f, setting->ToString()); | ||
| 235 | } else { | 237 | } else { |
| 236 | return ConfigurationShared::CreateWidget(setting, translations, this, runtime_lock, | 238 | return ConfigurationShared::CreateWidget(setting, translations, this, runtime_lock, |
| 237 | apply_funcs, trackers); | 239 | apply_funcs); |
| 238 | } | 240 | } |
| 239 | }(); | 241 | }(); |
| 240 | 242 | ||
| @@ -251,13 +253,11 @@ void ConfigureGraphics::SetConfiguration() { | |||
| 251 | QObject::connect(api_restore_global_button, &QAbstractButton::clicked, | 253 | QObject::connect(api_restore_global_button, &QAbstractButton::clicked, |
| 252 | [=](bool) { UpdateAPILayout(); }); | 254 | [=](bool) { UpdateAPILayout(); }); |
| 253 | 255 | ||
| 256 | // Detach API's restore button and place it where we want | ||
| 254 | widget->layout()->removeWidget(api_restore_global_button); | 257 | widget->layout()->removeWidget(api_restore_global_button); |
| 255 | api_layout->addWidget(api_restore_global_button); | 258 | api_layout->addWidget(api_restore_global_button); |
| 256 | } | 259 | } |
| 257 | } else if (setting->Id() == Settings::values.vulkan_device.Id()) { | 260 | } else if (setting->Id() == Settings::values.vulkan_device.Id()) { |
| 258 | api_layout->addWidget(widget); | ||
| 259 | api_combobox = reinterpret_cast<QComboBox*>(extra); | ||
| 260 | } else if (setting->Id() == Settings::values.vulkan_device.Id()) { | ||
| 261 | hold_api.push_front(widget); | 261 | hold_api.push_front(widget); |
| 262 | vulkan_device_combobox = reinterpret_cast<QComboBox*>(extra); | 262 | vulkan_device_combobox = reinterpret_cast<QComboBox*>(extra); |
| 263 | vulkan_device_widget = widget; | 263 | vulkan_device_widget = widget; |
| @@ -284,11 +284,6 @@ void ConfigureGraphics::SetConfiguration() { | |||
| 284 | } | 284 | } |
| 285 | } | 285 | } |
| 286 | 286 | ||
| 287 | void ConfigureGraphics::SetFSRIndicatorText(int percentage) { | ||
| 288 | // ui->fsr_sharpening_value->setText( | ||
| 289 | // tr("%1%", "FSR sharpening percentage (e.g. 50%)").arg(100 - (percentage / 2))); | ||
| 290 | } | ||
| 291 | |||
| 292 | const QString ConfigureGraphics::TranslateVSyncMode(VkPresentModeKHR mode, | 287 | const QString ConfigureGraphics::TranslateVSyncMode(VkPresentModeKHR mode, |
| 293 | Settings::RendererBackend backend) const { | 288 | Settings::RendererBackend backend) const { |
| 294 | switch (mode) { | 289 | switch (mode) { |
diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h index 12a588127..a049458a8 100644 --- a/src/yuzu/configuration/configure_graphics.h +++ b/src/yuzu/configuration/configure_graphics.h | |||
| @@ -58,7 +58,6 @@ private: | |||
| 58 | 58 | ||
| 59 | void RetrieveVulkanDevices(); | 59 | void RetrieveVulkanDevices(); |
| 60 | 60 | ||
| 61 | void SetFSRIndicatorText(int percentage); | ||
| 62 | /* Turns a Vulkan present mode into a textual string for a UI | 61 | /* Turns a Vulkan present mode into a textual string for a UI |
| 63 | * (and eventually for a human to read) */ | 62 | * (and eventually for a human to read) */ |
| 64 | const QString TranslateVSyncMode(VkPresentModeKHR mode, | 63 | const QString TranslateVSyncMode(VkPresentModeKHR mode, |
| @@ -69,7 +68,6 @@ private: | |||
| 69 | std::unique_ptr<Ui::ConfigureGraphics> ui; | 68 | std::unique_ptr<Ui::ConfigureGraphics> ui; |
| 70 | QColor bg_color; | 69 | QColor bg_color; |
| 71 | 70 | ||
| 72 | std::list<ConfigurationShared::CheckState> trackers{}; | ||
| 73 | std::forward_list<std::function<void(bool)>> apply_funcs{}; | 71 | std::forward_list<std::function<void(bool)>> apply_funcs{}; |
| 74 | 72 | ||
| 75 | std::vector<VkDeviceInfo::Record>& records; | 73 | std::vector<VkDeviceInfo::Record>& records; |
diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index 8a53ad111..4a3868693 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp | |||
| @@ -33,7 +33,7 @@ void ConfigureGraphicsAdvanced::SetConfiguration() { | |||
| 33 | for (auto setting : | 33 | for (auto setting : |
| 34 | Settings::values.linkage.by_category[Settings::Category::RendererAdvanced]) { | 34 | Settings::values.linkage.by_category[Settings::Category::RendererAdvanced]) { |
| 35 | auto [widget, extra, button] = ConfigurationShared::CreateWidget( | 35 | auto [widget, extra, button] = ConfigurationShared::CreateWidget( |
| 36 | setting, translations, this, runtime_lock, apply_funcs, trackers); | 36 | setting, translations, this, runtime_lock, apply_funcs); |
| 37 | 37 | ||
| 38 | if (widget == nullptr) { | 38 | if (widget == nullptr) { |
| 39 | continue; | 39 | continue; |
diff --git a/src/yuzu/configuration/configure_graphics_advanced.h b/src/yuzu/configuration/configure_graphics_advanced.h index 3ac6b4bce..327134ee6 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.h +++ b/src/yuzu/configuration/configure_graphics_advanced.h | |||
| @@ -34,8 +34,6 @@ private: | |||
| 34 | 34 | ||
| 35 | std::unique_ptr<Ui::ConfigureGraphicsAdvanced> ui; | 35 | std::unique_ptr<Ui::ConfigureGraphicsAdvanced> ui; |
| 36 | 36 | ||
| 37 | std::list<ConfigurationShared::CheckState> trackers{}; | ||
| 38 | |||
| 39 | const Core::System& system; | 37 | const Core::System& system; |
| 40 | const ConfigurationShared::TranslationMap& translations; | 38 | const ConfigurationShared::TranslationMap& translations; |
| 41 | std::forward_list<std::function<void(bool)>> apply_funcs; | 39 | std::forward_list<std::function<void(bool)>> apply_funcs; |