diff --git a/pcsx2-qt/MainWindow.cpp b/pcsx2-qt/MainWindow.cpp
index f8b830a940..54c7744746 100644
--- a/pcsx2-qt/MainWindow.cpp
+++ b/pcsx2-qt/MainWindow.cpp
@@ -113,6 +113,9 @@ static QString s_current_disc_serial;
static quint32 s_current_disc_crc;
static quint32 s_current_running_crc;
+static constexpr const char* CONTROLLER_TESTER_URL =
+ "https://github.com/PCSX2/tools/releases/download/tests%2Fpad/padtest_ps2.elf";
+
static bool s_record_on_start = false;
static QString s_path_to_recording_for_record_on_start;
@@ -557,6 +560,7 @@ void MainWindow::connectSignals()
connect(m_ui.actionCheckForUpdates, &QAction::triggered, this, [this]() { checkForUpdates(true, true); });
connect(m_ui.actionOpenDataDirectory, &QAction::triggered, this, &MainWindow::onToolsOpenDataDirectoryTriggered);
connect(m_ui.actionCoverDownloader, &QAction::triggered, this, &MainWindow::onToolsCoverDownloaderTriggered);
+ connect(m_ui.actionControllerTester, &QAction::triggered, this, &MainWindow::onToolsControllerTesterTriggered);
connect(m_ui.actionGridViewShowTitles, &QAction::triggered, m_game_list_widget, &GameListWidget::setShowCoverTitles);
connect(m_ui.actionGridViewShowFullTitles, &QAction::triggered, m_game_list_widget, &GameListWidget::setShowFullCoverTitles);
connect(m_ui.actionGridViewZoomIn, &QAction::triggered, m_game_list_widget, [this]() {
@@ -1152,6 +1156,7 @@ void MainWindow::updateEmulationActions(bool starting, bool running, bool stoppi
m_ui.actionToolbarStartBios->setDisabled(starting_or_running_or_stopping);
m_ui.actionStartFullscreenUI->setDisabled(starting_or_running_or_stopping);
m_ui.actionToolbarStartFullscreenUI->setDisabled(starting_or_running_or_stopping);
+ m_ui.actionControllerTester->setDisabled(starting_or_running_or_stopping);
m_ui.actionPowerOff->setEnabled(running);
m_ui.actionPowerOffWithoutSaving->setEnabled(running);
@@ -2265,6 +2270,18 @@ void MainWindow::onToolsCoverDownloaderTriggered()
dlg.exec();
}
+void MainWindow::onToolsControllerTesterTriggered()
+{
+ const std::string path = Path::Combine(EmuFolders::Cache, "padtest_ps2.elf");
+ if (!FileSystem::FileExists(path.c_str()) &&
+ !QtHost::DownloadFile(this, tr("Downloading Controller Tester"), CONTROLLER_TESTER_URL, path))
+ {
+ return;
+ }
+
+ startFile(QString::fromStdString(path));
+}
+
#if !defined(__APPLE__)
void MainWindow::onCreateGameShortcutTriggered()
{
diff --git a/pcsx2-qt/MainWindow.h b/pcsx2-qt/MainWindow.h
index 0c3a799bb5..b909ba815e 100644
--- a/pcsx2-qt/MainWindow.h
+++ b/pcsx2-qt/MainWindow.h
@@ -194,6 +194,7 @@ private Q_SLOTS:
void onAboutActionTriggered();
void onToolsOpenDataDirectoryTriggered();
void onToolsCoverDownloaderTriggered();
+ void onToolsControllerTesterTriggered();
#if !defined(__APPLE__)
void onCreateGameShortcutTriggered();
#endif
diff --git a/pcsx2-qt/MainWindow.ui b/pcsx2-qt/MainWindow.ui
index 9bf5d4e1af..061cff2817 100644
--- a/pcsx2-qt/MainWindow.ui
+++ b/pcsx2-qt/MainWindow.ui
@@ -203,6 +203,7 @@
+
@@ -1056,6 +1057,14 @@
&Cover Downloader...
+
+
+
+
+
+ Controller &Tester
+
+
true