From 72250e691a2748b787d5dd12b305200af9b0ee8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo?= Date: Thu, 16 Jan 2025 12:59:14 -0300 Subject: [PATCH] Add tutorial for installer wizard for add files and add folder (#86) * Add tutorial for installer wizard for add files and add folder. * locale: update tutorial strings --------- Co-authored-by: Hyper <34012267+hyperbx@users.noreply.github.com> --- UnleashedRecomp/locale/locale.cpp | 12 ++++++ UnleashedRecomp/ui/installer_wizard.cpp | 53 ++++++++++++++++++++----- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/UnleashedRecomp/locale/locale.cpp b/UnleashedRecomp/locale/locale.cpp index 16d200b..ddcb7bb 100644 --- a/UnleashedRecomp/locale/locale.cpp +++ b/UnleashedRecomp/locale/locale.cpp @@ -255,6 +255,18 @@ std::unordered_map> g_lo { ELanguage::Italian, "Alcuni dei file che sono stati\nselezionati non sono validi.\n\nAssicurati che tutti\ni file sono quelli corretti\ne riprova." } } }, + { + "Installer_Message_FilePickerTutorial", + { + { ELanguage::English, "Select a digital dump from\nyour Xbox 360.\n\nFor choosing a folder with\npre-existing game files,\nuse the \"Add Folder\"\noption instead." }, + } + }, + { + "Installer_Message_FolderPickerTutorial", + { + { ELanguage::English, "Select a folder that contains\nthe files that have been\nextracted from the game.\n\nFor choosing a digital dump\nfrom your Xbox 360, use the\n\"Add Files\" option instead." }, + } + }, { "Installer_Message_IncompatibleGameData", { diff --git a/UnleashedRecomp/ui/installer_wizard.cpp b/UnleashedRecomp/ui/installer_wizard.cpp index 4c356a7..2a88d71 100644 --- a/UnleashedRecomp/ui/installer_wizard.cpp +++ b/UnleashedRecomp/ui/installer_wizard.cpp @@ -137,6 +137,9 @@ static std::list g_currentPickerResults; static std::atomic g_currentPickerResultsReady = false; static std::string g_currentPickerErrorMessage; static std::unique_ptr g_currentPickerThread; +static bool g_pickerTutorialCleared[2] = {}; +static bool g_pickerTutorialTriggered = false; +static bool g_pickerTutorialFolderMode = false; static bool g_currentPickerVisible = false; static bool g_currentPickerFolderMode = false; static int g_currentMessageResult = -1; @@ -913,8 +916,7 @@ static void PickerThreadProcess() g_currentPickerResultsReady = true; } -static void ShowPicker(bool folderMode) -{ +static void PickerStart(bool folderMode) { if (g_currentPickerThread != nullptr) { g_currentPickerThread->join(); @@ -925,7 +927,7 @@ static void ShowPicker(bool folderMode) g_currentPickerFolderMode = folderMode; g_currentPickerResultsReady = false; g_currentPickerVisible = true; - + // Optional single thread mode for testing on systems that do not interact well with the separate thread being used for NFD. constexpr bool singleThreadMode = false; if (singleThreadMode) @@ -934,7 +936,22 @@ static void ShowPicker(bool folderMode) g_currentPickerThread = std::make_unique(PickerThreadProcess); } -static void ParseSourcePaths(std::list &paths) +static void PickerShow(bool folderMode) +{ + if (g_pickerTutorialCleared[folderMode]) + { + PickerStart(folderMode); + } + else + { + g_currentMessagePrompt = Localise(folderMode ? "Installer_Message_FolderPickerTutorial" : "Installer_Message_FilePickerTutorial"); + g_currentMessagePromptConfirmation = false; + g_pickerTutorialTriggered = true; + g_pickerTutorialFolderMode = folderMode; + } +} + +static bool ParseSourcePaths(std::list &paths) { assert((g_currentPage == WizardPage::SelectGameAndUpdate) || (g_currentPage == WizardPage::SelectDLC)); @@ -995,6 +1012,8 @@ static void ParseSourcePaths(std::list &paths) g_currentMessagePrompt = stringStream.str(); g_currentMessagePromptConfirmation = false; } + + return failedPaths.empty(); } static void DrawLanguagePicker() @@ -1040,7 +1059,7 @@ static void DrawSourcePickers() DrawButton(min, max, addFilesText.c_str(), false, true, buttonPressed, ADD_BUTTON_MAX_TEXT_WIDTH); if (buttonPressed) { - ShowPicker(false); + PickerShow(false); } min.x += Scale(BOTTOM_X_GAP + textSize.x * squashRatio); @@ -1053,7 +1072,7 @@ static void DrawSourcePickers() DrawButton(min, max, addFolderText.c_str(), false, true, buttonPressed, ADD_BUTTON_MAX_TEXT_WIDTH); if (buttonPressed) { - ShowPicker(true); + PickerShow(true); } } } @@ -1354,7 +1373,18 @@ static void DrawMessagePrompt() } } -static void CheckPickerResults() +static void PickerCheckTutorial() +{ + if (!g_pickerTutorialTriggered || !g_currentMessagePrompt.empty()) + { + return; + } + + PickerStart(g_pickerTutorialFolderMode); + g_pickerTutorialTriggered = false; +} + +static void PickerCheckResults() { if (!g_currentPickerResultsReady) { @@ -1368,7 +1398,11 @@ static void CheckPickerResults() g_currentPickerErrorMessage.clear(); } - ParseSourcePaths(g_currentPickerResults); + if (!g_currentPickerResults.empty() && ParseSourcePaths(g_currentPickerResults)) + { + g_pickerTutorialCleared[g_pickerTutorialFolderMode] = true; + } + g_currentPickerResultsReady = false; g_currentPickerVisible = false; } @@ -1411,7 +1445,8 @@ void InstallerWizard::Draw() DrawNextButton(); DrawBorders(); DrawMessagePrompt(); - CheckPickerResults(); + PickerCheckTutorial(); + PickerCheckResults(); if (g_isDisappearing) {