FullscreenUI: Use InputTextWithIcon() for achievements login

pull/3754/head
Stenzek 3 months ago
parent b3e8543ba5
commit 632aab3a0f
No known key found for this signature in database

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

Loading…
Cancel
Save