summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/yuzu/configuration/config.cpp36
-rw-r--r--src/yuzu/configuration/config.h6
-rw-r--r--src/yuzu/main.cpp181
3 files changed, 152 insertions, 71 deletions
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 70737c54e..037475ebc 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -65,6 +65,42 @@ const std::array<int, 2> Config::default_ringcon_analogs{{
65 Qt::Key_D, 65 Qt::Key_D,
66}}; 66}};
67 67
68const std::map<Settings::AntiAliasing, QString> Config::anti_aliasing_texts_map = {
69 {Settings::AntiAliasing::None, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "None"))},
70 {Settings::AntiAliasing::Fxaa, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "FXAA"))},
71 {Settings::AntiAliasing::Smaa, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "SMAA"))},
72};
73
74const std::map<Settings::ScalingFilter, QString> Config::scaling_filter_texts_map = {
75 {Settings::ScalingFilter::NearestNeighbor,
76 QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Nearest"))},
77 {Settings::ScalingFilter::Bilinear,
78 QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Bilinear"))},
79 {Settings::ScalingFilter::Bicubic, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Bicubic"))},
80 {Settings::ScalingFilter::Gaussian,
81 QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Gaussian"))},
82 {Settings::ScalingFilter::ScaleForce,
83 QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "ScaleForce"))},
84 {Settings::ScalingFilter::Fsr, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "FSR"))},
85};
86
87const std::map<bool, QString> Config::use_docked_mode_texts_map = {
88 {true, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Docked"))},
89 {false, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Handheld"))},
90};
91
92const std::map<Settings::GPUAccuracy, QString> Config::gpu_accuracy_texts_map = {
93 {Settings::GPUAccuracy::Normal, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Normal"))},
94 {Settings::GPUAccuracy::High, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "High"))},
95 {Settings::GPUAccuracy::Extreme, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Extreme"))},
96};
97
98const std::map<Settings::RendererBackend, QString> Config::renderer_backend_texts_map = {
99 {Settings::RendererBackend::Vulkan, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Vulkan"))},
100 {Settings::RendererBackend::OpenGL, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "OpenGL"))},
101 {Settings::RendererBackend::Null, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Null"))},
102};
103
68// This shouldn't have anything except static initializers (no functions). So 104// This shouldn't have anything except static initializers (no functions). So
69// QKeySequence(...).toString() is NOT ALLOWED HERE. 105// QKeySequence(...).toString() is NOT ALLOWED HERE.
70// This must be in alphabetical order according to action name as it must have the same order as 106// This must be in alphabetical order according to action name as it must have the same order as
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index 7d26e9ab6..991a6eb23 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -49,6 +49,12 @@ public:
49 static const std::array<int, Settings::NativeKeyboard::NumKeyboardMods> default_keyboard_mods; 49 static const std::array<int, Settings::NativeKeyboard::NumKeyboardMods> default_keyboard_mods;
50 static const std::array<UISettings::Shortcut, 22> default_hotkeys; 50 static const std::array<UISettings::Shortcut, 22> default_hotkeys;
51 51
52 static const std::map<Settings::AntiAliasing, QString> anti_aliasing_texts_map;
53 static const std::map<Settings::ScalingFilter, QString> scaling_filter_texts_map;
54 static const std::map<bool, QString> use_docked_mode_texts_map;
55 static const std::map<Settings::GPUAccuracy, QString> gpu_accuracy_texts_map;
56 static const std::map<Settings::RendererBackend, QString> renderer_backend_texts_map;
57
52 static constexpr UISettings::Theme default_theme{ 58 static constexpr UISettings::Theme default_theme{
53#ifdef _WIN32 59#ifdef _WIN32
54 UISettings::Theme::DarkColorful 60 UISettings::Theme::DarkColorful
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 4489f43af..1b412295b 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -1054,6 +1054,24 @@ void GMainWindow::InitializeWidgets() {
1054 bottomLeft.setY(bottomLeft.y() - volume_popup->geometry().height()); 1054 bottomLeft.setY(bottomLeft.y() - volume_popup->geometry().height());
1055 volume_popup->setGeometry(QRect(bottomLeft, QSize(rect.width(), rect.height()))); 1055 volume_popup->setGeometry(QRect(bottomLeft, QSize(rect.width(), rect.height())));
1056 }); 1056 });
1057 volume_button->setContextMenuPolicy(Qt::CustomContextMenu);
1058 connect(volume_button, &QPushButton::customContextMenuRequested,
1059 [this](const QPoint& menu_location) {
1060 QMenu context_menu;
1061 context_menu.addAction(
1062 Settings::values.audio_muted ? tr("Unmute") : tr("Mute"), [this] {
1063 Settings::values.audio_muted = !Settings::values.audio_muted;
1064 UpdateVolumeUI();
1065 });
1066
1067 context_menu.addAction(tr("Reset Volume"), [this] {
1068 Settings::values.volume.SetValue(100);
1069 UpdateVolumeUI();
1070 });
1071
1072 context_menu.exec(volume_button->mapToGlobal(menu_location));
1073 volume_button->repaint();
1074 });
1057 statusBar()->insertPermanentWidget(0, volume_button); 1075 statusBar()->insertPermanentWidget(0, volume_button);
1058 1076
1059 // setup AA button 1077 // setup AA button
@@ -1074,6 +1092,19 @@ void GMainWindow::InitializeWidgets() {
1074 UpdateAAText(); 1092 UpdateAAText();
1075 aa_status_button->setCheckable(true); 1093 aa_status_button->setCheckable(true);
1076 aa_status_button->setChecked(true); 1094 aa_status_button->setChecked(true);
1095 aa_status_button->setContextMenuPolicy(Qt::CustomContextMenu);
1096 connect(aa_status_button, &QPushButton::customContextMenuRequested,
1097 [this](const QPoint& menu_location) {
1098 QMenu context_menu;
1099 for (auto const& aa_text_pair : Config::anti_aliasing_texts_map) {
1100 context_menu.addAction(aa_text_pair.second, [this, aa_text_pair] {
1101 Settings::values.anti_aliasing.SetValue(aa_text_pair.first);
1102 UpdateAAText();
1103 });
1104 }
1105 context_menu.exec(aa_status_button->mapToGlobal(menu_location));
1106 aa_status_button->repaint();
1107 });
1077 statusBar()->insertPermanentWidget(0, aa_status_button); 1108 statusBar()->insertPermanentWidget(0, aa_status_button);
1078 1109
1079 // Setup Filter button 1110 // Setup Filter button
@@ -1085,6 +1116,19 @@ void GMainWindow::InitializeWidgets() {
1085 UpdateFilterText(); 1116 UpdateFilterText();
1086 filter_status_button->setCheckable(true); 1117 filter_status_button->setCheckable(true);
1087 filter_status_button->setChecked(true); 1118 filter_status_button->setChecked(true);
1119 filter_status_button->setContextMenuPolicy(Qt::CustomContextMenu);
1120 connect(filter_status_button, &QPushButton::customContextMenuRequested,
1121 [this](const QPoint& menu_location) {
1122 QMenu context_menu;
1123 for (auto const& filter_text_pair : Config::scaling_filter_texts_map) {
1124 context_menu.addAction(filter_text_pair.second, [this, filter_text_pair] {
1125 Settings::values.scaling_filter.SetValue(filter_text_pair.first);
1126 UpdateFilterText();
1127 });
1128 }
1129 context_menu.exec(filter_status_button->mapToGlobal(menu_location));
1130 filter_status_button->repaint();
1131 });
1088 statusBar()->insertPermanentWidget(0, filter_status_button); 1132 statusBar()->insertPermanentWidget(0, filter_status_button);
1089 1133
1090 // Setup Dock button 1134 // Setup Dock button
@@ -1094,14 +1138,47 @@ void GMainWindow::InitializeWidgets() {
1094 connect(dock_status_button, &QPushButton::clicked, this, &GMainWindow::OnToggleDockedMode); 1138 connect(dock_status_button, &QPushButton::clicked, this, &GMainWindow::OnToggleDockedMode);
1095 dock_status_button->setCheckable(true); 1139 dock_status_button->setCheckable(true);
1096 UpdateDockedButton(); 1140 UpdateDockedButton();
1141 dock_status_button->setContextMenuPolicy(Qt::CustomContextMenu);
1142 connect(dock_status_button, &QPushButton::customContextMenuRequested,
1143 [this](const QPoint& menu_location) {
1144 QMenu context_menu;
1145
1146 for (auto const& docked_mode_pair : Config::use_docked_mode_texts_map) {
1147 context_menu.addAction(docked_mode_pair.second, [this, docked_mode_pair] {
1148 if (docked_mode_pair.first != Settings::values.use_docked_mode.GetValue()) {
1149 OnToggleDockedMode();
1150 }
1151 });
1152 }
1153 context_menu.exec(dock_status_button->mapToGlobal(menu_location));
1154 dock_status_button->repaint();
1155 });
1097 statusBar()->insertPermanentWidget(0, dock_status_button); 1156 statusBar()->insertPermanentWidget(0, dock_status_button);
1098 1157
1158 // Setup GPU Accuracy button
1099 gpu_accuracy_button = new QPushButton(); 1159 gpu_accuracy_button = new QPushButton();
1100 gpu_accuracy_button->setObjectName(QStringLiteral("GPUStatusBarButton")); 1160 gpu_accuracy_button->setObjectName(QStringLiteral("GPUStatusBarButton"));
1101 gpu_accuracy_button->setCheckable(true); 1161 gpu_accuracy_button->setCheckable(true);
1102 gpu_accuracy_button->setFocusPolicy(Qt::NoFocus); 1162 gpu_accuracy_button->setFocusPolicy(Qt::NoFocus);
1103 connect(gpu_accuracy_button, &QPushButton::clicked, this, &GMainWindow::OnToggleGpuAccuracy); 1163 connect(gpu_accuracy_button, &QPushButton::clicked, this, &GMainWindow::OnToggleGpuAccuracy);
1104 UpdateGPUAccuracyButton(); 1164 UpdateGPUAccuracyButton();
1165 gpu_accuracy_button->setContextMenuPolicy(Qt::CustomContextMenu);
1166 connect(gpu_accuracy_button, &QPushButton::customContextMenuRequested,
1167 [this](const QPoint& menu_location) {
1168 QMenu context_menu;
1169
1170 for (auto const& gpu_accuracy_pair : Config::gpu_accuracy_texts_map) {
1171 if (gpu_accuracy_pair.first == Settings::GPUAccuracy::Extreme) {
1172 continue;
1173 }
1174 context_menu.addAction(gpu_accuracy_pair.second, [this, gpu_accuracy_pair] {
1175 Settings::values.gpu_accuracy.SetValue(gpu_accuracy_pair.first);
1176 UpdateGPUAccuracyButton();
1177 });
1178 }
1179 context_menu.exec(gpu_accuracy_button->mapToGlobal(menu_location));
1180 gpu_accuracy_button->repaint();
1181 });
1105 statusBar()->insertPermanentWidget(0, gpu_accuracy_button); 1182 statusBar()->insertPermanentWidget(0, gpu_accuracy_button);
1106 1183
1107 // Setup Renderer API button 1184 // Setup Renderer API button
@@ -1114,6 +1191,24 @@ void GMainWindow::InitializeWidgets() {
1114 renderer_status_button->setCheckable(true); 1191 renderer_status_button->setCheckable(true);
1115 renderer_status_button->setChecked(Settings::values.renderer_backend.GetValue() == 1192 renderer_status_button->setChecked(Settings::values.renderer_backend.GetValue() ==
1116 Settings::RendererBackend::Vulkan); 1193 Settings::RendererBackend::Vulkan);
1194 renderer_status_button->setContextMenuPolicy(Qt::CustomContextMenu);
1195 connect(renderer_status_button, &QPushButton::customContextMenuRequested,
1196 [this](const QPoint& menu_location) {
1197 QMenu context_menu;
1198
1199 for (auto const& renderer_backend_pair : Config::renderer_backend_texts_map) {
1200 if (renderer_backend_pair.first == Settings::RendererBackend::Null) {
1201 continue;
1202 }
1203 context_menu.addAction(
1204 renderer_backend_pair.second, [this, renderer_backend_pair] {
1205 Settings::values.renderer_backend.SetValue(renderer_backend_pair.first);
1206 UpdateAPIText();
1207 });
1208 }
1209 context_menu.exec(renderer_status_button->mapToGlobal(menu_location));
1210 renderer_status_button->repaint();
1211 });
1117 statusBar()->insertPermanentWidget(0, renderer_status_button); 1212 statusBar()->insertPermanentWidget(0, renderer_status_button);
1118 1213
1119 statusBar()->setVisible(true); 1214 statusBar()->setVisible(true);
@@ -3980,94 +4075,38 @@ void GMainWindow::UpdateStatusBar() {
3980} 4075}
3981 4076
3982void GMainWindow::UpdateGPUAccuracyButton() { 4077void GMainWindow::UpdateGPUAccuracyButton() {
3983 switch (Settings::values.gpu_accuracy.GetValue()) { 4078 const auto gpu_accuracy = Settings::values.gpu_accuracy.GetValue();
3984 case Settings::GPUAccuracy::Normal: { 4079 const auto gpu_accuracy_text = Config::gpu_accuracy_texts_map.find(gpu_accuracy)->second;
3985 gpu_accuracy_button->setText(tr("GPU NORMAL")); 4080 gpu_accuracy_button->setText(gpu_accuracy_text.toUpper());
3986 gpu_accuracy_button->setChecked(false); 4081 gpu_accuracy_button->setChecked(gpu_accuracy != Settings::GPUAccuracy::Normal);
3987 break;
3988 }
3989 case Settings::GPUAccuracy::High: {
3990 gpu_accuracy_button->setText(tr("GPU HIGH"));
3991 gpu_accuracy_button->setChecked(true);
3992 break;
3993 }
3994 case Settings::GPUAccuracy::Extreme: {
3995 gpu_accuracy_button->setText(tr("GPU EXTREME"));
3996 gpu_accuracy_button->setChecked(true);
3997 break;
3998 }
3999 default: {
4000 gpu_accuracy_button->setText(tr("GPU ERROR"));
4001 gpu_accuracy_button->setChecked(true);
4002 break;
4003 }
4004 }
4005} 4082}
4006 4083
4007void GMainWindow::UpdateDockedButton() { 4084void GMainWindow::UpdateDockedButton() {
4008 const bool is_docked = Settings::values.use_docked_mode.GetValue(); 4085 const bool is_docked = Settings::values.use_docked_mode.GetValue();
4009 dock_status_button->setChecked(is_docked); 4086 dock_status_button->setChecked(is_docked);
4010 dock_status_button->setText(is_docked ? tr("DOCKED") : tr("HANDHELD")); 4087 dock_status_button->setText(
4088 Config::use_docked_mode_texts_map.find(is_docked)->second.toUpper());
4011} 4089}
4012 4090
4013void GMainWindow::UpdateAPIText() { 4091void GMainWindow::UpdateAPIText() {
4014 const auto api = Settings::values.renderer_backend.GetValue(); 4092 const auto api = Settings::values.renderer_backend.GetValue();
4015 switch (api) { 4093 const auto renderer_status_text = Config::renderer_backend_texts_map.find(api)->second;
4016 case Settings::RendererBackend::OpenGL: 4094 renderer_status_button->setText(renderer_status_text.toUpper());
4017 renderer_status_button->setText(tr("OPENGL"));
4018 break;
4019 case Settings::RendererBackend::Vulkan:
4020 renderer_status_button->setText(tr("VULKAN"));
4021 break;
4022 case Settings::RendererBackend::Null:
4023 renderer_status_button->setText(tr("NULL"));
4024 break;
4025 }
4026} 4095}
4027 4096
4028void GMainWindow::UpdateFilterText() { 4097void GMainWindow::UpdateFilterText() {
4029 const auto filter = Settings::values.scaling_filter.GetValue(); 4098 const auto filter = Settings::values.scaling_filter.GetValue();
4030 switch (filter) { 4099 const auto filter_text = Config::scaling_filter_texts_map.find(filter)->second;
4031 case Settings::ScalingFilter::NearestNeighbor: 4100 filter_status_button->setText(filter == Settings::ScalingFilter::Fsr ? tr("FSR")
4032 filter_status_button->setText(tr("NEAREST")); 4101 : filter_text.toUpper());
4033 break;
4034 case Settings::ScalingFilter::Bilinear:
4035 filter_status_button->setText(tr("BILINEAR"));
4036 break;
4037 case Settings::ScalingFilter::Bicubic:
4038 filter_status_button->setText(tr("BICUBIC"));
4039 break;
4040 case Settings::ScalingFilter::Gaussian:
4041 filter_status_button->setText(tr("GAUSSIAN"));
4042 break;
4043 case Settings::ScalingFilter::ScaleForce:
4044 filter_status_button->setText(tr("SCALEFORCE"));
4045 break;
4046 case Settings::ScalingFilter::Fsr:
4047 filter_status_button->setText(tr("FSR"));
4048 break;
4049 default:
4050 filter_status_button->setText(tr("BILINEAR"));
4051 break;
4052 }
4053} 4102}
4054 4103
4055void GMainWindow::UpdateAAText() { 4104void GMainWindow::UpdateAAText() {
4056 const auto aa_mode = Settings::values.anti_aliasing.GetValue(); 4105 const auto aa_mode = Settings::values.anti_aliasing.GetValue();
4057 switch (aa_mode) { 4106 const auto aa_text = Config::anti_aliasing_texts_map.find(aa_mode)->second;
4058 case Settings::AntiAliasing::None: 4107 aa_status_button->setText(aa_mode == Settings::AntiAliasing::None
4059 aa_status_button->setText(tr("NO AA")); 4108 ? QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "NO AA"))
4060 break; 4109 : aa_text.toUpper());
4061 case Settings::AntiAliasing::Fxaa:
4062 aa_status_button->setText(tr("FXAA"));
4063 break;
4064 case Settings::AntiAliasing::Smaa:
4065 aa_status_button->setText(tr("SMAA"));
4066 break;
4067 default:
4068 aa_status_button->setText(tr("NO AA"));
4069 break;
4070 }
4071} 4110}
4072 4111
4073void GMainWindow::UpdateVolumeUI() { 4112void GMainWindow::UpdateVolumeUI() {