summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 662651196..6288fef62 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 9cb9db6cf..ad590ea9e 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 5b338c6e5..82bce9a3a 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);
@@ -4004,94 +4099,38 @@ void GMainWindow::UpdateStatusBar() {
4004} 4099}
4005 4100
4006void GMainWindow::UpdateGPUAccuracyButton() { 4101void GMainWindow::UpdateGPUAccuracyButton() {
4007 switch (Settings::values.gpu_accuracy.GetValue()) { 4102 const auto gpu_accuracy = Settings::values.gpu_accuracy.GetValue();
4008 case Settings::GPUAccuracy::Normal: { 4103 const auto gpu_accuracy_text = Config::gpu_accuracy_texts_map.find(gpu_accuracy)->second;
4009 gpu_accuracy_button->setText(tr("GPU NORMAL")); 4104 gpu_accuracy_button->setText(gpu_accuracy_text.toUpper());
4010 gpu_accuracy_button->setChecked(false); 4105 gpu_accuracy_button->setChecked(gpu_accuracy != Settings::GPUAccuracy::Normal);
4011 break;
4012 }
4013 case Settings::GPUAccuracy::High: {
4014 gpu_accuracy_button->setText(tr("GPU HIGH"));
4015 gpu_accuracy_button->setChecked(true);
4016 break;
4017 }
4018 case Settings::GPUAccuracy::Extreme: {
4019 gpu_accuracy_button->setText(tr("GPU EXTREME"));
4020 gpu_accuracy_button->setChecked(true);
4021 break;
4022 }
4023 default: {
4024 gpu_accuracy_button->setText(tr("GPU ERROR"));
4025 gpu_accuracy_button->setChecked(true);
4026 break;
4027 }
4028 }
4029} 4106}
4030 4107
4031void GMainWindow::UpdateDockedButton() { 4108void GMainWindow::UpdateDockedButton() {
4032 const bool is_docked = Settings::values.use_docked_mode.GetValue(); 4109 const bool is_docked = Settings::values.use_docked_mode.GetValue();
4033 dock_status_button->setChecked(is_docked); 4110 dock_status_button->setChecked(is_docked);
4034 dock_status_button->setText(is_docked ? tr("DOCKED") : tr("HANDHELD")); 4111 dock_status_button->setText(
4112 Config::use_docked_mode_texts_map.find(is_docked)->second.toUpper());
4035} 4113}
4036 4114
4037void GMainWindow::UpdateAPIText() { 4115void GMainWindow::UpdateAPIText() {
4038 const auto api = Settings::values.renderer_backend.GetValue(); 4116 const auto api = Settings::values.renderer_backend.GetValue();
4039 switch (api) { 4117 const auto renderer_status_text = Config::renderer_backend_texts_map.find(api)->second;
4040 case Settings::RendererBackend::OpenGL: 4118 renderer_status_button->setText(renderer_status_text.toUpper());
4041 renderer_status_button->setText(tr("OPENGL"));
4042 break;
4043 case Settings::RendererBackend::Vulkan:
4044 renderer_status_button->setText(tr("VULKAN"));
4045 break;
4046 case Settings::RendererBackend::Null:
4047 renderer_status_button->setText(tr("NULL"));
4048 break;
4049 }
4050} 4119}
4051 4120
4052void GMainWindow::UpdateFilterText() { 4121void GMainWindow::UpdateFilterText() {
4053 const auto filter = Settings::values.scaling_filter.GetValue(); 4122 const auto filter = Settings::values.scaling_filter.GetValue();
4054 switch (filter) { 4123 const auto filter_text = Config::scaling_filter_texts_map.find(filter)->second;
4055 case Settings::ScalingFilter::NearestNeighbor: 4124 filter_status_button->setText(filter == Settings::ScalingFilter::Fsr ? tr("FSR")
4056 filter_status_button->setText(tr("NEAREST")); 4125 : filter_text.toUpper());
4057 break;
4058 case Settings::ScalingFilter::Bilinear:
4059 filter_status_button->setText(tr("BILINEAR"));
4060 break;
4061 case Settings::ScalingFilter::Bicubic:
4062 filter_status_button->setText(tr("BICUBIC"));
4063 break;
4064 case Settings::ScalingFilter::Gaussian:
4065 filter_status_button->setText(tr("GAUSSIAN"));
4066 break;
4067 case Settings::ScalingFilter::ScaleForce:
4068 filter_status_button->setText(tr("SCALEFORCE"));
4069 break;
4070 case Settings::ScalingFilter::Fsr:
4071 filter_status_button->setText(tr("FSR"));
4072 break;
4073 default:
4074 filter_status_button->setText(tr("BILINEAR"));
4075 break;
4076 }
4077} 4126}
4078 4127
4079void GMainWindow::UpdateAAText() { 4128void GMainWindow::UpdateAAText() {
4080 const auto aa_mode = Settings::values.anti_aliasing.GetValue(); 4129 const auto aa_mode = Settings::values.anti_aliasing.GetValue();
4081 switch (aa_mode) { 4130 const auto aa_text = Config::anti_aliasing_texts_map.find(aa_mode)->second;
4082 case Settings::AntiAliasing::None: 4131 aa_status_button->setText(aa_mode == Settings::AntiAliasing::None
4083 aa_status_button->setText(tr("NO AA")); 4132 ? QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "NO AA"))
4084 break; 4133 : aa_text.toUpper());
4085 case Settings::AntiAliasing::Fxaa:
4086 aa_status_button->setText(tr("FXAA"));
4087 break;
4088 case Settings::AntiAliasing::Smaa:
4089 aa_status_button->setText(tr("SMAA"));
4090 break;
4091 default:
4092 aa_status_button->setText(tr("NO AA"));
4093 break;
4094 }
4095} 4134}
4096 4135
4097void GMainWindow::UpdateVolumeUI() { 4136void GMainWindow::UpdateVolumeUI() {