summaryrefslogtreecommitdiff
path: root/src/yuzu
diff options
context:
space:
mode:
Diffstat (limited to 'src/yuzu')
-rw-r--r--src/yuzu/bootmanager.cpp17
-rw-r--r--src/yuzu/bootmanager.h8
-rw-r--r--src/yuzu/configuration/config.cpp19
-rw-r--r--src/yuzu/configuration/config.h3
-rw-r--r--src/yuzu/configuration/configure_general.cpp20
-rw-r--r--src/yuzu/configuration/configure_general.ui99
-rw-r--r--src/yuzu/configuration/configure_graphics.cpp74
-rw-r--r--src/yuzu/configuration/configure_graphics.ui167
-rw-r--r--src/yuzu/configuration/configure_graphics_advanced.ui13
-rw-r--r--src/yuzu/debugger/profiler.cpp2
-rw-r--r--src/yuzu/game_list.cpp2
-rw-r--r--src/yuzu/hotkeys.cpp2
-rw-r--r--src/yuzu/main.cpp568
-rw-r--r--src/yuzu/main.h16
-rw-r--r--src/yuzu/main.ui99
-rw-r--r--src/yuzu/uisettings.h1
16 files changed, 793 insertions, 317 deletions
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp
index 46ab0603d..fd0a130a3 100644
--- a/src/yuzu/bootmanager.cpp
+++ b/src/yuzu/bootmanager.cpp
@@ -303,6 +303,7 @@ GRenderWindow::GRenderWindow(GMainWindow* parent, EmuThread* emu_thread_,
connect(this, &GRenderWindow::ExecuteProgramSignal, parent, &GMainWindow::OnExecuteProgram,
Qt::QueuedConnection);
connect(this, &GRenderWindow::ExitSignal, parent, &GMainWindow::OnExit, Qt::QueuedConnection);
+ connect(this, &GRenderWindow::TasPlaybackStateChanged, parent, &GMainWindow::OnTasStateChanged);
}
void GRenderWindow::ExecuteProgram(std::size_t program_index) {
@@ -319,10 +320,18 @@ GRenderWindow::~GRenderWindow() {
void GRenderWindow::OnFrameDisplayed() {
input_subsystem->GetTas()->UpdateThread();
+ const TasInput::TasState new_tas_state = std::get<0>(input_subsystem->GetTas()->GetStatus());
+
if (!first_frame) {
+ last_tas_state = new_tas_state;
first_frame = true;
emit FirstFrameDisplayed();
}
+
+ if (new_tas_state != last_tas_state) {
+ last_tas_state = new_tas_state;
+ emit TasPlaybackStateChanged();
+ }
}
bool GRenderWindow::IsShown() const {
@@ -628,11 +637,9 @@ void GRenderWindow::ReleaseRenderTarget() {
main_context.reset();
}
-void GRenderWindow::CaptureScreenshot(u32 res_scale, const QString& screenshot_path) {
- VideoCore::RendererBase& renderer = system.Renderer();
- if (res_scale == 0) {
- res_scale = VideoCore::GetResolutionScaleFactor(renderer);
- }
+void GRenderWindow::CaptureScreenshot(const QString& screenshot_path) {
+ auto& renderer = system.Renderer();
+ const f32 res_scale = Settings::values.resolution_info.up_factor;
const Layout::FramebufferLayout layout{Layout::FrameLayoutFromResolutionScale(res_scale)};
screenshot_image = QImage(QSize(layout.width, layout.height), QImage::Format_RGB32);
diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h
index e6a0666e9..061e3605f 100644
--- a/src/yuzu/bootmanager.h
+++ b/src/yuzu/bootmanager.h
@@ -41,6 +41,10 @@ enum class LoadCallbackStage;
class RendererBase;
} // namespace VideoCore
+namespace TasInput {
+enum class TasState;
+}
+
class EmuThread final : public QThread {
Q_OBJECT
@@ -178,7 +182,7 @@ public:
bool IsLoadingComplete() const;
- void CaptureScreenshot(u32 res_scale, const QString& screenshot_path);
+ void CaptureScreenshot(const QString& screenshot_path);
std::pair<u32, u32> ScaleTouch(const QPointF& pos) const;
@@ -203,6 +207,7 @@ signals:
void ExecuteProgramSignal(std::size_t program_index);
void ExitSignal();
void MouseActivity();
+ void TasPlaybackStateChanged();
private:
void TouchBeginEvent(const QTouchEvent* event);
@@ -236,6 +241,7 @@ private:
QWidget* child_widget = nullptr;
bool first_frame = false;
+ TasInput::TasState last_tas_state;
std::array<std::size_t, 16> touch_ids{};
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index faea5dda1..2b670ddfd 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -824,9 +824,13 @@ void Config::ReadRendererValues() {
ReadGlobalSetting(Settings::values.vulkan_device);
ReadGlobalSetting(Settings::values.fullscreen_mode);
ReadGlobalSetting(Settings::values.aspect_ratio);
+ ReadGlobalSetting(Settings::values.resolution_setup);
+ ReadGlobalSetting(Settings::values.scaling_filter);
+ ReadGlobalSetting(Settings::values.anti_aliasing);
ReadGlobalSetting(Settings::values.max_anisotropy);
ReadGlobalSetting(Settings::values.use_speed_limit);
ReadGlobalSetting(Settings::values.speed_limit);
+ ReadGlobalSetting(Settings::values.fps_cap);
ReadGlobalSetting(Settings::values.use_disk_shader_cache);
ReadGlobalSetting(Settings::values.gpu_accuracy);
ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation);
@@ -841,7 +845,6 @@ void Config::ReadRendererValues() {
ReadGlobalSetting(Settings::values.bg_blue);
if (global) {
- ReadBasicSetting(Settings::values.fps_cap);
ReadBasicSetting(Settings::values.renderer_debug);
ReadBasicSetting(Settings::values.renderer_shader_feedback);
ReadBasicSetting(Settings::values.enable_nsight_aftermath);
@@ -1364,9 +1367,22 @@ void Config::SaveRendererValues() {
static_cast<u32>(Settings::values.fullscreen_mode.GetDefault()),
Settings::values.fullscreen_mode.UsingGlobal());
WriteGlobalSetting(Settings::values.aspect_ratio);
+ WriteSetting(QString::fromStdString(Settings::values.resolution_setup.GetLabel()),
+ static_cast<u32>(Settings::values.resolution_setup.GetValue(global)),
+ static_cast<u32>(Settings::values.resolution_setup.GetDefault()),
+ Settings::values.resolution_setup.UsingGlobal());
+ WriteSetting(QString::fromStdString(Settings::values.scaling_filter.GetLabel()),
+ static_cast<u32>(Settings::values.scaling_filter.GetValue(global)),
+ static_cast<u32>(Settings::values.scaling_filter.GetDefault()),
+ Settings::values.scaling_filter.UsingGlobal());
+ WriteSetting(QString::fromStdString(Settings::values.anti_aliasing.GetLabel()),
+ static_cast<u32>(Settings::values.anti_aliasing.GetValue(global)),
+ static_cast<u32>(Settings::values.anti_aliasing.GetDefault()),
+ Settings::values.anti_aliasing.UsingGlobal());
WriteGlobalSetting(Settings::values.max_anisotropy);
WriteGlobalSetting(Settings::values.use_speed_limit);
WriteGlobalSetting(Settings::values.speed_limit);
+ WriteGlobalSetting(Settings::values.fps_cap);
WriteGlobalSetting(Settings::values.use_disk_shader_cache);
WriteSetting(QString::fromStdString(Settings::values.gpu_accuracy.GetLabel()),
static_cast<u32>(Settings::values.gpu_accuracy.GetValue(global)),
@@ -1390,7 +1406,6 @@ void Config::SaveRendererValues() {
WriteGlobalSetting(Settings::values.bg_blue);
if (global) {
- WriteBasicSetting(Settings::values.fps_cap);
WriteBasicSetting(Settings::values.renderer_debug);
WriteBasicSetting(Settings::values.renderer_shader_feedback);
WriteBasicSetting(Settings::values.enable_nsight_aftermath);
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index a7f4a6720..d673c1cdc 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -189,5 +189,8 @@ Q_DECLARE_METATYPE(Settings::CPUAccuracy);
Q_DECLARE_METATYPE(Settings::GPUAccuracy);
Q_DECLARE_METATYPE(Settings::FullscreenMode);
Q_DECLARE_METATYPE(Settings::NvdecEmulation);
+Q_DECLARE_METATYPE(Settings::ResolutionSetup);
+Q_DECLARE_METATYPE(Settings::ScalingFilter);
+Q_DECLARE_METATYPE(Settings::AntiAliasing);
Q_DECLARE_METATYPE(Settings::RendererBackend);
Q_DECLARE_METATYPE(Settings::ShaderBackend);
diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp
index 7af3ea97e..566879317 100644
--- a/src/yuzu/configuration/configure_general.cpp
+++ b/src/yuzu/configuration/configure_general.cpp
@@ -30,6 +30,9 @@ ConfigureGeneral::ConfigureGeneral(const Core::System& system_, QWidget* parent)
connect(ui->button_reset_defaults, &QPushButton::clicked, this,
&ConfigureGeneral::ResetDefaults);
+
+ ui->fps_cap_label->setVisible(Settings::IsConfiguringGlobal());
+ ui->fps_cap_combobox->setVisible(!Settings::IsConfiguringGlobal());
}
ConfigureGeneral::~ConfigureGeneral() = default;
@@ -57,6 +60,11 @@ void ConfigureGeneral::SetConfiguration() {
} else {
ui->speed_limit->setEnabled(Settings::values.use_speed_limit.GetValue() &&
use_speed_limit != ConfigurationShared::CheckState::Global);
+
+ ui->fps_cap_combobox->setCurrentIndex(Settings::values.fps_cap.UsingGlobal() ? 0 : 1);
+ ui->fps_cap->setEnabled(!Settings::values.fps_cap.UsingGlobal());
+ ConfigurationShared::SetHighlight(ui->fps_cap_layout,
+ !Settings::values.fps_cap.UsingGlobal());
}
}
@@ -106,6 +114,13 @@ void ConfigureGeneral::ApplyConfiguration() {
Qt::Checked);
Settings::values.speed_limit.SetValue(ui->speed_limit->value());
}
+
+ if (ui->fps_cap_combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
+ Settings::values.fps_cap.SetGlobal(true);
+ } else {
+ Settings::values.fps_cap.SetGlobal(false);
+ Settings::values.fps_cap.SetValue(ui->fps_cap->value());
+ }
}
}
@@ -148,4 +163,9 @@ void ConfigureGeneral::SetupPerGameUI() {
ui->speed_limit->setEnabled(ui->toggle_speed_limit->isChecked() &&
(use_speed_limit != ConfigurationShared::CheckState::Global));
});
+
+ connect(ui->fps_cap_combobox, qOverload<int>(&QComboBox::activated), this, [this](int index) {
+ ui->fps_cap->setEnabled(index == 1);
+ ConfigurationShared::SetHighlight(ui->fps_cap_layout, index == 1);
+ });
}
diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui
index f9f0e3ebf..112dc72b3 100644
--- a/src/yuzu/configuration/configure_general.ui
+++ b/src/yuzu/configuration/configure_general.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>329</width>
- <height>407</height>
+ <width>744</width>
+ <height>568</height>
</rect>
</property>
<property name="windowTitle">
@@ -28,34 +28,85 @@
<item>
<layout class="QVBoxLayout" name="GeneralVerticalLayout">
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QLabel" name="fps_cap_label">
+ <widget class="QWidget" name="fps_cap_layout" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QComboBox" name="fps_cap_combobox">
+ <property name="currentText">
+ <string>Use global framerate cap</string>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <item>
<property name="text">
- <string>Framerate Cap</string>
+ <string>Use global framerate cap</string>
</property>
- <property name="toolTip">
- <string>Requires the use of the FPS Limiter Toggle hotkey to take effect.</string>
+ </item>
+ <item>
+ <property name="text">
+ <string>Set framerate cap:</string>
</property>
+ </item>
</widget>
- </item>
- <item>
- <widget class="QSpinBox" name="fps_cap">
- <property name="suffix">
- <string>x</string>
- </property>
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>1000</number>
- </property>
- <property name="value">
- <number>500</number>
- </property>
+ </item>
+ <item>
+ <widget class="QLabel" name="fps_cap_label">
+ <property name="toolTip">
+ <string>Requires the use of the FPS Limiter Toggle hotkey to take effect.</string>
+ </property>
+ <property name="text">
+ <string>Framerate Cap</string>
+ </property>
</widget>
- </item>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="fps_cap">
+ <property name="suffix">
+ <string>x</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>1000</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ </widget>
+ </item>
</layout>
+ </widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp
index 8e20cc6f3..59f975a6e 100644
--- a/src/yuzu/configuration/configure_graphics.cpp
+++ b/src/yuzu/configuration/configure_graphics.cpp
@@ -89,6 +89,7 @@ void ConfigureGraphics::SetConfiguration() {
ui->use_asynchronous_gpu_emulation->setEnabled(runtime_lock);
ui->use_disk_shader_cache->setEnabled(runtime_lock);
ui->nvdec_emulation_widget->setEnabled(runtime_lock);
+ ui->resolution_combobox->setEnabled(runtime_lock);
ui->accelerate_astc->setEnabled(runtime_lock);
ui->use_disk_shader_cache->setChecked(Settings::values.use_disk_shader_cache.GetValue());
ui->use_asynchronous_gpu_emulation->setChecked(
@@ -102,6 +103,12 @@ void ConfigureGraphics::SetConfiguration() {
ui->nvdec_emulation->setCurrentIndex(
static_cast<int>(Settings::values.nvdec_emulation.GetValue()));
ui->aspect_ratio_combobox->setCurrentIndex(Settings::values.aspect_ratio.GetValue());
+ ui->resolution_combobox->setCurrentIndex(
+ static_cast<int>(Settings::values.resolution_setup.GetValue()));
+ ui->scaling_filter_combobox->setCurrentIndex(
+ static_cast<int>(Settings::values.scaling_filter.GetValue()));
+ ui->anti_aliasing_combobox->setCurrentIndex(
+ static_cast<int>(Settings::values.anti_aliasing.GetValue()));
} else {
ConfigurationShared::SetPerGameSetting(ui->api, &Settings::values.renderer_backend);
ConfigurationShared::SetHighlight(ui->api_widget,
@@ -122,6 +129,21 @@ void ConfigureGraphics::SetConfiguration() {
ConfigurationShared::SetHighlight(ui->ar_label,
!Settings::values.aspect_ratio.UsingGlobal());
+ ConfigurationShared::SetPerGameSetting(ui->resolution_combobox,
+ &Settings::values.resolution_setup);
+ ConfigurationShared::SetHighlight(ui->resolution_label,
+ !Settings::values.resolution_setup.UsingGlobal());
+
+ ConfigurationShared::SetPerGameSetting(ui->scaling_filter_combobox,
+ &Settings::values.scaling_filter);
+ ConfigurationShared::SetHighlight(ui->scaling_filter_label,
+ !Settings::values.scaling_filter.UsingGlobal());
+
+ ConfigurationShared::SetPerGameSetting(ui->anti_aliasing_combobox,
+ &Settings::values.anti_aliasing);
+ ConfigurationShared::SetHighlight(ui->anti_aliasing_label,
+ !Settings::values.anti_aliasing.UsingGlobal());
+
ui->bg_combobox->setCurrentIndex(Settings::values.bg_red.UsingGlobal() ? 0 : 1);
ui->bg_button->setEnabled(!Settings::values.bg_red.UsingGlobal());
ConfigurationShared::SetHighlight(ui->bg_layout, !Settings::values.bg_red.UsingGlobal());
@@ -133,11 +155,22 @@ void ConfigureGraphics::SetConfiguration() {
}
void ConfigureGraphics::ApplyConfiguration() {
+ const auto resolution_setup = static_cast<Settings::ResolutionSetup>(
+ ui->resolution_combobox->currentIndex() -
+ ((Settings::IsConfiguringGlobal()) ? 0 : ConfigurationShared::USE_GLOBAL_OFFSET));
+
+ const auto scaling_filter = static_cast<Settings::ScalingFilter>(
+ ui->scaling_filter_combobox->currentIndex() -
+ ((Settings::IsConfiguringGlobal()) ? 0 : ConfigurationShared::USE_GLOBAL_OFFSET));
+
+ const auto anti_aliasing = static_cast<Settings::AntiAliasing>(
+ ui->anti_aliasing_combobox->currentIndex() -
+ ((Settings::IsConfiguringGlobal()) ? 0 : ConfigurationShared::USE_GLOBAL_OFFSET));
+
ConfigurationShared::ApplyPerGameSetting(&Settings::values.fullscreen_mode,
ui->fullscreen_mode_combobox);
ConfigurationShared::ApplyPerGameSetting(&Settings::values.aspect_ratio,
ui->aspect_ratio_combobox);
-
ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_disk_shader_cache,
ui->use_disk_shader_cache, use_disk_shader_cache);
ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_gpu_emulation,
@@ -165,7 +198,34 @@ void ConfigureGraphics::ApplyConfiguration() {
Settings::values.bg_green.SetValue(static_cast<u8>(bg_color.green()));
Settings::values.bg_blue.SetValue(static_cast<u8>(bg_color.blue()));
}
+ if (Settings::values.resolution_setup.UsingGlobal()) {
+ Settings::values.resolution_setup.SetValue(resolution_setup);
+ }
+ if (Settings::values.scaling_filter.UsingGlobal()) {
+ Settings::values.scaling_filter.SetValue(scaling_filter);
+ }
+ if (Settings::values.anti_aliasing.UsingGlobal()) {
+ Settings::values.anti_aliasing.SetValue(anti_aliasing);
+ }
} else {
+ if (ui->resolution_combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
+ Settings::values.resolution_setup.SetGlobal(true);
+ } else {
+ Settings::values.resolution_setup.SetGlobal(false);
+ Settings::values.resolution_setup.SetValue(resolution_setup);
+ }
+ if (ui->scaling_filter_combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
+ Settings::values.scaling_filter.SetGlobal(true);
+ } else {
+ Settings::values.scaling_filter.SetGlobal(false);
+ Settings::values.scaling_filter.SetValue(scaling_filter);
+ }
+ if (ui->anti_aliasing_combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
+ Settings::values.anti_aliasing.SetGlobal(true);
+ } else {
+ Settings::values.anti_aliasing.SetGlobal(false);
+ Settings::values.anti_aliasing.SetValue(anti_aliasing);
+ }
if (ui->api->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
Settings::values.renderer_backend.SetGlobal(true);
Settings::values.shader_backend.SetGlobal(true);
@@ -312,6 +372,9 @@ void ConfigureGraphics::SetupPerGameUI() {
ui->device->setEnabled(Settings::values.renderer_backend.UsingGlobal());
ui->fullscreen_mode_combobox->setEnabled(Settings::values.fullscreen_mode.UsingGlobal());
ui->aspect_ratio_combobox->setEnabled(Settings::values.aspect_ratio.UsingGlobal());
+ ui->resolution_combobox->setEnabled(Settings::values.resolution_setup.UsingGlobal());
+ ui->scaling_filter_combobox->setEnabled(Settings::values.scaling_filter.UsingGlobal());
+ ui->anti_aliasing_combobox->setEnabled(Settings::values.anti_aliasing.UsingGlobal());
ui->use_asynchronous_gpu_emulation->setEnabled(
Settings::values.use_asynchronous_gpu_emulation.UsingGlobal());
ui->nvdec_emulation->setEnabled(Settings::values.nvdec_emulation.UsingGlobal());
@@ -340,6 +403,15 @@ void ConfigureGraphics::SetupPerGameUI() {
ConfigurationShared::SetColoredComboBox(
ui->fullscreen_mode_combobox, ui->fullscreen_mode_label,
static_cast<int>(Settings::values.fullscreen_mode.GetValue(true)));
+ ConfigurationShared::SetColoredComboBox(
+ ui->resolution_combobox, ui->resolution_label,
+ static_cast<int>(Settings::values.resolution_setup.GetValue(true)));
+ ConfigurationShared::SetColoredComboBox(
+ ui->scaling_filter_combobox, ui->scaling_filter_label,
+ static_cast<int>(Settings::values.scaling_filter.GetValue(true)));
+ ConfigurationShared::SetColoredComboBox(
+ ui->anti_aliasing_combobox, ui->anti_aliasing_label,
+ static_cast<int>(Settings::values.anti_aliasing.GetValue(true)));
ConfigurationShared::InsertGlobalItem(
ui->api, static_cast<int>(Settings::values.renderer_backend.GetValue(true)));
ConfigurationShared::InsertGlobalItem(
diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui
index beae74344..9241678e4 100644
--- a/src/yuzu/configuration/configure_graphics.ui
+++ b/src/yuzu/configuration/configure_graphics.ui
@@ -310,6 +310,173 @@
</widget>
</item>
<item>
+ <widget class="QWidget" name="resolution_layout" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="resolution_label">
+ <property name="text">
+ <string>Resolution:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="resolution_combobox">
+ <item>
+ <property name="text">
+ <string>0.5X (360p/540p) [EXPERIMENTAL]</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>0.75X (540p/810p) [EXPERIMENTAL]</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>1X (720p/1080p)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>2X (1440p/2160p)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>3X (2160p/3240p)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>4X (2880p/4320p)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>5X (3600p/5400p)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>6X (4320p/6480p)</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="scaling_filter_layout" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="scaling_filter_label">
+ <property name="text">
+ <string>Window Adapting Filter:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="scaling_filter_combobox">
+ <item>
+ <property name="text">
+ <string>Nearest Neighbor</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Bilinear</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Bicubic</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Gaussian</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>ScaleForce</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>AMD FidelityFX™️ Super Resolution [Vulkan Only]</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="anti_aliasing_layout" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="anti_aliasing_label">
+ <property name="text">
+ <string>Anti-Aliasing Method:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="anti_aliasing_combobox">
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>FXAA</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
<widget class="QWidget" name="bg_layout" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui
index d06b45f17..96de0b3d1 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.ui
+++ b/src/yuzu/configuration/configure_graphics_advanced.ui
@@ -125,27 +125,32 @@
<widget class="QComboBox" name="anisotropic_filtering_combobox">
<item>
<property name="text">
+ <string>Automatic</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
<string>Default</string>
</property>
</item>
<item>
<property name="text">
- <string>2x (WILL BREAK THINGS)</string>
+ <string>2x</string>
</property>
</item>
<item>
<property name="text">
- <string>4x (WILL BREAK THINGS)</string>
+ <string>4x</string>
</property>
</item>
<item>
<property name="text">
- <string>8x (WILL BREAK THINGS)</string>
+ <string>8x</string>
</property>
</item>
<item>
<property name="text">
- <string>16x (WILL BREAK THINGS)</string>
+ <string>16x</string>
</property>
</item>
</widget>
diff --git a/src/yuzu/debugger/profiler.cpp b/src/yuzu/debugger/profiler.cpp
index 33110685a..a8b254199 100644
--- a/src/yuzu/debugger/profiler.cpp
+++ b/src/yuzu/debugger/profiler.cpp
@@ -163,7 +163,7 @@ void MicroProfileWidget::mouseReleaseEvent(QMouseEvent* ev) {
}
void MicroProfileWidget::wheelEvent(QWheelEvent* ev) {
- const auto wheel_position = ev->position().toPoint();
+ const auto wheel_position = ev->pos();
MicroProfileMousePosition(wheel_position.x() / x_scale, wheel_position.y() / y_scale,
ev->angleDelta().y() / 120);
ev->accept();
diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp
index 6bd0f9ee9..2af95dbe5 100644
--- a/src/yuzu/game_list.cpp
+++ b/src/yuzu/game_list.cpp
@@ -159,7 +159,7 @@ GameListSearchField::GameListSearchField(GameList* parent) : QWidget{parent} {
* @return true if the haystack contains all words of userinput
*/
static bool ContainsAllWords(const QString& haystack, const QString& userinput) {
- const QStringList userinput_split = userinput.split(QLatin1Char{' '}, Qt::SkipEmptyParts);
+ const QStringList userinput_split = userinput.split(QLatin1Char{' '}, QString::SkipEmptyParts);
return std::all_of(userinput_split.begin(), userinput_split.end(),
[&haystack](const QString& s) { return haystack.contains(s); });
diff --git a/src/yuzu/hotkeys.cpp b/src/yuzu/hotkeys.cpp
index d4e97fa16..e7e58f314 100644
--- a/src/yuzu/hotkeys.cpp
+++ b/src/yuzu/hotkeys.cpp
@@ -46,6 +46,8 @@ QShortcut* HotkeyRegistry::GetHotkey(const QString& group, const QString& action
if (!hk.shortcut)
hk.shortcut = new QShortcut(hk.keyseq, widget, nullptr, nullptr, hk.context);
+ hk.shortcut->setAutoRepeat(false);
+
return hk.shortcut;
}
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index cfda60997..6a070934d 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -747,6 +747,8 @@ void GMainWindow::InitializeWidgets() {
shader_building_label = new QLabel();
shader_building_label->setToolTip(tr("The amount of shaders currently being built"));
+ res_scale_label = new QLabel();
+ res_scale_label->setToolTip(tr("The current selected resolution scaling multiplier."));
emu_speed_label = new QLabel();
emu_speed_label->setToolTip(
tr("Current emulation speed. Values higher or lower than 100% "
@@ -759,8 +761,8 @@ void GMainWindow::InitializeWidgets() {
tr("Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For "
"full-speed emulation this should be at most 16.67 ms."));
- for (auto& label :
- {shader_building_label, emu_speed_label, game_fps_label, emu_frametime_label}) {
+ for (auto& label : {shader_building_label, res_scale_label, emu_speed_label, game_fps_label,
+ emu_frametime_label}) {
label->setVisible(false);
label->setFrameStyle(QFrame::NoFrame);
label->setContentsMargins(4, 0, 4, 0);
@@ -772,6 +774,55 @@ void GMainWindow::InitializeWidgets() {
tas_label->setFocusPolicy(Qt::NoFocus);
statusBar()->insertPermanentWidget(0, tas_label);
+ // setup AA button
+ aa_status_button = new QPushButton();
+ aa_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));
+ aa_status_button->setFocusPolicy(Qt::NoFocus);
+ connect(aa_status_button, &QPushButton::clicked, [&] {
+ auto aa_mode = Settings::values.anti_aliasing.GetValue();
+ if (aa_mode == Settings::AntiAliasing::LastAA) {
+ aa_mode = Settings::AntiAliasing::None;
+ } else {
+ aa_mode = static_cast<Settings::AntiAliasing>(static_cast<u32>(aa_mode) + 1);
+ }
+ Settings::values.anti_aliasing.SetValue(aa_mode);
+ aa_status_button->setChecked(true);
+ UpdateAAText();
+ });
+ UpdateAAText();
+ aa_status_button->setCheckable(true);
+ aa_status_button->setChecked(true);
+ statusBar()->insertPermanentWidget(0, aa_status_button);
+
+ // Setup Filter button
+ filter_status_button = new QPushButton();
+ filter_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));
+ filter_status_button->setFocusPolicy(Qt::NoFocus);
+ connect(filter_status_button, &QPushButton::clicked, [&] {
+ auto filter = Settings::values.scaling_filter.GetValue();
+ if (filter == Settings::ScalingFilter::LastFilter) {
+ filter = Settings::ScalingFilter::NearestNeighbor;
+ } else {
+ filter = static_cast<Settings::ScalingFilter>(static_cast<u32>(filter) + 1);
+ }
+ if (Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL &&
+ filter == Settings::ScalingFilter::Fsr) {
+ filter = Settings::ScalingFilter::NearestNeighbor;
+ }
+ Settings::values.scaling_filter.SetValue(filter);
+ filter_status_button->setChecked(true);
+ UpdateFilterText();
+ });
+ auto filter = Settings::values.scaling_filter.GetValue();
+ if (Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL &&
+ filter == Settings::ScalingFilter::Fsr) {
+ Settings::values.scaling_filter.SetValue(Settings::ScalingFilter::NearestNeighbor);
+ }
+ UpdateFilterText();
+ filter_status_button->setCheckable(true);
+ filter_status_button->setChecked(true);
+ statusBar()->insertPermanentWidget(0, filter_status_button);
+
// Setup Dock button
dock_status_button = new QPushButton();
dock_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));
@@ -842,6 +893,11 @@ void GMainWindow::InitializeWidgets() {
Settings::values.renderer_backend.SetValue(Settings::RendererBackend::Vulkan);
} else {
Settings::values.renderer_backend.SetValue(Settings::RendererBackend::OpenGL);
+ const auto filter = Settings::values.scaling_filter.GetValue();
+ if (filter == Settings::ScalingFilter::Fsr) {
+ Settings::values.scaling_filter.SetValue(Settings::ScalingFilter::NearestNeighbor);
+ UpdateFilterText();
+ }
}
system->ApplySettings();
@@ -896,171 +952,80 @@ void GMainWindow::InitializeRecentFileMenuActions() {
UpdateRecentFiles();
}
+void GMainWindow::LinkActionShortcut(QAction* action, const QString& action_name) {
+ static const QString main_window = QStringLiteral("Main Window");
+ action->setShortcut(hotkey_registry.GetKeySequence(main_window, action_name));
+ action->setShortcutContext(hotkey_registry.GetShortcutContext(main_window, action_name));
+
+ this->addAction(action);
+}
+
void GMainWindow::InitializeHotkeys() {
hotkey_registry.LoadHotkeys();
- const QString main_window = QStringLiteral("Main Window");
- const QString load_file = QStringLiteral("Load File");
- const QString load_amiibo = QStringLiteral("Load Amiibo");
- const QString exit_yuzu = QStringLiteral("Exit yuzu");
- const QString restart_emulation = QStringLiteral("Restart Emulation");
- const QString stop_emulation = QStringLiteral("Stop Emulation");
- const QString toggle_filter_bar = QStringLiteral("Toggle Filter Bar");
- const QString toggle_status_bar = QStringLiteral("Toggle Status Bar");
- const QString fullscreen = QStringLiteral("Fullscreen");
- const QString capture_screenshot = QStringLiteral("Capture Screenshot");
-
- ui->action_Load_File->setShortcut(hotkey_registry.GetKeySequence(main_window, load_file));
- ui->action_Load_File->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, load_file));
-
- ui->action_Load_Amiibo->setShortcut(hotkey_registry.GetKeySequence(main_window, load_amiibo));
- ui->action_Load_Amiibo->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, load_amiibo));
-
- ui->action_Exit->setShortcut(hotkey_registry.GetKeySequence(main_window, exit_yuzu));
- ui->action_Exit->setShortcutContext(hotkey_registry.GetShortcutContext(main_window, exit_yuzu));
-
- ui->action_Restart->setShortcut(hotkey_registry.GetKeySequence(main_window, restart_emulation));
- ui->action_Restart->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, restart_emulation));
-
- ui->action_Stop->setShortcut(hotkey_registry.GetKeySequence(main_window, stop_emulation));
- ui->action_Stop->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, stop_emulation));
-
- ui->action_Show_Filter_Bar->setShortcut(
- hotkey_registry.GetKeySequence(main_window, toggle_filter_bar));
- ui->action_Show_Filter_Bar->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, toggle_filter_bar));
-
- ui->action_Show_Status_Bar->setShortcut(
- hotkey_registry.GetKeySequence(main_window, toggle_status_bar));
- ui->action_Show_Status_Bar->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, toggle_status_bar));
-
- ui->action_Capture_Screenshot->setShortcut(
- hotkey_registry.GetKeySequence(main_window, capture_screenshot));
- ui->action_Capture_Screenshot->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, capture_screenshot));
-
- ui->action_Fullscreen->setShortcut(
- hotkey_registry.GetHotkey(main_window, fullscreen, this)->key());
- ui->action_Fullscreen->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, fullscreen));
-
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Load File"), this),
- &QShortcut::activated, this, &GMainWindow::OnMenuLoadFile);
- connect(
- hotkey_registry.GetHotkey(main_window, QStringLiteral("Continue/Pause Emulation"), this),
- &QShortcut::activated, this, [&] {
- if (emulation_running) {
- if (emu_thread->IsRunning()) {
- OnPauseGame();
- } else {
- OnStartGame();
- }
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Restart Emulation"), this),
- &QShortcut::activated, this, [this] {
- if (!system->IsPoweredOn()) {
- return;
- }
- BootGame(game_path);
- });
- connect(hotkey_registry.GetHotkey(main_window, fullscreen, render_window),
- &QShortcut::activated, ui->action_Fullscreen, &QAction::trigger);
- connect(hotkey_registry.GetHotkey(main_window, fullscreen, render_window),
- &QShortcut::activatedAmbiguously, ui->action_Fullscreen, &QAction::trigger);
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Exit Fullscreen"), this),
- &QShortcut::activated, this, [&] {
- if (emulation_running) {
- ui->action_Fullscreen->setChecked(false);
- ToggleFullscreen();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Toggle Speed Limit"), this),
- &QShortcut::activated, this, [&] {
- Settings::values.use_speed_limit.SetValue(
- !Settings::values.use_speed_limit.GetValue());
- UpdateStatusBar();
- });
+ LinkActionShortcut(ui->action_Load_File, QStringLiteral("Load File"));
+ LinkActionShortcut(ui->action_Load_Amiibo, QStringLiteral("Load Amiibo"));
+ LinkActionShortcut(ui->action_Exit, QStringLiteral("Exit yuzu"));
+ LinkActionShortcut(ui->action_Restart, QStringLiteral("Restart Emulation"));
+ LinkActionShortcut(ui->action_Pause, QStringLiteral("Continue/Pause Emulation"));
+ LinkActionShortcut(ui->action_Stop, QStringLiteral("Stop Emulation"));
+ LinkActionShortcut(ui->action_Show_Filter_Bar, QStringLiteral("Toggle Filter Bar"));
+ LinkActionShortcut(ui->action_Show_Status_Bar, QStringLiteral("Toggle Status Bar"));
+ LinkActionShortcut(ui->action_Fullscreen, QStringLiteral("Fullscreen"));
+ LinkActionShortcut(ui->action_Capture_Screenshot, QStringLiteral("Capture Screenshot"));
+ LinkActionShortcut(ui->action_TAS_Start, QStringLiteral("TAS Start/Stop"));
+ LinkActionShortcut(ui->action_TAS_Record, QStringLiteral("TAS Record"));
+ LinkActionShortcut(ui->action_TAS_Reset, QStringLiteral("TAS Reset"));
+
+ static const QString main_window = QStringLiteral("Main Window");
+ const auto connect_shortcut = [&]<typename Fn>(const QString& action_name, const Fn& function) {
+ const QShortcut* hotkey = hotkey_registry.GetHotkey(main_window, action_name, this);
+ connect(hotkey, &QShortcut::activated, this, function);
+ };
+
+ connect_shortcut(QStringLiteral("Exit Fullscreen"), [&] {
+ if (emulation_running && ui->action_Fullscreen->isChecked()) {
+ ui->action_Fullscreen->setChecked(false);
+ ToggleFullscreen();
+ }
+ });
+ connect_shortcut(QStringLiteral("Toggle Speed Limit"), [&] {
+ Settings::values.use_speed_limit.SetValue(!Settings::values.use_speed_limit.GetValue());
+ UpdateStatusBar();
+ });
constexpr u16 SPEED_LIMIT_STEP = 5;
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Increase Speed Limit"), this),
- &QShortcut::activated, this, [&] {
- if (Settings::values.speed_limit.GetValue() < 9999 - SPEED_LIMIT_STEP) {
- Settings::values.speed_limit.SetValue(SPEED_LIMIT_STEP +
- Settings::values.speed_limit.GetValue());
- UpdateStatusBar();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Decrease Speed Limit"), this),
- &QShortcut::activated, this, [&] {
- if (Settings::values.speed_limit.GetValue() > SPEED_LIMIT_STEP) {
- Settings::values.speed_limit.SetValue(Settings::values.speed_limit.GetValue() -
- SPEED_LIMIT_STEP);
- UpdateStatusBar();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Load Amiibo"), this),
- &QShortcut::activated, this, [&] {
- if (ui->action_Load_Amiibo->isEnabled()) {
- OnLoadAmiibo();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Capture Screenshot"), this),
- &QShortcut::activated, this, [&] {
- if (emu_thread != nullptr && emu_thread->IsRunning()) {
- OnCaptureScreenshot();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Change Docked Mode"), this),
- &QShortcut::activated, this, [&] {
- Settings::values.use_docked_mode.SetValue(
- !Settings::values.use_docked_mode.GetValue());
- OnDockedModeChanged(!Settings::values.use_docked_mode.GetValue(),
- Settings::values.use_docked_mode.GetValue(), *system);
- dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue());
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Mute Audio"), this),
- &QShortcut::activated, this,
- [] { Settings::values.audio_muted = !Settings::values.audio_muted; });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Toggle Framerate Limit"), this),
- &QShortcut::activated, this, [] {
- Settings::values.disable_fps_limit.SetValue(
- !Settings::values.disable_fps_limit.GetValue());
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Toggle Mouse Panning"), this),
- &QShortcut::activated, this, [&] {
- Settings::values.mouse_panning = !Settings::values.mouse_panning;
- if (Settings::values.mouse_panning) {
- render_window->installEventFilter(render_window);
- render_window->setAttribute(Qt::WA_Hover, true);
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("TAS Start/Stop"), this),
- &QShortcut::activated, this, [&] {
- if (!emulation_running) {
- return;
- }
- input_subsystem->GetTas()->StartStop();
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("TAS Reset"), this),
- &QShortcut::activated, this, [&] { input_subsystem->GetTas()->Reset(); });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("TAS Record"), this),
- &QShortcut::activated, this, [&] {
- if (!emulation_running) {
- return;
- }
- bool is_recording = input_subsystem->GetTas()->Record();
- if (!is_recording) {
- const auto res = QMessageBox::question(this, tr("TAS Recording"),
- tr("Overwrite file of player 1?"),
- QMessageBox::Yes | QMessageBox::No);
- input_subsystem->GetTas()->SaveRecording(res == QMessageBox::Yes);
- }
- });
+ connect_shortcut(QStringLiteral("Increase Speed Limit"), [&] {
+ if (Settings::values.speed_limit.GetValue() < 9999 - SPEED_LIMIT_STEP) {
+ Settings::values.speed_limit.SetValue(SPEED_LIMIT_STEP +
+ Settings::values.speed_limit.GetValue());
+ UpdateStatusBar();
+ }
+ });
+ connect_shortcut(QStringLiteral("Decrease Speed Limit"), [&] {
+ if (Settings::values.speed_limit.GetValue() > SPEED_LIMIT_STEP) {
+ Settings::values.speed_limit.SetValue(Settings::values.speed_limit.GetValue() -
+ SPEED_LIMIT_STEP);
+ UpdateStatusBar();
+ }
+ });
+ connect_shortcut(QStringLiteral("Change Docked Mode"), [&] {
+ Settings::values.use_docked_mode.SetValue(!Settings::values.use_docked_mode.GetValue());
+ OnDockedModeChanged(!Settings::values.use_docked_mode.GetValue(),
+ Settings::values.use_docked_mode.GetValue(), *system);
+ dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue());
+ });
+ connect_shortcut(QStringLiteral("Mute Audio"),
+ [] { Settings::values.audio_muted = !Settings::values.audio_muted; });
+ connect_shortcut(QStringLiteral("Toggle Framerate Limit"), [] {
+ Settings::values.disable_fps_limit.SetValue(!Settings::values.disable_fps_limit.GetValue());
+ });
+ connect_shortcut(QStringLiteral("Toggle Mouse Panning"), [&] {
+ Settings::values.mouse_panning = !Settings::values.mouse_panning;
+ if (Settings::values.mouse_panning) {
+ render_window->installEventFilter(render_window);
+ render_window->setAttribute(Qt::WA_Hover, true);
+ }
+ });
}
void GMainWindow::SetDefaultUIGeometry() {
@@ -1115,7 +1080,8 @@ void GMainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) {
(state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) {
auto_paused = true;
OnPauseGame();
- } else if (ui->action_Start->isEnabled() && auto_paused && state == Qt::ApplicationActive) {
+ } else if (emulation_running && !emu_thread->IsRunning() && auto_paused &&
+ state == Qt::ApplicationActive) {
auto_paused = false;
OnStartGame();
}
@@ -1159,61 +1125,86 @@ void GMainWindow::ConnectWidgetEvents() {
}
void GMainWindow::ConnectMenuEvents() {
+ const auto connect_menu = [&]<typename Fn>(QAction* action, const Fn& event_fn) {
+ connect(action, &QAction::triggered, this, event_fn);
+ // Add actions to this window so that hiding menus in fullscreen won't disable them
+ addAction(action);
+ // Add actions to the render window so that they work outside of single window mode
+ render_window->addAction(action);
+ };
+
// File
- connect(ui->action_Load_File, &QAction::triggered, this, &GMainWindow::OnMenuLoadFile);
- connect(ui->action_Load_Folder, &QAction::triggered, this, &GMainWindow::OnMenuLoadFolder);
- connect(ui->action_Install_File_NAND, &QAction::triggered, this,
- &GMainWindow::OnMenuInstallToNAND);
- connect(ui->action_Exit, &QAction::triggered, this, &QMainWindow::close);
- connect(ui->action_Load_Amiibo, &QAction::triggered, this, &GMainWindow::OnLoadAmiibo);
+ connect_menu(ui->action_Load_File, &GMainWindow::OnMenuLoadFile);
+ connect_menu(ui->action_Load_Folder, &GMainWindow::OnMenuLoadFolder);
+ connect_menu(ui->action_Install_File_NAND, &GMainWindow::OnMenuInstallToNAND);
+ connect_menu(ui->action_Exit, &QMainWindow::close);
+ connect_menu(ui->action_Load_Amiibo, &GMainWindow::OnLoadAmiibo);
// Emulation
- connect(ui->action_Start, &QAction::triggered, this, &GMainWindow::OnStartGame);
- connect(ui->action_Pause, &QAction::triggered, this, &GMainWindow::OnPauseGame);
- connect(ui->action_Stop, &QAction::triggered, this, &GMainWindow::OnStopGame);
- connect(ui->action_Report_Compatibility, &QAction::triggered, this,
- &GMainWindow::OnMenuReportCompatibility);
- connect(ui->action_Open_Mods_Page, &QAction::triggered, this, &GMainWindow::OnOpenModsPage);
- connect(ui->action_Open_Quickstart_Guide, &QAction::triggered, this,
- &GMainWindow::OnOpenQuickstartGuide);
- connect(ui->action_Open_FAQ, &QAction::triggered, this, &GMainWindow::OnOpenFAQ);
- connect(ui->action_Restart, &QAction::triggered, this,
- [this] { BootGame(QString(game_path)); });
- connect(ui->action_Configure, &QAction::triggered, this, &GMainWindow::OnConfigure);
- connect(ui->action_Configure_Tas, &QAction::triggered, this, &GMainWindow::OnConfigureTas);
- connect(ui->action_Configure_Current_Game, &QAction::triggered, this,
- &GMainWindow::OnConfigurePerGame);
+ connect_menu(ui->action_Pause, &GMainWindow::OnPauseContinueGame);
+ connect_menu(ui->action_Stop, &GMainWindow::OnStopGame);
+ connect_menu(ui->action_Report_Compatibility, &GMainWindow::OnMenuReportCompatibility);
+ connect_menu(ui->action_Open_Mods_Page, &GMainWindow::OnOpenModsPage);
+ connect_menu(ui->action_Open_Quickstart_Guide, &GMainWindow::OnOpenQuickstartGuide);
+ connect_menu(ui->action_Open_FAQ, &GMainWindow::OnOpenFAQ);
+ connect_menu(ui->action_Restart, &GMainWindow::OnRestartGame);
+ connect_menu(ui->action_Configure, &GMainWindow::OnConfigure);
+ connect_menu(ui->action_Configure_Current_Game, &GMainWindow::OnConfigurePerGame);
// View
- connect(ui->action_Single_Window_Mode, &QAction::triggered, this,
- &GMainWindow::ToggleWindowMode);
- connect(ui->action_Display_Dock_Widget_Headers, &QAction::triggered, this,
- &GMainWindow::OnDisplayTitleBars);
- connect(ui->action_Show_Filter_Bar, &QAction::triggered, this, &GMainWindow::OnToggleFilterBar);
+ connect_menu(ui->action_Fullscreen, &GMainWindow::ToggleFullscreen);
+ connect_menu(ui->action_Single_Window_Mode, &GMainWindow::ToggleWindowMode);
+ connect_menu(ui->action_Display_Dock_Widget_Headers, &GMainWindow::OnDisplayTitleBars);
+ connect_menu(ui->action_Show_Filter_Bar, &GMainWindow::OnToggleFilterBar);
+
connect(ui->action_Show_Status_Bar, &QAction::triggered, statusBar(), &QStatusBar::setVisible);
- connect(ui->action_Reset_Window_Size_720, &QAction::triggered, this,
- &GMainWindow::ResetWindowSize720);
- connect(ui->action_Reset_Window_Size_900, &QAction::triggered, this,
- &GMainWindow::ResetWindowSize900);
- connect(ui->action_Reset_Window_Size_1080, &QAction::triggered, this,
- &GMainWindow::ResetWindowSize1080);
- ui->menu_Reset_Window_Size->addAction(ui->action_Reset_Window_Size_720);
- ui->menu_Reset_Window_Size->addAction(ui->action_Reset_Window_Size_900);
- ui->menu_Reset_Window_Size->addAction(ui->action_Reset_Window_Size_1080);
+ connect_menu(ui->action_Reset_Window_Size_720, &GMainWindow::ResetWindowSize720);
+ connect_menu(ui->action_Reset_Window_Size_900, &GMainWindow::ResetWindowSize900);
+ connect_menu(ui->action_Reset_Window_Size_1080, &GMainWindow::ResetWindowSize1080);
+ ui->menu_Reset_Window_Size->addActions({ui->action_Reset_Window_Size_720,
+ ui->action_Reset_Window_Size_900,
+ ui->action_Reset_Window_Size_1080});
- // Fullscreen
- connect(ui->action_Fullscreen, &QAction::triggered, this, &GMainWindow::ToggleFullscreen);
+ // Tools
+ connect_menu(ui->action_Rederive, std::bind(&GMainWindow::OnReinitializeKeys, this,
+ ReinitializeKeyBehavior::Warning));
+ connect_menu(ui->action_Capture_Screenshot, &GMainWindow::OnCaptureScreenshot);
- // Movie
- connect(ui->action_Capture_Screenshot, &QAction::triggered, this,
- &GMainWindow::OnCaptureScreenshot);
+ // TAS
+ connect_menu(ui->action_TAS_Start, &GMainWindow::OnTasStartStop);
+ connect_menu(ui->action_TAS_Record, &GMainWindow::OnTasRecord);
+ connect_menu(ui->action_TAS_Reset, &GMainWindow::OnTasReset);
+ connect_menu(ui->action_Configure_Tas, &GMainWindow::OnConfigureTas);
// Help
- connect(ui->action_Open_yuzu_Folder, &QAction::triggered, this, &GMainWindow::OnOpenYuzuFolder);
- connect(ui->action_Rederive, &QAction::triggered, this,
- std::bind(&GMainWindow::OnReinitializeKeys, this, ReinitializeKeyBehavior::Warning));
- connect(ui->action_About, &QAction::triggered, this, &GMainWindow::OnAbout);
+ connect_menu(ui->action_Open_yuzu_Folder, &GMainWindow::OnOpenYuzuFolder);
+ connect_menu(ui->action_About, &GMainWindow::OnAbout);
+}
+
+void GMainWindow::UpdateMenuState() {
+ const bool is_paused = emu_thread == nullptr || !emu_thread->IsRunning();
+
+ const std::array running_actions{
+ ui->action_Stop,
+ ui->action_Restart,
+ ui->action_Configure_Current_Game,
+ ui->action_Report_Compatibility,
+ ui->action_Load_Amiibo,
+ ui->action_Pause,
+ };
+
+ for (QAction* action : running_actions) {
+ action->setEnabled(emulation_running);
+ }
+
+ ui->action_Capture_Screenshot->setEnabled(emulation_running && !is_paused);
+
+ if (emulation_running && is_paused) {
+ ui->action_Pause->setText(tr("&Continue"));
+ } else {
+ ui->action_Pause->setText(tr("&Pause"));
+ }
}
void GMainWindow::OnDisplayTitleBars(bool show) {
@@ -1506,15 +1497,8 @@ void GMainWindow::ShutdownGame() {
disconnect(render_window, &GRenderWindow::Closed, this, &GMainWindow::OnStopGame);
// Update the GUI
- ui->action_Start->setEnabled(false);
- ui->action_Start->setText(tr("Start"));
- ui->action_Pause->setEnabled(false);
- ui->action_Stop->setEnabled(false);
- ui->action_Restart->setEnabled(false);
- ui->action_Configure_Current_Game->setEnabled(false);
- ui->action_Report_Compatibility->setEnabled(false);
- ui->action_Load_Amiibo->setEnabled(false);
- ui->action_Capture_Screenshot->setEnabled(false);
+ UpdateMenuState();
+
render_window->hide();
loading_screen->hide();
loading_screen->Clear();
@@ -1526,6 +1510,7 @@ void GMainWindow::ShutdownGame() {
game_list->SetFilterFocus();
tas_label->clear();
input_subsystem->GetTas()->Stop();
+ OnTasStateChanged();
render_window->removeEventFilter(render_window);
render_window->setAttribute(Qt::WA_Hover, false);
@@ -1535,6 +1520,7 @@ void GMainWindow::ShutdownGame() {
// Disable status bar updates
status_bar_update_timer.stop();
shader_building_label->setVisible(false);
+ res_scale_label->setVisible(false);
emu_speed_label->setVisible(false);
game_fps_label->setVisible(false);
emu_frametime_label->setVisible(false);
@@ -2444,31 +2430,36 @@ void GMainWindow::OnStartGame() {
connect(emu_thread.get(), &EmuThread::ErrorThrown, this, &GMainWindow::OnCoreError);
- ui->action_Start->setEnabled(false);
- ui->action_Start->setText(tr("&Continue"));
-
- ui->action_Pause->setEnabled(true);
- ui->action_Stop->setEnabled(true);
- ui->action_Restart->setEnabled(true);
- ui->action_Configure_Current_Game->setEnabled(true);
- ui->action_Report_Compatibility->setEnabled(true);
+ UpdateMenuState();
+ OnTasStateChanged();
discord_rpc->Update();
- ui->action_Load_Amiibo->setEnabled(true);
- ui->action_Capture_Screenshot->setEnabled(true);
+}
+
+void GMainWindow::OnRestartGame() {
+ if (!system->IsPoweredOn()) {
+ return;
+ }
+ // Make a copy since BootGame edits game_path
+ BootGame(QString(game_path));
}
void GMainWindow::OnPauseGame() {
emu_thread->SetRunning(false);
-
- ui->action_Start->setEnabled(true);
- ui->action_Pause->setEnabled(false);
- ui->action_Stop->setEnabled(true);
- ui->action_Capture_Screenshot->setEnabled(false);
-
+ UpdateMenuState();
AllowOSSleep();
}
+void GMainWindow::OnPauseContinueGame() {
+ if (emulation_running) {
+ if (emu_thread->IsRunning()) {
+ OnPauseGame();
+ } else {
+ OnStartGame();
+ }
+ }
+}
+
void GMainWindow::OnStopGame() {
if (system->GetExitLock() && !ConfirmForceLockedExit()) {
return;
@@ -2764,6 +2755,32 @@ void GMainWindow::OnConfigureTas() {
}
}
+void GMainWindow::OnTasStartStop() {
+ if (!emulation_running) {
+ return;
+ }
+ input_subsystem->GetTas()->StartStop();
+ OnTasStateChanged();
+}
+
+void GMainWindow::OnTasRecord() {
+ if (!emulation_running) {
+ return;
+ }
+ const bool is_recording = input_subsystem->GetTas()->Record();
+ if (!is_recording) {
+ const auto res =
+ QMessageBox::question(this, tr("TAS Recording"), tr("Overwrite file of player 1?"),
+ QMessageBox::Yes | QMessageBox::No);
+ input_subsystem->GetTas()->SaveRecording(res == QMessageBox::Yes);
+ }
+ OnTasStateChanged();
+}
+
+void GMainWindow::OnTasReset() {
+ input_subsystem->GetTas()->Reset();
+}
+
void GMainWindow::OnConfigurePerGame() {
const u64 title_id = system->GetCurrentProcessProgramID();
OpenPerGameConfiguration(title_id, game_path.toStdString());
@@ -2801,6 +2818,10 @@ void GMainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file
}
void GMainWindow::OnLoadAmiibo() {
+ if (emu_thread == nullptr || !emu_thread->IsRunning()) {
+ return;
+ }
+
const QString extensions{QStringLiteral("*.bin")};
const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions);
const QString filename = QFileDialog::getOpenFileName(this, tr("Load Amiibo"), {}, file_filter);
@@ -2864,6 +2885,10 @@ void GMainWindow::OnToggleFilterBar() {
}
void GMainWindow::OnCaptureScreenshot() {
+ if (emu_thread == nullptr || !emu_thread->IsRunning()) {
+ return;
+ }
+
const u64 title_id = system->GetCurrentProcessProgramID();
const auto screenshot_path =
QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::ScreenshotsDir));
@@ -2889,8 +2914,7 @@ void GMainWindow::OnCaptureScreenshot() {
}
}
#endif
- render_window->CaptureScreenshot(UISettings::values.screenshot_resolution_factor.GetValue(),
- filename);
+ render_window->CaptureScreenshot(filename);
}
// TODO: Written 2020-10-01: Remove per-game config migration code when it is irrelevant
@@ -2958,6 +2982,23 @@ QString GMainWindow::GetTasStateDescription() const {
}
}
+void GMainWindow::OnTasStateChanged() {
+ bool is_running = false;
+ bool is_recording = false;
+ if (emulation_running) {
+ const TasInput::TasState tas_status = std::get<0>(input_subsystem->GetTas()->GetStatus());
+ is_running = tas_status == TasInput::TasState::Running;
+ is_recording = tas_status == TasInput::TasState::Recording;
+ }
+
+ ui->action_TAS_Start->setText(is_running ? tr("&Stop Running") : tr("&Start"));
+ ui->action_TAS_Record->setText(is_recording ? tr("Stop R&ecording") : tr("R&ecord"));
+
+ ui->action_TAS_Start->setEnabled(emulation_running);
+ ui->action_TAS_Record->setEnabled(emulation_running);
+ ui->action_TAS_Reset->setEnabled(emulation_running);
+}
+
void GMainWindow::UpdateStatusBar() {
if (emu_thread == nullptr) {
status_bar_update_timer.stop();
@@ -2981,6 +3022,11 @@ void GMainWindow::UpdateStatusBar() {
shader_building_label->setVisible(false);
}
+ const auto res_info = Settings::values.resolution_info;
+ const auto res_scale = res_info.up_factor;
+ res_scale_label->setText(
+ tr("Scale: %1x", "%1 is the resolution scaling factor").arg(res_scale));
+
if (Settings::values.use_speed_limit.GetValue()) {
emu_speed_label->setText(tr("Speed: %1% / %2%")
.arg(results.emulation_speed * 100.0, 0, 'f', 0)
@@ -2996,6 +3042,7 @@ void GMainWindow::UpdateStatusBar() {
}
emu_frametime_label->setText(tr("Frame: %1 ms").arg(results.frametime * 1000.0, 0, 'f', 2));
+ res_scale_label->setVisible(true);
emu_speed_label->setVisible(!Settings::values.use_multi_core.GetValue());
game_fps_label->setVisible(true);
emu_frametime_label->setVisible(true);
@@ -3025,11 +3072,55 @@ void GMainWindow::UpdateGPUAccuracyButton() {
}
}
+void GMainWindow::UpdateFilterText() {
+ const auto filter = Settings::values.scaling_filter.GetValue();
+ switch (filter) {
+ case Settings::ScalingFilter::NearestNeighbor:
+ filter_status_button->setText(tr("NEAREST"));
+ break;
+ case Settings::ScalingFilter::Bilinear:
+ filter_status_button->setText(tr("BILINEAR"));
+ break;
+ case Settings::ScalingFilter::Bicubic:
+ filter_status_button->setText(tr("BICUBIC"));
+ break;
+ case Settings::ScalingFilter::Gaussian:
+ filter_status_button->setText(tr("GAUSSIAN"));
+ break;
+ case Settings::ScalingFilter::ScaleForce:
+ filter_status_button->setText(tr("SCALEFORCE"));
+ break;
+ case Settings::ScalingFilter::Fsr:
+ filter_status_button->setText(tr("FSR"));
+ break;
+ default:
+ filter_status_button->setText(tr("BILINEAR"));
+ break;
+ }
+}
+
+void GMainWindow::UpdateAAText() {
+ const auto aa_mode = Settings::values.anti_aliasing.GetValue();
+ switch (aa_mode) {
+ case Settings::AntiAliasing::None:
+ aa_status_button->setText(tr("NO AA"));
+ break;
+ case Settings::AntiAliasing::Fxaa:
+ aa_status_button->setText(tr("FXAA"));
+ break;
+ default:
+ aa_status_button->setText(tr("NO AA"));
+ break;
+ }
+}
+
void GMainWindow::UpdateStatusButtons() {
dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue());
renderer_status_button->setChecked(Settings::values.renderer_backend.GetValue() ==
Settings::RendererBackend::Vulkan);
UpdateGPUAccuracyButton();
+ UpdateFilterText();
+ UpdateAAText();
}
void GMainWindow::UpdateUISettings() {
@@ -3194,9 +3285,9 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {
if (!errors.isEmpty()) {
QMessageBox::warning(
this, tr("Derivation Components Missing"),
- tr("Components are missing that may hinder key derivation from completing. "
+ tr("Encryption keys are missing. "
"<br>Please follow <a href='https://yuzu-emu.org/help/quickstart/'>the yuzu "
- "quickstart guide</a> to get all your keys and "
+ "quickstart guide</a> to get all your keys, firmware and "
"games.<br><br><small>(%1)</small>")
.arg(errors));
}
@@ -3448,9 +3539,6 @@ void GMainWindow::OnLanguageChanged(const QString& locale) {
LoadTranslation();
ui->retranslateUi(this);
UpdateWindowTitle();
-
- if (emulation_running)
- ui->action_Start->setText(tr("&Continue"));
}
void GMainWindow::SetDiscordEnabled([[maybe_unused]] bool state) {
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index 981102daa..0fd41ed4f 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -177,6 +177,7 @@ public slots:
void WebBrowserOpenWebPage(const std::string& main_url, const std::string& additional_args,
bool is_local);
void OnAppFocusStateChanged(Qt::ApplicationState state);
+ void OnTasStateChanged();
private:
void RegisterMetaTypes();
@@ -190,6 +191,7 @@ private:
void ConnectWidgetEvents();
void ConnectMenuEvents();
+ void UpdateMenuState();
void PreventOSSleep();
void AllowOSSleep();
@@ -239,7 +241,9 @@ private:
private slots:
void OnStartGame();
+ void OnRestartGame();
void OnPauseGame();
+ void OnPauseContinueGame();
void OnStopGame();
void OnMenuReportCompatibility();
void OnOpenModsPage();
@@ -268,6 +272,9 @@ private slots:
void OnMenuRecentFile();
void OnConfigure();
void OnConfigureTas();
+ void OnTasStartStop();
+ void OnTasRecord();
+ void OnTasReset();
void OnConfigurePerGame();
void OnLoadAmiibo();
void OnOpenYuzuFolder();
@@ -290,6 +297,9 @@ private slots:
void OnMouseActivity();
private:
+ /// Updates an action's shortcut and text to reflect an updated hotkey from the hotkey registry.
+ void LinkActionShortcut(QAction* action, const QString& action_name);
+
void RemoveBaseContent(u64 program_id, const QString& entry_type);
void RemoveUpdateContent(u64 program_id, const QString& entry_type);
void RemoveAddOnContent(u64 program_id, const QString& entry_type);
@@ -302,6 +312,8 @@ private:
void MigrateConfigFiles();
void UpdateWindowTitle(std::string_view title_name = {}, std::string_view title_version = {},
std::string_view gpu_vendor = {});
+ void UpdateFilterText();
+ void UpdateAAText();
void UpdateStatusBar();
void UpdateGPUAccuracyButton();
void UpdateStatusButtons();
@@ -311,6 +323,7 @@ private:
void OpenURL(const QUrl& url);
void LoadTranslation();
void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
+
QString GetTasStateDescription() const;
std::unique_ptr<Ui::MainWindow> ui;
@@ -328,6 +341,7 @@ private:
// Status bar elements
QLabel* message_label = nullptr;
QLabel* shader_building_label = nullptr;
+ QLabel* res_scale_label = nullptr;
QLabel* emu_speed_label = nullptr;
QLabel* game_fps_label = nullptr;
QLabel* emu_frametime_label = nullptr;
@@ -335,6 +349,8 @@ private:
QPushButton* gpu_accuracy_button = nullptr;
QPushButton* renderer_status_button = nullptr;
QPushButton* dock_status_button = nullptr;
+ QPushButton* filter_status_button = nullptr;
+ QPushButton* aa_status_button = nullptr;
QTimer status_bar_update_timer;
std::unique_ptr<Config> config;
diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui
index a62e39a06..5719b2ee4 100644
--- a/src/yuzu/main.ui
+++ b/src/yuzu/main.ui
@@ -66,7 +66,6 @@
<property name="title">
<string>&amp;Emulation</string>
</property>
- <addaction name="action_Start"/>
<addaction name="action_Pause"/>
<addaction name="action_Stop"/>
<addaction name="action_Restart"/>
@@ -79,39 +78,39 @@
<string>&amp;View</string>
</property>
<widget class="QMenu" name="menu_Reset_Window_Size">
- <property name="title">
- <string>&amp;Reset Window Size</string>
- </property>
+ <property name="title">
+ <string>&amp;Reset Window Size</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_View_Debugging">
+ <property name="title">
+ <string>&amp;Debugging</string>
+ </property>
</widget>
<action name="action_Reset_Window_Size_720">
- <property name="text">
- <string>Reset Window Size to &amp;720p</string>
- </property>
- <property name="iconText">
- <string>Reset Window Size to 720p</string>
- </property>
+ <property name="text">
+ <string>Reset Window Size to &amp;720p</string>
+ </property>
+ <property name="iconText">
+ <string>Reset Window Size to 720p</string>
+ </property>
</action>
<action name="action_Reset_Window_Size_900">
- <property name="text">
- <string>Reset Window Size to &amp;900p</string>
- </property>
- <property name="iconText">
- <string>Reset Window Size to 900p</string>
- </property>
+ <property name="text">
+ <string>Reset Window Size to &amp;900p</string>
+ </property>
+ <property name="iconText">
+ <string>Reset Window Size to 900p</string>
+ </property>
</action>
<action name="action_Reset_Window_Size_1080">
- <property name="text">
- <string>Reset Window Size to &amp;1080p</string>
- </property>
- <property name="iconText">
- <string>Reset Window Size to 1080p</string>
- </property>
- </action>
- <widget class="QMenu" name="menu_View_Debugging">
- <property name="title">
- <string>&amp;Debugging</string>
+ <property name="text">
+ <string>Reset Window Size to &amp;1080p</string>
</property>
- </widget>
+ <property name="iconText">
+ <string>Reset Window Size to 1080p</string>
+ </property>
+ </action>
<addaction name="action_Fullscreen"/>
<addaction name="action_Single_Window_Mode"/>
<addaction name="action_Display_Dock_Widget_Headers"/>
@@ -125,10 +124,20 @@
<property name="title">
<string>&amp;Tools</string>
</property>
+ <widget class="QMenu" name="menuTAS">
+ <property name="title">
+ <string>&amp;TAS</string>
+ </property>
+ <addaction name="action_TAS_Start"/>
+ <addaction name="action_TAS_Record"/>
+ <addaction name="action_TAS_Reset"/>
+ <addaction name="separator"/>
+ <addaction name="action_Configure_Tas"/>
+ </widget>
<addaction name="action_Rederive"/>
<addaction name="separator"/>
<addaction name="action_Capture_Screenshot"/>
- <addaction name="action_Configure_Tas"/>
+ <addaction name="menuTAS"/>
</widget>
<widget class="QMenu" name="menu_Help">
<property name="title">
@@ -170,14 +179,6 @@
<string>E&amp;xit</string>
</property>
</action>
- <action name="action_Start">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>&amp;Start</string>
- </property>
- </action>
<action name="action_Pause">
<property name="enabled">
<bool>false</bool>
@@ -309,7 +310,7 @@
</action>
<action name="action_Configure_Tas">
<property name="text">
- <string>Configure &amp;TAS...</string>
+ <string>&amp;Configure TAS...</string>
</property>
</action>
<action name="action_Configure_Current_Game">
@@ -320,6 +321,30 @@
<string>Configure C&amp;urrent Game...</string>
</property>
</action>
+ <action name="action_TAS_Start">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Start</string>
+ </property>
+ </action>
+ <action name="action_TAS_Reset">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Reset</string>
+ </property>
+ </action>
+ <action name="action_TAS_Record">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>R&amp;ecord</string>
+ </property>
+ </action>
</widget>
<resources>
<include location="yuzu.qrc"/>
diff --git a/src/yuzu/uisettings.h b/src/yuzu/uisettings.h
index cac19452f..936914ef3 100644
--- a/src/yuzu/uisettings.h
+++ b/src/yuzu/uisettings.h
@@ -68,7 +68,6 @@ struct Values {
Settings::BasicSetting<bool> enable_discord_presence{true, "enable_discord_presence"};
Settings::BasicSetting<bool> enable_screenshot_save_as{true, "enable_screenshot_save_as"};
- Settings::BasicSetting<u16> screenshot_resolution_factor{0, "screenshot_resolution_factor"};
QString roms_path;
QString symbols_path;