diff --git a/Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.cpp b/Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.cpp index a296d57e86..349e73eeda 100644 --- a/Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.cpp +++ b/Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.cpp @@ -1,6 +1,8 @@ // Copyright 2017 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include + #include #include "DolphinQt/Config/ConfigControls/ConfigSlider.h" @@ -24,14 +26,58 @@ ConfigSlider::ConfigSlider(int minimum, int maximum, const Config::Info& se connect(this, &ConfigSlider::valueChanged, this, &ConfigSlider::Update); } +ConfigSlider::ConfigSlider(std::vector tick_values, const Config::Info& setting, + Config::Layer* layer) + : ConfigControl(Qt::Horizontal, setting.GetLocation(), layer), m_setting(setting), + m_tick_values(std::move(tick_values)) +{ + assert(!m_tick_values.empty()); + setMinimum(0); + setMaximum(static_cast(m_tick_values.size() - 1)); + setPageStep(1); + setTickPosition(QSlider::TicksBelow); + OnConfigChanged(); + + connect(this, &ConfigSlider::valueChanged, this, &ConfigSlider::Update); +} + void ConfigSlider::Update(int value) { - SaveValue(m_setting, value); + if (!m_tick_values.empty()) + { + if (value >= 0 && static_cast(value) < m_tick_values.size()) + SaveValue(m_setting, m_tick_values[static_cast(value)]); + } + else + { + SaveValue(m_setting, value); + } } void ConfigSlider::OnConfigChanged() { - setValue(ReadValue(m_setting)); + if (!m_tick_values.empty()) + { + // re-enable in case it was disabled + setEnabled(true); + + const int config_value = ReadValue(m_setting); + for (size_t i = 0; i < m_tick_values.size(); ++i) + { + if (m_tick_values[i] == config_value) + { + setValue(static_cast(i)); + return; + } + } + + // if we reach here than none of the options matched, disable the slider + setEnabled(false); + } + else + { + setValue(ReadValue(m_setting)); + } } ConfigSliderLabel::ConfigSliderLabel(const QString& text, ConfigSlider* slider) diff --git a/Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.h b/Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.h index 3df98d53b7..ec1ba827ad 100644 --- a/Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.h +++ b/Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.h @@ -3,6 +3,8 @@ #pragma once +#include + #include #include @@ -19,6 +21,11 @@ public: ConfigSlider(int minimum, int maximum, const Config::Info& setting, Config::Layer* layer, int tick = 0); + // Generates a slider with tick_values.size() ticks. Each tick corresponds to the integer at that + // index in the vector. + ConfigSlider(std::vector tick_values, const Config::Info& setting, + Config::Layer* layer); + void Update(int value); protected: @@ -26,6 +33,9 @@ protected: private: const Config::Info m_setting; + + // Mappings for slider ticks to config values. Identity mapping is assumed if this is empty. + std::vector m_tick_values; }; class ConfigSliderLabel final : public QLabel diff --git a/Source/Core/DolphinQt/Config/Graphics/HacksWidget.cpp b/Source/Core/DolphinQt/Config/Graphics/HacksWidget.cpp index 49a1c50b68..da32111155 100644 --- a/Source/Core/DolphinQt/Config/Graphics/HacksWidget.cpp +++ b/Source/Core/DolphinQt/Config/Graphics/HacksWidget.cpp @@ -25,23 +25,18 @@ HacksWidget::HacksWidget(GraphicsWindow* parent) { CreateWidgets(); - LoadSettings(); ConnectWidgets(); AddDescriptions(); connect(parent, &GraphicsWindow::BackendChanged, this, &HacksWidget::OnBackendChanged); OnBackendChanged(QString::fromStdString(Config::Get(Config::MAIN_GFX_BACKEND))); - connect(&Settings::Instance(), &Settings::ConfigChanged, this, &HacksWidget::LoadSettings); - connect(m_gpu_texture_decoding, &QCheckBox::toggled, [this, parent] { - SaveSettings(); - emit parent->UseGPUTextureDecodingChanged(); - }); + connect(m_gpu_texture_decoding, &QCheckBox::toggled, + [this, parent] { emit parent->UseGPUTextureDecodingChanged(); }); } HacksWidget::HacksWidget(GameConfigWidget* parent, Config::Layer* layer) : m_game_layer(layer) { CreateWidgets(); - LoadSettings(); ConnectWidgets(); AddDescriptions(); } @@ -73,18 +68,15 @@ void HacksWidget::CreateWidgets() auto* texture_cache_layout = new QGridLayout(); texture_cache_box->setLayout(texture_cache_layout); - m_accuracy = new ToolTipSlider(Qt::Horizontal); - m_accuracy->setMinimum(0); - m_accuracy->setMaximum(2); - m_accuracy->setPageStep(1); - m_accuracy->setTickPosition(QSlider::TicksBelow); + m_accuracy = + new ConfigSlider({0, 512, 128}, Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES, m_game_layer); m_gpu_texture_decoding = new ConfigBool(tr("GPU Texture Decoding"), Config::GFX_ENABLE_GPU_TEXTURE_DECODING, m_game_layer); auto* safe_label = new QLabel(tr("Safe")); safe_label->setAlignment(Qt::AlignRight); - m_accuracy_label = new QLabel(tr("Accuracy:")); + m_accuracy_label = new ConfigSliderLabel(tr("Accuracy:"), m_accuracy); texture_cache_layout->addWidget(m_accuracy_label, 0, 0); texture_cache_layout->addWidget(safe_label, 0, 1); @@ -158,7 +150,6 @@ void HacksWidget::OnBackendChanged(const QString& backend_name) void HacksWidget::ConnectWidgets() { - connect(m_accuracy, &QSlider::valueChanged, [this](int) { SaveSettings(); }); connect(m_store_efb_copies, &QCheckBox::stateChanged, [this](int) { UpdateDeferEFBCopiesEnabled(); }); connect(m_store_xfb_copies, &QCheckBox::stateChanged, @@ -169,65 +160,6 @@ void HacksWidget::ConnectWidgets() [this](int) { UpdateSkipPresentingDuplicateFramesEnabled(); }); } -void HacksWidget::LoadSettings() -{ - const QSignalBlocker blocker(m_accuracy); - auto samples = Config::Get(Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES); - - // Re-enable the slider in case it was disabled because of a custom value - m_accuracy->setEnabled(true); - - int slider_pos = 0; - - switch (samples) - { - case 512: - slider_pos = 1; - break; - case 128: - slider_pos = 2; - break; - case 0: - slider_pos = 0; - break; - // Custom values, ought not to be touched - default: - m_accuracy->setEnabled(false); - } - - m_accuracy->setValue(slider_pos); - - QFont bf = m_accuracy_label->font(); - - bf.setBold(Config::GetActiveLayerForConfig(Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES) != - Config::LayerType::Base); - - m_accuracy_label->setFont(bf); -} - -void HacksWidget::SaveSettings() -{ - int slider_pos = m_accuracy->value(); - - if (m_accuracy->isEnabled()) - { - int samples = 0; - switch (slider_pos) - { - case 0: - samples = 0; - break; - case 1: - samples = 512; - break; - case 2: - samples = 128; - } - - Config::SetBaseOrCurrent(Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES, samples); - } -} - void HacksWidget::AddDescriptions() { static const char TR_SKIP_EFB_CPU_ACCESS_DESCRIPTION[] = QT_TR_NOOP( diff --git a/Source/Core/DolphinQt/Config/Graphics/HacksWidget.h b/Source/Core/DolphinQt/Config/Graphics/HacksWidget.h index 391570278c..3683c36075 100644 --- a/Source/Core/DolphinQt/Config/Graphics/HacksWidget.h +++ b/Source/Core/DolphinQt/Config/Graphics/HacksWidget.h @@ -6,6 +6,8 @@ #include class ConfigBool; +class ConfigSlider; +class ConfigSliderLabel; class GameConfigWidget; class GraphicsWindow; class QLabel; @@ -24,9 +26,6 @@ public: HacksWidget(GameConfigWidget* parent, Config::Layer* layer); private: - void LoadSettings(); - void SaveSettings(); - void OnBackendChanged(const QString& backend_name); // EFB @@ -36,8 +35,8 @@ private: ConfigBool* m_defer_efb_copies; // Texture Cache - QLabel* m_accuracy_label; - ToolTipSlider* m_accuracy; + ConfigSliderLabel* m_accuracy_label; + ConfigSlider* m_accuracy; ConfigBool* m_gpu_texture_decoding; // External Framebuffer