diff --git a/pcsx2-gsrunner/Main.cpp b/pcsx2-gsrunner/Main.cpp index 90e667d8b2..cfb61e74cb 100644 --- a/pcsx2-gsrunner/Main.cpp +++ b/pcsx2-gsrunner/Main.cpp @@ -33,6 +33,7 @@ #include "pcsx2/GameList.h" #include "pcsx2/Host.h" #include "pcsx2/INISettingsInterface.h" +#include "pcsx2/ImGui/FullscreenUI.h" #include "pcsx2/ImGui/ImGuiManager.h" #include "pcsx2/Input/InputManager.h" #include "pcsx2/MTGS.h" @@ -391,6 +392,11 @@ void Host::OnCoverDownloaderOpenRequested() // noop } +void Host::OnCreateMemoryCardOpenRequested() +{ + // noop +} + std::optional InputManager::ConvertHostKeyboardStringToCode(const std::string_view& str) { return std::nullopt; diff --git a/pcsx2-qt/MainWindow.cpp b/pcsx2-qt/MainWindow.cpp index cf817184a9..c48af575f6 100644 --- a/pcsx2-qt/MainWindow.cpp +++ b/pcsx2-qt/MainWindow.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team +// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team // SPDX-License-Identifier: LGPL-3.0+ #include "AboutDialog.h" @@ -16,6 +16,7 @@ #include "Settings/ControllerSettingsWindow.h" #include "Settings/GameListSettingsWidget.h" #include "Settings/InterfaceSettingsWidget.h" +#include "Settings/MemoryCardCreateDialog.h" #include "Tools/InputRecording/InputRecordingViewer.h" #include "Tools/InputRecording/NewInputRecordingDlg.h" #include "svnrev.h" @@ -439,6 +440,7 @@ void MainWindow::connectVMThreadSignals(EmuThread* thread) connect(thread, &EmuThread::onAchievementsLoginSucceeded, this, &MainWindow::onAchievementsLoginSucceeded); connect(thread, &EmuThread::onAchievementsHardcoreModeChanged, this, &MainWindow::onAchievementsHardcoreModeChanged); connect(thread, &EmuThread::onCoverDownloaderOpenRequested, this, &MainWindow::onToolsCoverDownloaderTriggered); + connect(thread, &EmuThread::onCreateMemoryCardOpenRequested, this, &MainWindow::onCreateMemoryCardOpenRequested); connect(m_ui.actionReset, &QAction::triggered, this, &MainWindow::requestReset); connect(m_ui.actionPause, &QAction::toggled, thread, &EmuThread::setVMPaused); @@ -1640,7 +1642,7 @@ void MainWindow::onToolsCoverDownloaderTriggered() { // This can be invoked via big picture, so exit fullscreen. VMLock lock(pauseAndLockVM()); - CoverDownloadDialog dlg(this); + CoverDownloadDialog dlg(lock.getDialogParent()); connect(&dlg, &CoverDownloadDialog::coverRefreshRequested, m_game_list_widget, &GameListWidget::refreshGridCovers); dlg.exec(); } @@ -1671,6 +1673,14 @@ void MainWindow::onToolsEditCheatsPatchesTriggered(bool cheats) QtUtils::OpenURL(this, QUrl::fromLocalFile(QString::fromStdString(path))); } +void MainWindow::onCreateMemoryCardOpenRequested() +{ + // This can be invoked via big picture, so exit fullscreen. + VMLock lock(pauseAndLockVM()); + MemoryCardCreateDialog dlg(lock.getDialogParent()); + dlg.exec(); +} + void MainWindow::updateTheme() { QtHost::UpdateApplicationTheme(); diff --git a/pcsx2-qt/MainWindow.h b/pcsx2-qt/MainWindow.h index 39bf985cf2..e613456f66 100644 --- a/pcsx2-qt/MainWindow.h +++ b/pcsx2-qt/MainWindow.h @@ -158,6 +158,7 @@ private Q_SLOTS: void onToolsOpenDataDirectoryTriggered(); void onToolsCoverDownloaderTriggered(); void onToolsEditCheatsPatchesTriggered(bool cheats); + void onCreateMemoryCardOpenRequested(); void updateTheme(); void reloadThemeSpecificImages(); void updateLanguage(); diff --git a/pcsx2-qt/QtHost.cpp b/pcsx2-qt/QtHost.cpp index 98a7815482..ef3d00bd1f 100644 --- a/pcsx2-qt/QtHost.cpp +++ b/pcsx2-qt/QtHost.cpp @@ -1117,6 +1117,11 @@ void Host::OnCoverDownloaderOpenRequested() emit g_emu_thread->onCoverDownloaderOpenRequested(); } +void Host::OnCreateMemoryCardOpenRequested() +{ + emit g_emu_thread->onCreateMemoryCardOpenRequested(); +} + void Host::VSyncOnCPUThread() { g_emu_thread->getEventLoop()->processEvents(QEventLoop::AllEvents); diff --git a/pcsx2-qt/QtHost.h b/pcsx2-qt/QtHost.h index b5b756d8c1..d9c480c5d6 100644 --- a/pcsx2-qt/QtHost.h +++ b/pcsx2-qt/QtHost.h @@ -168,8 +168,9 @@ Q_SIGNALS: /// Called when hardcore mode is enabled or disabled. void onAchievementsHardcoreModeChanged(bool enabled); - /// Called when cover download is requested. + /// Big Picture UI requests. void onCoverDownloaderOpenRequested(); + void onCreateMemoryCardOpenRequested(); /// Called when video capture starts/stops. void onCaptureStarted(const QString& filename); diff --git a/pcsx2/GameList.h b/pcsx2/GameList.h index 301e10943b..02760753fb 100644 --- a/pcsx2/GameList.h +++ b/pcsx2/GameList.h @@ -162,9 +162,3 @@ namespace GameList void SaveCustomRegionForPath(const std::string& path, int custom_region); std::string GetCustomTitleForPath(const std::string& path); } // namespace GameList - -namespace Host -{ -/// Called by Big Picture UI to begin cover download. -void OnCoverDownloaderOpenRequested(); -} diff --git a/pcsx2/ImGui/FullscreenUI.cpp b/pcsx2/ImGui/FullscreenUI.cpp index 7a2fe9178f..7cc24e5d5f 100644 --- a/pcsx2/ImGui/FullscreenUI.cpp +++ b/pcsx2/ImGui/FullscreenUI.cpp @@ -291,7 +291,6 @@ namespace FullscreenUI static void DrawGraphicsSettingsPage(); static void DrawAudioSettingsPage(); static void DrawMemoryCardSettingsPage(); - static void DrawCreateMemoryCardWindow(); static void DrawControllerSettingsPage(); static void DrawHotkeySettingsPage(); static void DrawAchievementsSettingsPage(std::unique_lock& settings_lock); @@ -3643,8 +3642,7 @@ void FullscreenUI::DrawMemoryCardSettingsPage() MenuHeading(FSUI_CSTR("Settings and Operations")); if (MenuButton(FSUI_ICONSTR(ICON_FA_PLUS, "Create Memory Card"), FSUI_CSTR("Creates a new memory card file or folder."))) - ImGui::OpenPopup("Create Memory Card"); - DrawCreateMemoryCardWindow(); + Host::OnCreateMemoryCardOpenRequested(); DrawFolderSetting(bsi, FSUI_ICONSTR(ICON_FA_FOLDER_OPEN, "Memory Card Directory"), "Folders", "MemoryCards", EmuFolders::MemoryCards); DrawToggleSetting(bsi, FSUI_ICONSTR(ICON_FA_SEARCH, "Folder Memory Card Filter"), @@ -3727,7 +3725,7 @@ void FullscreenUI::DrawMemoryCardSettingsPage() } if (MenuButton(SmallString::from_fmt(fmt::runtime(FSUI_ICONSTR_S(ICON_FA_EJECT, "Eject Card", "##eject_card_{}")), port), - FSUI_CSTR("Resets the card name for this slot."), enabled)) + FSUI_CSTR("Removes the current card from the slot."), enabled)) { bsi->SetStringValue("MemoryCards", file_key.c_str(), ""); SetSettingsChanged(bsi); @@ -3738,95 +3736,6 @@ void FullscreenUI::DrawMemoryCardSettingsPage() EndMenuButtons(); } -void FullscreenUI::DrawCreateMemoryCardWindow() -{ - ImGui::SetNextWindowSize(LayoutScale(700.0f, 0.0f)); - ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); - - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); - ImGui::PushFont(g_large_font); - - bool is_open = true; - if (ImGui::BeginPopupModal(FSUI_CSTR("Create Memory Card"), &is_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize)) - { - ImGui::TextWrapped("%s", - FSUI_CSTR("Enter the name of the memory card you wish to create, and choose a size. We recommend either using 8MB memory " - "cards, or folder Memory Cards for best compatibility.")); - ImGui::NewLine(); - - static char memcard_name[256] = {}; - ImGui::TextUnformatted(FSUI_CSTR("Card Name: ")); - ImGui::InputText("##name", memcard_name, sizeof(memcard_name)); - - ImGui::NewLine(); - - static constexpr std::tuple memcard_types[] = { - {FSUI_NSTR("8 MB [Most Compatible]"), MemoryCardType::File, MemoryCardFileType::PS2_8MB}, - {FSUI_NSTR("16 MB"), MemoryCardType::File, MemoryCardFileType::PS2_16MB}, - {FSUI_NSTR("32 MB"), MemoryCardType::File, MemoryCardFileType::PS2_32MB}, - {FSUI_NSTR("64 MB"), MemoryCardType::File, MemoryCardFileType::PS2_64MB}, - {FSUI_NSTR("Folder [Recommended]"), MemoryCardType::Folder, MemoryCardFileType::PS2_8MB}, - {FSUI_NSTR("128 KB [PS1]"), MemoryCardType::File, MemoryCardFileType::PS1}, - }; - - static int memcard_type = 0; - for (int i = 0; i < static_cast(std::size(memcard_types)); i++) - ImGui::RadioButton(Host::TranslateToCString(TR_CONTEXT, std::get<0>(memcard_types[i])), &memcard_type, i); - - ImGui::NewLine(); - - BeginMenuButtons(); - - const bool create_enabled = (std::strlen(memcard_name) > 0); - - if (ActiveButton(FSUI_ICONSTR(ICON_FA_FOLDER_OPEN, "Create"), false, create_enabled) && std::strlen(memcard_name) > 0) - { - const std::string real_card_name = - fmt::format("{}.{}", memcard_name, (std::get<2>(memcard_types[memcard_type]) == MemoryCardFileType::PS1 ? "mcr" : "ps2")); - if (!Path::IsValidFileName(real_card_name, false)) - { - ShowToast(std::string(), fmt::format(FSUI_FSTR("Memory card name '{}' is not valid."), real_card_name)); - } - else if (!FileMcd_GetCardInfo(real_card_name).has_value()) - { - const auto& [type_title, type, file_type] = memcard_types[memcard_type]; - if (FileMcd_CreateNewCard(real_card_name, type, file_type)) - { - ShowToast(std::string(), fmt::format(FSUI_FSTR("Memory Card '{}' created."), real_card_name)); - - std::memset(memcard_name, 0, sizeof(memcard_name)); - memcard_type = 0; - ImGui::CloseCurrentPopup(); - } - else - { - ShowToast(std::string(), fmt::format(FSUI_FSTR("Failed to create memory card '{}'."), real_card_name)); - } - } - else - { - ShowToast(std::string(), fmt::format(FSUI_FSTR("A memory card with the name '{}' already exists."), real_card_name)); - } - } - - if (ActiveButton(FSUI_ICONSTR(ICON_FA_TIMES, "Cancel"), false)) - { - std::memset(memcard_name, 0, sizeof(memcard_name)); - memcard_type = 0; - - ImGui::CloseCurrentPopup(); - } - - EndMenuButtons(); - - ImGui::EndPopup(); - } - - ImGui::PopFont(); - ImGui::PopStyleVar(2); -} - void FullscreenUI::CopyGlobalControllerSettingsToGame() { SettingsInterface* dsi = GetEditingSettingsInterface(true); @@ -6479,6 +6388,7 @@ void FullscreenUI::DrawAchievementsSettingsPage(std::unique_lock& se #if 0 // TRANSLATION-STRING-AREA-BEGIN TRANSLATE_NOOP("FullscreenUI", "Could not find any CD/DVD-ROM devices. Please ensure you have a drive connected and sufficient permissions to access it."); +TRANSLATE_NOOP("FullscreenUI", "WARNING: Your memory card is still writing data. Shutting down now will IRREVERSIBLY DESTROY YOUR MEMORY CARD. It is strongly recommended to resume your game and let it finish writing to your memory card.\n\nDo you wish to shutdown anyways and IRREVERSIBLY DESTROY YOUR MEMORY CARD?"); TRANSLATE_NOOP("FullscreenUI", "Use Global Setting"); TRANSLATE_NOOP("FullscreenUI", "Default"); TRANSLATE_NOOP("FullscreenUI", "Automatic binding failed, no devices are available."); @@ -6773,13 +6683,9 @@ TRANSLATE_NOOP("FullscreenUI", "%d ms"); TRANSLATE_NOOP("FullscreenUI", "Settings and Operations"); TRANSLATE_NOOP("FullscreenUI", "Creates a new memory card file or folder."); TRANSLATE_NOOP("FullscreenUI", "Simulates a larger memory card by filtering saves only to the current game."); -TRANSLATE_NOOP("FullscreenUI", "Automatically ejects Memory Cards when they differ after loading a state."); TRANSLATE_NOOP("FullscreenUI", "If not set, this card will be considered unplugged."); TRANSLATE_NOOP("FullscreenUI", "The selected memory card image will be used for this slot."); -TRANSLATE_NOOP("FullscreenUI", "Resets the card name for this slot."); -TRANSLATE_NOOP("FullscreenUI", "Create Memory Card"); -TRANSLATE_NOOP("FullscreenUI", "Enter the name of the memory card you wish to create, and choose a size. We recommend either using 8MB memory cards, or folder Memory Cards for best compatibility."); -TRANSLATE_NOOP("FullscreenUI", "Card Name: "); +TRANSLATE_NOOP("FullscreenUI", "Removes the current card from the slot."); TRANSLATE_NOOP("FullscreenUI", "Configuration"); TRANSLATE_NOOP("FullscreenUI", "Uses game-specific settings for controllers for this game."); TRANSLATE_NOOP("FullscreenUI", "Copies the global controller configuration to this game."); @@ -6820,6 +6726,8 @@ TRANSLATE_NOOP("FullscreenUI", "Logs disc reads from games."); TRANSLATE_NOOP("FullscreenUI", "Emotion Engine"); TRANSLATE_NOOP("FullscreenUI", "Rounding Mode"); TRANSLATE_NOOP("FullscreenUI", "Determines how the results of floating-point operations are rounded. Some games need specific settings."); +TRANSLATE_NOOP("FullscreenUI", "Division Rounding Mode"); +TRANSLATE_NOOP("FullscreenUI", "Determines how the results of floating-point division is rounded. Some games need specific settings."); TRANSLATE_NOOP("FullscreenUI", "Clamping Mode"); TRANSLATE_NOOP("FullscreenUI", "Determines how out-of-range floating point numbers are handled. Some games need specific settings."); TRANSLATE_NOOP("FullscreenUI", "Enable EE Recompiler"); @@ -6858,8 +6766,6 @@ TRANSLATE_NOOP("FullscreenUI", "Activating game patches can cause unpredictable TRANSLATE_NOOP("FullscreenUI", "Use patches at your own risk, the PCSX2 team will provide no support for users who have enabled game patches."); TRANSLATE_NOOP("FullscreenUI", "Game Fixes"); TRANSLATE_NOOP("FullscreenUI", "Game fixes should not be modified unless you are aware of what each option does and the implications of doing so."); -TRANSLATE_NOOP("FullscreenUI", "FPU Negative Div Hack"); -TRANSLATE_NOOP("FullscreenUI", "For Gundam games."); TRANSLATE_NOOP("FullscreenUI", "FPU Multiply Hack"); TRANSLATE_NOOP("FullscreenUI", "For Tales of Destiny."); TRANSLATE_NOOP("FullscreenUI", "Use Software Renderer For FMVs"); @@ -6940,10 +6846,6 @@ TRANSLATE_NOOP("FullscreenUI", "Game settings have been cleared for '{}'."); TRANSLATE_NOOP("FullscreenUI", "Console Port {}"); TRANSLATE_NOOP("FullscreenUI", "{} (Current)"); TRANSLATE_NOOP("FullscreenUI", "{} (Folder)"); -TRANSLATE_NOOP("FullscreenUI", "Memory card name '{}' is not valid."); -TRANSLATE_NOOP("FullscreenUI", "Memory Card '{}' created."); -TRANSLATE_NOOP("FullscreenUI", "Failed to create memory card '{}'."); -TRANSLATE_NOOP("FullscreenUI", "A memory card with the name '{}' already exists."); TRANSLATE_NOOP("FullscreenUI", "Failed to load '{}'."); TRANSLATE_NOOP("FullscreenUI", "Input profile '{}' loaded."); TRANSLATE_NOOP("FullscreenUI", "Input profile '{}' saved."); @@ -7154,12 +7056,6 @@ TRANSLATE_NOOP("FullscreenUI", "PS2 (16MB)"); TRANSLATE_NOOP("FullscreenUI", "PS2 (32MB)"); TRANSLATE_NOOP("FullscreenUI", "PS2 (64MB)"); TRANSLATE_NOOP("FullscreenUI", "PS1"); -TRANSLATE_NOOP("FullscreenUI", "8 MB [Most Compatible]"); -TRANSLATE_NOOP("FullscreenUI", "16 MB"); -TRANSLATE_NOOP("FullscreenUI", "32 MB"); -TRANSLATE_NOOP("FullscreenUI", "64 MB"); -TRANSLATE_NOOP("FullscreenUI", "Folder [Recommended]"); -TRANSLATE_NOOP("FullscreenUI", "128 KB [PS1]"); TRANSLATE_NOOP("FullscreenUI", "Negative"); TRANSLATE_NOOP("FullscreenUI", "Positive"); TRANSLATE_NOOP("FullscreenUI", "Chop/Zero (Default)"); @@ -7177,6 +7073,7 @@ TRANSLATE_NOOP("FullscreenUI", "Size"); TRANSLATE_NOOP("FullscreenUI", "Frequency"); TRANSLATE_NOOP("FullscreenUI", "Select Disc Image"); TRANSLATE_NOOP("FullscreenUI", "Select Disc Drive"); +TRANSLATE_NOOP("FullscreenUI", "WARNING: Memory Card Busy"); TRANSLATE_NOOP("FullscreenUI", "Start File"); TRANSLATE_NOOP("FullscreenUI", "Start BIOS"); TRANSLATE_NOOP("FullscreenUI", "Start Disc"); @@ -7226,13 +7123,12 @@ TRANSLATE_NOOP("FullscreenUI", "Latency"); TRANSLATE_NOOP("FullscreenUI", "Sequence Length"); TRANSLATE_NOOP("FullscreenUI", "Seekwindow Size"); TRANSLATE_NOOP("FullscreenUI", "Overlap"); +TRANSLATE_NOOP("FullscreenUI", "Create Memory Card"); TRANSLATE_NOOP("FullscreenUI", "Memory Card Directory"); TRANSLATE_NOOP("FullscreenUI", "Folder Memory Card Filter"); -TRANSLATE_NOOP("FullscreenUI", "Auto Eject When Loading"); -TRANSLATE_NOOP("FullscreenUI", "Create"); -TRANSLATE_NOOP("FullscreenUI", "Cancel"); TRANSLATE_NOOP("FullscreenUI", "Load Profile"); TRANSLATE_NOOP("FullscreenUI", "Save Profile"); +TRANSLATE_NOOP("FullscreenUI", "Create"); TRANSLATE_NOOP("FullscreenUI", "Per-Game Configuration"); TRANSLATE_NOOP("FullscreenUI", "Copy Global Settings"); TRANSLATE_NOOP("FullscreenUI", "Enable SDL Input Source"); @@ -7286,6 +7182,7 @@ TRANSLATE_NOOP("FullscreenUI", "Delete Save"); TRANSLATE_NOOP("FullscreenUI", "Close Menu"); TRANSLATE_NOOP("FullscreenUI", "Default Boot"); TRANSLATE_NOOP("FullscreenUI", "Delete State"); +TRANSLATE_NOOP("FullscreenUI", "Cancel"); TRANSLATE_NOOP("FullscreenUI", "Full Boot"); TRANSLATE_NOOP("FullscreenUI", "Reset Play Time"); TRANSLATE_NOOP("FullscreenUI", "Add Search Directory"); diff --git a/pcsx2/ImGui/FullscreenUI.h b/pcsx2/ImGui/FullscreenUI.h index 8e8a77e7ea..afecfde497 100644 --- a/pcsx2/ImGui/FullscreenUI.h +++ b/pcsx2/ImGui/FullscreenUI.h @@ -37,3 +37,10 @@ namespace FullscreenUI void InvalidateCoverCache(); TinyString TimeToPrintableString(time_t t); } // namespace FullscreenUI + +// Host UI triggers from Big Picture mode. +namespace Host +{ +void OnCoverDownloaderOpenRequested(); +void OnCreateMemoryCardOpenRequested(); +} diff --git a/tests/ctest/core/StubHost.cpp b/tests/ctest/core/StubHost.cpp index 7c59de13fb..23ea03336f 100644 --- a/tests/ctest/core/StubHost.cpp +++ b/tests/ctest/core/StubHost.cpp @@ -5,6 +5,7 @@ #include "pcsx2/GS.h" #include "pcsx2/GameList.h" #include "pcsx2/Host.h" +#include "pcsx2/ImGui/FullscreenUI.h" #include "pcsx2/ImGui/ImGuiManager.h" #include "pcsx2/Input/InputManager.h" #include "pcsx2/VMManager.h" @@ -204,6 +205,10 @@ void Host::OnCoverDownloaderOpenRequested() { } +void Host::OnCreateMemoryCardOpenRequested() +{ +} + std::optional InputManager::ConvertHostKeyboardStringToCode(const std::string_view& str) { return std::nullopt;