diff --git a/src/core/fullscreenui_settings.cpp b/src/core/fullscreenui_settings.cpp index 58feaa103..dfbd665b6 100644 --- a/src/core/fullscreenui_settings.cpp +++ b/src/core/fullscreenui_settings.cpp @@ -220,12 +220,15 @@ struct SettingsLocals bool cover_downloader_use_serial_names = false; GPURenderer graphics_adapter_list_cache_renderer = GPURenderer::Count; InputBindingDialog input_binding_dialog; + std::unique_ptr achievements_login_error; + char achievements_login_username[256] = {}; + char achievements_login_password[256] = {}; + char cover_downloader_template_urls[512] = {}; }; } // namespace ALIGN_TO_CACHE_LINE static SettingsLocals s_settings_locals; -static char s_cover_downloader_template_urls[512]; } // namespace FullscreenUI @@ -2743,8 +2746,8 @@ void FullscreenUI::DrawCoverDownloaderWindow() const std::vector urls = Core::GetBaseStringListSetting("UI", "CoverDownloaderURL"); if (!urls.empty()) { - StringUtil::Strlcpy(s_cover_downloader_template_urls, StringUtil::JoinString(urls, '\n'), - sizeof(s_cover_downloader_template_urls)); + StringUtil::Strlcpy(s_settings_locals.cover_downloader_template_urls, StringUtil::JoinString(urls, '\n'), + sizeof(s_settings_locals.cover_downloader_template_urls)); } } @@ -2770,7 +2773,8 @@ void FullscreenUI::DrawCoverDownloaderWindow() ImGui::TextWrapped("%s", FSUI_CSTR("Example: https://www.example-not-a-real-domain.com/covers/${serial}.jpg")); ImGui::NewLine(); - ImGui::InputTextMultiline("##templates", s_cover_downloader_template_urls, sizeof(s_cover_downloader_template_urls), + ImGui::InputTextMultiline("##templates", s_settings_locals.cover_downloader_template_urls, + sizeof(s_settings_locals.cover_downloader_template_urls), ImVec2(ImGui::GetCurrentWindow()->WorkRect.GetWidth(), LayoutScale(175.0f))); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(5.0f)); @@ -2781,7 +2785,7 @@ void FullscreenUI::DrawCoverDownloaderWindow() ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); - const bool download_enabled = (std::strlen(s_cover_downloader_template_urls) > 0); + const bool download_enabled = (std::strlen(s_settings_locals.cover_downloader_template_urls) > 0); BeginHorizontalMenuButtons(2, 200.0f); ResetFocusHere(); @@ -2791,7 +2795,7 @@ void FullscreenUI::DrawCoverDownloaderWindow() // TODO: Remove release once using move_only_function std::unique_ptr progress = OpenModalProgressDialog(FSUI_STR("Cover Downloader"), 1000.0f); Host::QueueAsyncTask([progress = progress.release(), - urls = StringUtil::SplitNewString(s_cover_downloader_template_urls, '\n'), + urls = StringUtil::SplitNewString(s_settings_locals.cover_downloader_template_urls, '\n'), use_serial_names = s_settings_locals.cover_downloader_use_serial_names]() { Error error; if (!GameList::DownloadCovers( @@ -2841,7 +2845,8 @@ void FullscreenUI::DrawCoverDownloaderWindow() void FullscreenUI::SaveCoverDownloaderURLs() { - const std::vector urls = StringUtil::SplitNewString(s_cover_downloader_template_urls, '\n'); + const std::vector urls = + StringUtil::SplitNewString(s_settings_locals.cover_downloader_template_urls, '\n'); if (urls != Core::GetBaseStringListSetting("UI", "CoverDownloaderURL")) Core::SetBaseStringListSettingValue("UI", "CoverDownloaderURL", urls); } @@ -5317,16 +5322,15 @@ void FullscreenUI::DrawAchievementsLoginWindow() { static constexpr const char* LOGIN_PROGRESS_NAME = "AchievementsLogin"; - static char username[256] = {}; - static char password[256] = {}; - static std::unique_ptr login_error; - if (!BeginFixedPopupDialog(LayoutScale(LAYOUT_LARGE_POPUP_PADDING), LayoutScale(LAYOUT_LARGE_POPUP_ROUNDING), LayoutScale(600.0f, 0.0f))) { - std::memset(username, 0, sizeof(username)); - std::memset(password, 0, sizeof(password)); - login_error.reset(); + // NOTE: Deliberately memset()'ed because it's credentials. + std::memset(s_settings_locals.achievements_login_username, 0, + sizeof(s_settings_locals.achievements_login_username)); + std::memset(s_settings_locals.achievements_login_password, 0, + sizeof(s_settings_locals.achievements_login_password)); + s_settings_locals.achievements_login_error.reset(); return; } @@ -5349,8 +5353,9 @@ void FullscreenUI::DrawAchievementsLoginWindow() ImGui::SetCursorPosY(ImGui::GetCursorPosY() + ra_logo_size.y + LayoutScale(15.0f)); ImGui::PushStyleColor(ImGuiCol_Text, DarkerColor(ImGui::GetStyle().Colors[ImGuiCol_Text])); + ImGui::PushFont(UIStyle.Font, UIStyle.MediumLargeFontSize, UIStyle.NormalFontWeight); - if (!login_error) + if (!s_settings_locals.achievements_login_error) { ImGui::TextWrapped( FSUI_CSTR("Please enter your user name and password for retroachievements.org below. Your password will " @@ -5358,46 +5363,49 @@ void FullscreenUI::DrawAchievementsLoginWindow() } else { - ImGui::TextWrapped("%s", login_error->c_str()); + ImGui::TextWrapped("%s", s_settings_locals.achievements_login_error->c_str()); } + ImGui::PopFont(); ImGui::PopStyleColor(); ImGui::ItemSize(ImVec2(0.0f, LayoutScale(LAYOUT_MENU_BUTTON_SPACING * 2.0f))); const bool is_logging_in = IsBackgroundProgressDialogOpen(LOGIN_PROGRESS_NAME); BeginMenuButtons(); - ResetFocusHere(); - - ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, LayoutScale(LAYOUT_WIDGET_FRAME_ROUNDING)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); const float item_width = LayoutScale(550.0f); + const ImGuiInputTextFlags extra_username_flags = + (ResetFocusHere() ? ImGuiInputTextFlags_AlwaysActivate : 0) | (is_logging_in ? ImGuiInputTextFlags_ReadOnly : 0); ImGui::SetCursorPosX((ImGui::GetWindowWidth() - item_width) * 0.5f); - ImGui::SetNextItemWidth(item_width); - ImGui::InputTextWithHint("##username", FSUI_CSTR("User Name"), username, sizeof(username), - is_logging_in ? ImGuiInputTextFlags_ReadOnly : 0); + InputTextWithIcon("##username", ICON_FA_ID_CARD, FSUI_CSTR("User Name"), + s_settings_locals.achievements_login_username, + sizeof(s_settings_locals.achievements_login_username), item_width, ImGui::GetFontSize(), + UIStyle.NormalFontWeight, extra_username_flags); ImGui::NextColumn(); ImGui::SetCursorPosX((ImGui::GetWindowWidth() - item_width) * 0.5f); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); - ImGui::SetNextItemWidth(item_width); - ImGui::InputTextWithHint("##password", FSUI_CSTR("Password"), password, sizeof(password), - is_logging_in ? (ImGuiInputTextFlags_ReadOnly | ImGuiInputTextFlags_Password) : - ImGuiInputTextFlags_Password); - - ImGui::PopStyleVar(2); + InputTextWithIcon( + "##password", ICON_FA_KEY, FSUI_CSTR("Password"), s_settings_locals.achievements_login_password, + sizeof(s_settings_locals.achievements_login_password), item_width, ImGui::GetFontSize(), UIStyle.NormalFontWeight, + is_logging_in ? (ImGuiInputTextFlags_ReadOnly | ImGuiInputTextFlags_Password) : ImGuiInputTextFlags_Password); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(15.0f)); - const bool login_enabled = (std::strlen(username) > 0 && std::strlen(password) > 0 && !is_logging_in); + const bool login_enabled = (std::strlen(s_settings_locals.achievements_login_username) > 0 && + std::strlen(s_settings_locals.achievements_login_password) > 0 && !is_logging_in); + + EndMenuButtons(); + BeginHorizontalMenuButtons(2); - if (MenuButtonWithoutSummary(FSUI_ICONVSTR(ICON_FA_KEY, "Login"), login_enabled, LAYOUT_CENTER_ALIGN_TEXT)) + if (HorizontalMenuButton(FSUI_ICONVSTR(ICON_FA_KEY, "Login"), login_enabled)) { OpenBackgroundProgressDialog(LOGIN_PROGRESS_NAME, FSUI_STR("Logging in to RetroAchievements..."), 0, 0, 0); - Host::RunOnCoreThread([username = std::string(username), password = std::string(password)]() { + Host::RunOnCoreThread([username = std::string(s_settings_locals.achievements_login_username), + password = std::string(s_settings_locals.achievements_login_password)]() { Error error; const bool result = Achievements::Login(username.c_str(), password.c_str(), &error); VideoThread::RunOnThread([result, error = std::move(error)]() { @@ -5409,17 +5417,17 @@ void FullscreenUI::DrawAchievementsLoginWindow() return; } - login_error = std::make_unique( + s_settings_locals.achievements_login_error = std::make_unique( fmt::format(FSUI_FSTR("Login Failed.\nError: {}\nPlease check your username and password, and try again."), error.GetDescription())); }); }); } - if (MenuButtonWithoutSummary(FSUI_ICONVSTR(ICON_FA_XMARK, "Cancel"), !is_logging_in, LAYOUT_CENTER_ALIGN_TEXT)) + if (HorizontalMenuButton(FSUI_ICONVSTR(ICON_FA_XMARK, "Cancel"), !is_logging_in)) CloseFixedPopupDialog(); - EndMenuButtons(); + EndHorizontalMenuButtons(); EndFixedPopupDialog(); }