Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DolphinQt/HacksWidget: Convert accuracy slider to ConfigSlider #13237

Merged
merged 2 commits into from
Dec 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 48 additions & 2 deletions Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// Copyright 2017 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#include <cassert>

#include <QFont>

#include "DolphinQt/Config/ConfigControls/ConfigSlider.h"
Expand All @@ -24,14 +26,58 @@ ConfigSlider::ConfigSlider(int minimum, int maximum, const Config::Info<int>& se
connect(this, &ConfigSlider::valueChanged, this, &ConfigSlider::Update);
}

ConfigSlider::ConfigSlider(std::vector<int> tick_values, const Config::Info<int>& 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<int>(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<size_t>(value) < m_tick_values.size())
SaveValue(m_setting, m_tick_values[static_cast<size_t>(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<int>(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)
Expand Down
10 changes: 10 additions & 0 deletions Source/Core/DolphinQt/Config/ConfigControls/ConfigSlider.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

#pragma once

#include <vector>

#include <QLabel>
#include <QPointer>

Expand All @@ -19,13 +21,21 @@ class ConfigSlider final : public ConfigControl<ToolTipSlider>
ConfigSlider(int minimum, int maximum, const Config::Info<int>& 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<int> tick_values, const Config::Info<int>& setting,
Config::Layer* layer);

void Update(int value);

protected:
void OnConfigChanged() override;

private:
const Config::Info<int> m_setting;

// Mappings for slider ticks to config values. Identity mapping is assumed if this is empty.
std::vector<int> m_tick_values;
};

class ConfigSliderLabel final : public QLabel
Expand Down
78 changes: 5 additions & 73 deletions Source/Core/DolphinQt/Config/Graphics/HacksWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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,
Expand All @@ -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(
Expand Down
9 changes: 4 additions & 5 deletions Source/Core/DolphinQt/Config/Graphics/HacksWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <QWidget>

class ConfigBool;
class ConfigSlider;
class ConfigSliderLabel;
class GameConfigWidget;
class GraphicsWindow;
class QLabel;
Expand All @@ -24,9 +26,6 @@ class HacksWidget final : public QWidget
HacksWidget(GameConfigWidget* parent, Config::Layer* layer);

private:
void LoadSettings();
void SaveSettings();

void OnBackendChanged(const QString& backend_name);

// EFB
Expand All @@ -36,8 +35,8 @@ class HacksWidget final : public QWidget
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
Expand Down