mirror of
https://github.com/stenzek/duckstation.git
synced 2026-02-11 08:54:33 +00:00
FullscreenUI: Remove more redundancy
This commit is contained in:
@@ -97,6 +97,18 @@ inline bool ContainsNoCase(std::string_view s1, std::string_view s2)
|
||||
[](char lhs, char rhs) { return (ToLower(lhs) == ToLower(rhs)); }) != s1.end());
|
||||
}
|
||||
|
||||
/// Constexpr version of strcmp, suitable for use in static_assert.
|
||||
inline constexpr int ConstexprCompare(const char* s1, const char* s2)
|
||||
{
|
||||
const size_t len1 = std::char_traits<char>::length(s1);
|
||||
const size_t len2 = std::char_traits<char>::length(s2);
|
||||
const size_t clen = std::min(len1, len2);
|
||||
if (const int res = std::char_traits<char>::compare(s1, s2, clen); res != 0)
|
||||
return res;
|
||||
|
||||
return (len1 < len2) ? -1 : ((len1 > len2) ? 1 : 0);
|
||||
}
|
||||
|
||||
/// Wrapper around std::from_chars
|
||||
template<typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
|
||||
inline std::optional<T> FromChars(const std::string_view str, int base = 10)
|
||||
|
||||
@@ -1413,8 +1413,7 @@ void Achievements::DisplayAchievementSummary()
|
||||
if (!FullscreenUI::Initialize())
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification("AchievementsSummary", time, std::move(title), std::move(summary),
|
||||
std::move(icon));
|
||||
FullscreenUI::AddNotification("AchievementsSummary", time, std::move(title), std::move(summary), std::move(icon));
|
||||
});
|
||||
|
||||
if (s_state.game_summary.num_unsupported_achievements > 0)
|
||||
@@ -1424,11 +1423,11 @@ void Achievements::DisplayAchievementSummary()
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification("UnsupportedAchievements", ACHIEVEMENT_SUMMARY_UNSUPPORTED_TIME,
|
||||
TRANSLATE_STR("Achievements", "Unsupported Achievements"),
|
||||
TRANSLATE_PLURAL_STR("Achievements",
|
||||
"%n achievements are not supported by DuckStation.",
|
||||
"Achievement popup", num_unsupported),
|
||||
"images/warning.svg");
|
||||
TRANSLATE_STR("Achievements", "Unsupported Achievements"),
|
||||
TRANSLATE_PLURAL_STR("Achievements",
|
||||
"%n achievements are not supported by DuckStation.",
|
||||
"Achievement popup", num_unsupported),
|
||||
"images/warning.svg");
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1447,8 +1446,8 @@ void Achievements::DisplayHardcoreDeferredMessage()
|
||||
return;
|
||||
|
||||
FullscreenUI::ShowToast(std::string(),
|
||||
TRANSLATE_STR("Achievements", "Hardcore mode will be enabled on system reset."),
|
||||
Host::OSD_WARNING_DURATION);
|
||||
TRANSLATE_STR("Achievements", "Hardcore mode will be enabled on system reset."),
|
||||
Host::OSD_WARNING_DURATION);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1483,7 +1482,7 @@ void Achievements::HandleUnlockEvent(const rc_client_event_t* event)
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification(fmt::format("achievement_unlock_{}", id), static_cast<float>(duration),
|
||||
std::move(title), std::move(description), std::move(badge_path));
|
||||
std::move(title), std::move(description), std::move(badge_path));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1510,7 +1509,7 @@ void Achievements::HandleGameCompleteEvent(const rc_client_event_t* event)
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification("achievement_mastery", GAME_COMPLETE_NOTIFICATION_TIME, std::move(title),
|
||||
std::move(message), std::move(icon));
|
||||
std::move(message), std::move(icon));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1547,7 +1546,7 @@ void Achievements::HandleSubsetCompleteEvent(const rc_client_event_t* event)
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification("achievement_mastery", GAME_COMPLETE_NOTIFICATION_TIME, std::move(title),
|
||||
std::move(message), std::move(badge_path));
|
||||
std::move(message), std::move(badge_path));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1567,7 +1566,7 @@ void Achievements::HandleLeaderboardStartedEvent(const rc_client_event_t* event)
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification(fmt::format("leaderboard_{}", id), LEADERBOARD_STARTED_NOTIFICATION_TIME,
|
||||
std::move(title), std::move(message), std::move(icon));
|
||||
std::move(title), std::move(message), std::move(icon));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1587,7 +1586,7 @@ void Achievements::HandleLeaderboardFailedEvent(const rc_client_event_t* event)
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification(fmt::format("leaderboard_{}", id), LEADERBOARD_FAILED_NOTIFICATION_TIME,
|
||||
std::move(title), std::move(message), std::move(icon));
|
||||
std::move(title), std::move(message), std::move(icon));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1617,8 +1616,8 @@ void Achievements::HandleLeaderboardSubmittedEvent(const rc_client_event_t* even
|
||||
if (!FullscreenUI::Initialize())
|
||||
return;
|
||||
FullscreenUI::AddNotification(fmt::format("leaderboard_{}", id),
|
||||
static_cast<float>(g_settings.achievements_leaderboard_duration),
|
||||
std::move(title), std::move(message), std::move(icon));
|
||||
static_cast<float>(g_settings.achievements_leaderboard_duration), std::move(title),
|
||||
std::move(message), std::move(icon));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1654,8 +1653,8 @@ void Achievements::HandleLeaderboardScoreboardEvent(const rc_client_event_t* eve
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification(fmt::format("leaderboard_{}", id),
|
||||
static_cast<float>(g_settings.achievements_leaderboard_duration),
|
||||
std::move(title), std::move(message), std::move(icon));
|
||||
static_cast<float>(g_settings.achievements_leaderboard_duration), std::move(title),
|
||||
std::move(message), std::move(icon));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1739,7 +1738,7 @@ void Achievements::HandleAchievementChallengeIndicatorShowEvent(const rc_client_
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification(fmt::format("AchievementChallenge{}", id), CHALLENGE_STARTED_NOTIFICATION_TIME,
|
||||
std::move(title), std::move(description), std::move(badge_path));
|
||||
std::move(title), std::move(description), std::move(badge_path));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1777,7 +1776,7 @@ void Achievements::HandleAchievementChallengeIndicatorHideEvent(const rc_client_
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification(fmt::format("AchievementChallenge{}", id), CHALLENGE_FAILED_NOTIFICATION_TIME,
|
||||
std::move(title), std::move(description), std::move(badge_path));
|
||||
std::move(title), std::move(description), std::move(badge_path));
|
||||
});
|
||||
}
|
||||
if (g_settings.achievements_challenge_indicator_mode == AchievementChallengeIndicatorMode::Notification ||
|
||||
@@ -1872,8 +1871,8 @@ void Achievements::HandleServerReconnectedEvent(const rc_client_event_t* event)
|
||||
return;
|
||||
|
||||
FullscreenUI::ShowToast(TRANSLATE_STR("Achievements", "Achievements Reconnected"),
|
||||
TRANSLATE_STR("Achievements", "All pending unlock requests have completed."),
|
||||
Host::OSD_INFO_DURATION);
|
||||
TRANSLATE_STR("Achievements", "All pending unlock requests have completed."),
|
||||
Host::OSD_INFO_DURATION);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1911,9 +1910,9 @@ void Achievements::OnHardcoreModeChanged(bool enabled, bool display_message, boo
|
||||
return;
|
||||
|
||||
FullscreenUI::ShowToast(std::string(),
|
||||
enabled ? TRANSLATE_STR("Achievements", "Hardcore mode is now enabled.") :
|
||||
TRANSLATE_STR("Achievements", "Hardcore mode is now disabled."),
|
||||
Host::OSD_INFO_DURATION);
|
||||
enabled ? TRANSLATE_STR("Achievements", "Hardcore mode is now enabled.") :
|
||||
TRANSLATE_STR("Achievements", "Hardcore mode is now disabled."),
|
||||
Host::OSD_INFO_DURATION);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2207,8 +2206,8 @@ void Achievements::ClientLoginWithTokenCallback(int result, const char* error_me
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification("AchievementsLoginFailed", Host::OSD_ERROR_DURATION,
|
||||
TRANSLATE_STR("Achievements", "RetroAchievements Login Failed"),
|
||||
std::move(message), "images/warning.svg");
|
||||
TRANSLATE_STR("Achievements", "RetroAchievements Login Failed"),
|
||||
std::move(message), "images/warning.svg");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2257,7 +2256,7 @@ void Achievements::ShowLoginNotification()
|
||||
return;
|
||||
|
||||
FullscreenUI::AddNotification("achievements_login", LOGIN_NOTIFICATION_TIME, std::move(title),
|
||||
std::move(summary), std::move(badge_path));
|
||||
std::move(summary), std::move(badge_path));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -2930,9 +2929,9 @@ void Achievements::DrawAchievementsWindow()
|
||||
bool close_window = false;
|
||||
|
||||
if (FullscreenUI::BeginFullscreenWindow(ImVec2(), ImVec2(display_size.x, heading_height), "achievements_heading",
|
||||
heading_background, 0.0f, ImVec2(10.0f, 10.0f),
|
||||
ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration |
|
||||
ImGuiWindowFlags_NoScrollWithMouse))
|
||||
heading_background, 0.0f, ImVec2(10.0f, 10.0f),
|
||||
ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration |
|
||||
ImGuiWindowFlags_NoScrollWithMouse))
|
||||
{
|
||||
const ImVec2 pos = ImGui::GetCursorScreenPos() + ImGui::GetStyle().FramePadding;
|
||||
const float spacing = FullscreenUI::LayoutScale(FullscreenUI::LAYOUT_MENU_ITEM_TITLE_SUMMARY_SPACING);
|
||||
@@ -3007,10 +3006,10 @@ void Achievements::DrawAchievementsWindow()
|
||||
"Unsupported achievement count", s_state.game_summary.num_unsupported_achievements));
|
||||
|
||||
const ImRect unsupported_bb(ImVec2(left, top), ImVec2(right, top + UIStyle.MediumFontSize));
|
||||
RenderShadowedTextClipped(
|
||||
UIStyle.Font, UIStyle.MediumFontSize, UIStyle.BoldFontWeight, unsupported_bb.Min, unsupported_bb.Max,
|
||||
ImGui::GetColorU32(FullscreenUI::DarkerColor(ImGui::GetStyle().Colors[ImGuiCol_Text])), text, nullptr,
|
||||
ImVec2(0.0f, 0.0f), 0.0f, &unsupported_bb);
|
||||
RenderShadowedTextClipped(UIStyle.Font, UIStyle.MediumFontSize, UIStyle.BoldFontWeight, unsupported_bb.Min,
|
||||
unsupported_bb.Max,
|
||||
ImGui::GetColorU32(FullscreenUI::DarkerColor(ImGui::GetStyle().Colors[ImGuiCol_Text])),
|
||||
text, nullptr, ImVec2(0.0f, 0.0f), 0.0f, &unsupported_bb);
|
||||
|
||||
top += UIStyle.MediumFontSize + spacing;
|
||||
}
|
||||
@@ -3043,10 +3042,10 @@ void Achievements::DrawAchievementsWindow()
|
||||
}
|
||||
|
||||
const ImRect beaten_bb(ImVec2(left, top), ImVec2(right, top + UIStyle.MediumFontSize));
|
||||
RenderShadowedTextClipped(
|
||||
UIStyle.Font, UIStyle.MediumFontSize, UIStyle.BoldFontWeight, beaten_bb.Min, beaten_bb.Max,
|
||||
ImGui::GetColorU32(FullscreenUI::DarkerColor(ImGui::GetStyle().Colors[ImGuiCol_Text])), text, nullptr,
|
||||
ImVec2(0.0f, 0.0f), 0.0f, &beaten_bb);
|
||||
RenderShadowedTextClipped(UIStyle.Font, UIStyle.MediumFontSize, UIStyle.BoldFontWeight, beaten_bb.Min,
|
||||
beaten_bb.Max,
|
||||
ImGui::GetColorU32(FullscreenUI::DarkerColor(ImGui::GetStyle().Colors[ImGuiCol_Text])),
|
||||
text, nullptr, ImVec2(0.0f, 0.0f), 0.0f, &beaten_bb);
|
||||
|
||||
top += UIStyle.MediumFontSize + spacing;
|
||||
}
|
||||
@@ -3145,13 +3144,12 @@ void Achievements::DrawAchievementsWindow()
|
||||
});
|
||||
FullscreenUI::SetFullscreenFooterText(
|
||||
std::array{std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_XBOX_DPAD_UP_DOWN :
|
||||
ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN,
|
||||
ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN,
|
||||
TRANSLATE_SV("Achievements", "Change Selection")),
|
||||
std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_BUTTON_A : ICON_PF_ENTER,
|
||||
TRANSLATE_SV("Achievements", "View Details")),
|
||||
std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_BUTTON_B : ICON_PF_ESC,
|
||||
TRANSLATE_SV("Achievements", "Back"))},
|
||||
FullscreenUI::GetBackgroundAlpha());
|
||||
TRANSLATE_SV("Achievements", "Back"))});
|
||||
|
||||
if (close_window)
|
||||
FullscreenUI::ReturnToPreviousWindow();
|
||||
@@ -3194,7 +3192,7 @@ void Achievements::DrawAchievement(const rc_client_achievement_t* cheevo)
|
||||
ImRect bb;
|
||||
bool visible, hovered;
|
||||
const bool clicked = FullscreenUI::MenuButtonFrame(TinyString::from_format("chv_{}", cheevo->id), content_height,
|
||||
true, &bb, &visible, &hovered);
|
||||
true, &bb, &visible, &hovered);
|
||||
if (!visible)
|
||||
return;
|
||||
|
||||
@@ -3396,9 +3394,9 @@ void Achievements::DrawLeaderboardsWindow()
|
||||
const float column_spacing = spacing * 2.0f;
|
||||
|
||||
if (FullscreenUI::BeginFullscreenWindow(ImVec2(), ImVec2(display_size.x, heading_height), "leaderboards_heading",
|
||||
heading_background, 0.0f, ImVec2(10.0f, 10.0f),
|
||||
ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration |
|
||||
ImGuiWindowFlags_NoScrollWithMouse))
|
||||
heading_background, 0.0f, ImVec2(10.0f, 10.0f),
|
||||
ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration |
|
||||
ImGuiWindowFlags_NoScrollWithMouse))
|
||||
{
|
||||
const ImVec2 heading_pos = ImGui::GetCursorScreenPos() + ImGui::GetStyle().FramePadding;
|
||||
const float image_size = LayoutScale(85.0f);
|
||||
@@ -3615,13 +3613,12 @@ void Achievements::DrawLeaderboardsWindow()
|
||||
|
||||
FullscreenUI::SetFullscreenFooterText(
|
||||
std::array{std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_XBOX_DPAD_UP_DOWN :
|
||||
ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN,
|
||||
ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN,
|
||||
TRANSLATE_SV("Achievements", "Change Selection")),
|
||||
std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_BUTTON_A : ICON_PF_ENTER,
|
||||
TRANSLATE_SV("Achievements", "Open Leaderboard")),
|
||||
std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_BUTTON_B : ICON_PF_ESC,
|
||||
TRANSLATE_SV("Achievements", "Back"))},
|
||||
FullscreenUI::GetBackgroundAlpha());
|
||||
TRANSLATE_SV("Achievements", "Back"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3679,16 +3676,15 @@ void Achievements::DrawLeaderboardsWindow()
|
||||
|
||||
FullscreenUI::SetFullscreenFooterText(
|
||||
std::array{std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_XBOX_DPAD_LEFT_RIGHT :
|
||||
ICON_PF_ARROW_LEFT ICON_PF_ARROW_RIGHT,
|
||||
ICON_PF_ARROW_LEFT ICON_PF_ARROW_RIGHT,
|
||||
TRANSLATE_SV("Achievements", "Change Page")),
|
||||
std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_XBOX_DPAD_UP_DOWN :
|
||||
ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN,
|
||||
ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN,
|
||||
TRANSLATE_SV("Achievements", "Change Selection")),
|
||||
std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_BUTTON_A : ICON_PF_ENTER,
|
||||
TRANSLATE_SV("Achievements", "View Profile")),
|
||||
std::make_pair(FullscreenUI::IsGamepadInputSource() ? ICON_PF_BUTTON_B : ICON_PF_ESC,
|
||||
TRANSLATE_SV("Achievements", "Back"))},
|
||||
FullscreenUI::GetBackgroundAlpha());
|
||||
TRANSLATE_SV("Achievements", "Back"))});
|
||||
}
|
||||
|
||||
if (close_leaderboard_on_exit)
|
||||
@@ -4241,7 +4237,7 @@ void Achievements::RefreshAllProgressCallback(int result, const char* error_mess
|
||||
return;
|
||||
|
||||
FullscreenUI::ShowToast({}, TRANSLATE_STR("Achievements", "Updated achievement progress database."),
|
||||
Host::OSD_INFO_DURATION);
|
||||
Host::OSD_INFO_DURATION);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,7 +129,6 @@ static void ExitFullscreenAndOpenURL(std::string_view url);
|
||||
static void CopyTextToClipboard(std::string title, std::string_view text);
|
||||
static void DrawAboutWindow();
|
||||
static void FixStateIfPaused();
|
||||
static void GetStandardSelectionFooterText(SmallStringBase& dest, bool back_instead_of_cancel);
|
||||
static bool CompileTransitionPipelines();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@@ -353,26 +352,6 @@ static void SwitchToLeaderboards();
|
||||
// Constants
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static constexpr const std::array s_ps_button_mapping{
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_LEFT, ICON_PF_DPAD_LEFT),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_UP, ICON_PF_DPAD_UP),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_RIGHT, ICON_PF_DPAD_RIGHT),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_DOWN, ICON_PF_DPAD_DOWN),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_LEFT_RIGHT, ICON_PF_DPAD_LEFT_RIGHT),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_UP_DOWN, ICON_PF_DPAD_UP_DOWN),
|
||||
std::make_pair(ICON_PF_BUTTON_A, ICON_PF_BUTTON_CROSS),
|
||||
std::make_pair(ICON_PF_BUTTON_B, ICON_PF_BUTTON_CIRCLE),
|
||||
std::make_pair(ICON_PF_BUTTON_X, ICON_PF_BUTTON_SQUARE),
|
||||
std::make_pair(ICON_PF_BUTTON_Y, ICON_PF_BUTTON_TRIANGLE),
|
||||
std::make_pair(ICON_PF_SHARE_CAPTURE, ICON_PF_DUALSHOCK_SHARE),
|
||||
std::make_pair(ICON_PF_BURGER_MENU, ICON_PF_DUALSHOCK_OPTIONS),
|
||||
std::make_pair(ICON_PF_XBOX, ICON_PF_PLAYSTATION),
|
||||
std::make_pair(ICON_PF_LEFT_SHOULDER_LB, ICON_PF_LEFT_SHOULDER_L1),
|
||||
std::make_pair(ICON_PF_LEFT_TRIGGER_LT, ICON_PF_LEFT_TRIGGER_L2),
|
||||
std::make_pair(ICON_PF_RIGHT_SHOULDER_RB, ICON_PF_RIGHT_SHOULDER_R1),
|
||||
std::make_pair(ICON_PF_RIGHT_TRIGGER_RT, ICON_PF_RIGHT_TRIGGER_R2),
|
||||
};
|
||||
|
||||
static constexpr std::string_view RESUME_STATE_SELECTOR_DIALOG_NAME = "##resume_state_selector";
|
||||
static constexpr std::string_view ABOUT_DIALOG_NAME = "##about_duckstation";
|
||||
static constexpr std::string_view ACHIEVEMENTS_LOGIN_DIALOG_NAME = "##achievements_login";
|
||||
@@ -491,76 +470,6 @@ static WidgetsState s_state;
|
||||
|
||||
} // namespace FullscreenUI
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Utility
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void FullscreenUI::GetStandardSelectionFooterText(SmallStringBase& dest, bool back_instead_of_cancel)
|
||||
{
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
CreateFooterTextString(
|
||||
dest,
|
||||
std::array{std::make_pair(ICON_PF_XBOX_DPAD_UP_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, back_instead_of_cancel ? FSUI_VSTR("Back") : FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
CreateFooterTextString(
|
||||
dest, std::array{std::make_pair(ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_ESC, back_instead_of_cancel ? FSUI_VSTR("Back") : FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
}
|
||||
|
||||
void FullscreenUI::SetStandardSelectionFooterText(bool back_instead_of_cancel)
|
||||
{
|
||||
SmallString text;
|
||||
GetStandardSelectionFooterText(text, back_instead_of_cancel);
|
||||
SetFullscreenFooterText(text, GetBackgroundAlpha());
|
||||
}
|
||||
|
||||
void FullscreenUI::GetChoiceDialogHelpText(SmallStringBase& dest)
|
||||
{
|
||||
FullscreenUI::GetStandardSelectionFooterText(dest, false);
|
||||
}
|
||||
|
||||
void FullscreenUI::GetFileSelectorHelpText(SmallStringBase& dest)
|
||||
{
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
CreateFooterTextString(dest, std::array{std::make_pair(ICON_PF_XBOX_DPAD_UP_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_BUTTON_Y, FSUI_VSTR("Parent Directory")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
CreateFooterTextString(
|
||||
dest,
|
||||
std::array{std::make_pair(ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_BACKSPACE, FSUI_VSTR("Parent Directory")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")), std::make_pair(ICON_PF_ESC, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
}
|
||||
|
||||
void FullscreenUI::GetInputDialogHelpText(SmallStringBase& dest)
|
||||
{
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
CreateFooterTextString(dest, std::array{std::make_pair(ICON_PF_KEYBOARD, FSUI_VSTR("Enter Value")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
CreateFooterTextString(dest, std::array{std::make_pair(ICON_PF_KEYBOARD, FSUI_VSTR("Enter Value")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Main
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@@ -576,13 +485,6 @@ bool FullscreenUI::Initialize()
|
||||
|
||||
s_state.show_localized_titles = Host::GetBaseBoolSettingValue("Main", "FullscreenUIShowLocalizedTitles", true);
|
||||
|
||||
SetAnimations(Host::GetBaseBoolSettingValue("Main", "FullscreenUIAnimations", true));
|
||||
SetSmoothScrolling(Host::GetBaseBoolSettingValue("Main", "FullscreenUISmoothScrolling", true));
|
||||
SetMenuBorders(Host::GetBaseBoolSettingValue("Main", "FullscreenUIMenuBorders", false));
|
||||
|
||||
if (Host::GetBaseBoolSettingValue("Main", "FullscreenUIDisplayPSIcons", false))
|
||||
SetFullscreenFooterTextIconMapping(s_ps_button_mapping);
|
||||
|
||||
if (!InitializeWidgets() || !LoadResources())
|
||||
{
|
||||
DestroyResources();
|
||||
@@ -2094,18 +1996,15 @@ void FullscreenUI::DrawLandingWindow()
|
||||
std::make_pair(ICON_PF_BUTTON_X, FSUI_VSTR("Toggle Fullscreen")),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_LEFT_RIGHT, FSUI_VSTR("Navigate")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Exit"))},
|
||||
GetBackgroundAlpha());
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Exit"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFullscreenFooterText(std::array{std::make_pair(ICON_PF_F1, FSUI_VSTR("About")),
|
||||
std::make_pair(ICON_PF_F3, FSUI_VSTR("Resume Last Session")),
|
||||
std::make_pair(ICON_PF_F11, FSUI_VSTR("Toggle Fullscreen")),
|
||||
std::make_pair(ICON_PF_ARROW_LEFT ICON_PF_ARROW_RIGHT, FSUI_VSTR("Navigate")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Exit"))},
|
||||
GetBackgroundAlpha());
|
||||
SetFullscreenFooterText(std::array{
|
||||
std::make_pair(ICON_PF_F1, FSUI_VSTR("About")), std::make_pair(ICON_PF_F3, FSUI_VSTR("Resume Last Session")),
|
||||
std::make_pair(ICON_PF_F11, FSUI_VSTR("Toggle Fullscreen")),
|
||||
std::make_pair(ICON_PF_ARROW_LEFT ICON_PF_ARROW_RIGHT, FSUI_VSTR("Navigate")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")), std::make_pair(ICON_PF_ESC, FSUI_VSTR("Exit"))});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2160,16 +2059,14 @@ void FullscreenUI::DrawStartGameWindow()
|
||||
SetFullscreenFooterText(std::array{std::make_pair(ICON_PF_XBOX_DPAD_LEFT_RIGHT, FSUI_VSTR("Navigate")),
|
||||
std::make_pair(ICON_PF_BUTTON_Y, FSUI_VSTR("Load Global State")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Back"))},
|
||||
GetBackgroundAlpha());
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Back"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFullscreenFooterText(std::array{std::make_pair(ICON_PF_ARROW_LEFT ICON_PF_ARROW_RIGHT, FSUI_VSTR("Navigate")),
|
||||
std::make_pair(ICON_PF_F1, FSUI_VSTR("Load Global State")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Back"))},
|
||||
GetBackgroundAlpha());
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Back"))});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3912,16 +3809,14 @@ void FullscreenUI::DrawSettingsWindow()
|
||||
SetFullscreenFooterText(std::array{std::make_pair(ICON_PF_XBOX_DPAD_LEFT_RIGHT, FSUI_VSTR("Change Page")),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_UP_DOWN, FSUI_VSTR("Navigate")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Back"))},
|
||||
GetBackgroundAlpha());
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Back"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFullscreenFooterText(std::array{std::make_pair(ICON_PF_ARROW_LEFT ICON_PF_ARROW_RIGHT, FSUI_VSTR("Change Page")),
|
||||
std::make_pair(ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN, FSUI_VSTR("Navigate")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Back"))},
|
||||
GetBackgroundAlpha());
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Back"))});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4064,38 +3959,27 @@ void FullscreenUI::DrawInterfaceSettingsPage()
|
||||
FSUI_VSTR("When Big Picture mode is started, the game list will be displayed instead of the main menu."), "Main",
|
||||
"FullscreenUIOpenToGameList", false);
|
||||
|
||||
if (DrawToggleSetting(
|
||||
bsi, FSUI_ICONVSTR(ICON_PF_GAMEPAD, "Use DualShock/DualSense Button Icons"),
|
||||
FSUI_VSTR(
|
||||
"Displays DualShock/DualSense button icons in the footer and input binding, instead of Xbox buttons."),
|
||||
"Main", "FullscreenUIDisplayPSIcons", false))
|
||||
{
|
||||
if (bsi->GetBoolValue("Main", "FullscreenUIDisplayPSIcons", false))
|
||||
SetFullscreenFooterTextIconMapping(s_ps_button_mapping);
|
||||
else
|
||||
SetFullscreenFooterTextIconMapping({});
|
||||
}
|
||||
bool widgets_settings_changed = DrawToggleSetting(
|
||||
bsi, FSUI_ICONVSTR(ICON_PF_GAMEPAD, "Use DualShock/DualSense Button Icons"),
|
||||
FSUI_VSTR("Displays DualShock/DualSense button icons in the footer and input binding, instead of Xbox buttons."),
|
||||
"Main", "FullscreenUIDisplayPSIcons", false);
|
||||
|
||||
if (DrawToggleSetting(bsi, FSUI_ICONVSTR(ICON_FA_WINDOW_RESTORE, "Window Animations"),
|
||||
FSUI_VSTR("Animates windows opening/closing and changes between views in the Big Picture UI."),
|
||||
"Main", "FullscreenUIAnimations", true))
|
||||
{
|
||||
SetAnimations(bsi->GetBoolValue("Main", "FullscreenUIAnimations", true));
|
||||
}
|
||||
widgets_settings_changed |=
|
||||
DrawToggleSetting(bsi, FSUI_ICONVSTR(ICON_FA_WINDOW_RESTORE, "Window Animations"),
|
||||
FSUI_VSTR("Animates windows opening/closing and changes between views in the Big Picture UI."),
|
||||
"Main", "FullscreenUIAnimations", true);
|
||||
|
||||
if (DrawToggleSetting(bsi, FSUI_ICONVSTR(ICON_FA_LIST, "Smooth Scrolling"),
|
||||
FSUI_VSTR("Enables smooth scrolling of menus in the Big Picture UI."), "Main",
|
||||
"FullscreenUISmoothScrolling", true))
|
||||
{
|
||||
SetSmoothScrolling(bsi->GetBoolValue("Main", "FullscreenUISmoothScrolling", true));
|
||||
}
|
||||
widgets_settings_changed |= DrawToggleSetting(bsi, FSUI_ICONVSTR(ICON_FA_LIST, "Smooth Scrolling"),
|
||||
FSUI_VSTR("Enables smooth scrolling of menus in the Big Picture UI."),
|
||||
"Main", "FullscreenUISmoothScrolling", true);
|
||||
widgets_settings_changed |=
|
||||
DrawToggleSetting(bsi, FSUI_ICONVSTR(ICON_FA_BORDER_ALL, "Menu Borders"),
|
||||
FSUI_VSTR("Draws a border around the currently-selected item for readability."), "Main",
|
||||
"FullscreenUIMenuBorders", false);
|
||||
|
||||
if (DrawToggleSetting(bsi, FSUI_ICONVSTR(ICON_FA_BORDER_ALL, "Menu Borders"),
|
||||
FSUI_VSTR("Draws a border around the currently-selected item for readability."), "Main",
|
||||
"FullscreenUIMenuBorders", false))
|
||||
{
|
||||
SetMenuBorders(bsi->GetBoolValue("Main", "FullscreenUIMenuBorders", false));
|
||||
}
|
||||
// use transition to work around double lock
|
||||
if (widgets_settings_changed)
|
||||
BeginTransition(0.0f, &FullscreenUI::UpdateWidgetsSettings);
|
||||
|
||||
MenuHeading(FSUI_VSTR("Behavior"));
|
||||
|
||||
@@ -7150,16 +7034,13 @@ void FullscreenUI::DrawPauseMenu()
|
||||
{
|
||||
SetFullscreenFooterText(std::array{std::make_pair(ICON_PF_XBOX_DPAD_UP_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Return To Game"))},
|
||||
GetBackgroundAlpha());
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Return To Game"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFullscreenFooterText(
|
||||
std::array{std::make_pair(ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Return To Game"))},
|
||||
GetBackgroundAlpha());
|
||||
SetFullscreenFooterText(std::array{
|
||||
std::make_pair(ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")), std::make_pair(ICON_PF_ESC, FSUI_VSTR("Return To Game"))});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7571,8 +7452,7 @@ void FullscreenUI::DrawSaveStateSelector()
|
||||
std::make_pair(ICON_PF_BUTTON_Y, FSUI_VSTR("Delete State")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, s_state.save_state_selector_loading ? FSUI_VSTR("Load State") :
|
||||
FSUI_VSTR("Save State")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Cancel"))},
|
||||
GetBackgroundAlpha());
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -7582,8 +7462,7 @@ void FullscreenUI::DrawSaveStateSelector()
|
||||
std::make_pair(ICON_PF_F1, FSUI_VSTR("Delete State")),
|
||||
std::make_pair(ICON_PF_ENTER, s_state.save_state_selector_loading ? FSUI_VSTR("Load State") :
|
||||
FSUI_VSTR("Save State")),
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Cancel"))},
|
||||
GetBackgroundAlpha());
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
|
||||
if (pressed_entry)
|
||||
@@ -7900,23 +7779,20 @@ void FullscreenUI::DrawGameListWindow()
|
||||
std::make_pair(ICON_PF_BUTTON_X, FSUI_VSTR("Change View")),
|
||||
std::make_pair(ICON_PF_BUTTON_Y, FSUI_VSTR("Launch Options")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Start Game")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Back"))},
|
||||
GetBackgroundAlpha());
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Back"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFullscreenFooterText(
|
||||
std::array{
|
||||
std::make_pair(ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN ICON_PF_ARROW_LEFT ICON_PF_ARROW_RIGHT,
|
||||
FSUI_VSTR("Select Game")),
|
||||
std::make_pair(ICON_PF_F3, FSUI_VSTR("Resume Last Session")),
|
||||
std::make_pair(ICON_PF_F2, FSUI_VSTR("Settings")),
|
||||
std::make_pair(ICON_PF_F4, FSUI_VSTR("Change View")),
|
||||
std::make_pair(ICON_PF_F1, FSUI_VSTR("Launch Options")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Start Game")),
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Back")),
|
||||
},
|
||||
GetBackgroundAlpha());
|
||||
SetFullscreenFooterText(std::array{
|
||||
std::make_pair(ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN ICON_PF_ARROW_LEFT ICON_PF_ARROW_RIGHT,
|
||||
FSUI_VSTR("Select Game")),
|
||||
std::make_pair(ICON_PF_F3, FSUI_VSTR("Resume Last Session")),
|
||||
std::make_pair(ICON_PF_F2, FSUI_VSTR("Settings")),
|
||||
std::make_pair(ICON_PF_F4, FSUI_VSTR("Change View")),
|
||||
std::make_pair(ICON_PF_F1, FSUI_VSTR("Launch Options")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Start Game")),
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Back")),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -75,7 +75,6 @@ void OpenDiscChangeMenu();
|
||||
void OpenAchievementsWindow();
|
||||
void OpenLeaderboardsWindow();
|
||||
void ReturnToPreviousWindow();
|
||||
void SetStandardSelectionFooterText(bool back_instead_of_cancel);
|
||||
|
||||
class BackgroundProgressCallback final : public ProgressCallback
|
||||
{
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include "IconsEmoji.h"
|
||||
#include "IconsFontAwesome6.h"
|
||||
#include "IconsPromptFont.h"
|
||||
#include "imgui_internal.h"
|
||||
#include "imgui_stdlib.h"
|
||||
|
||||
@@ -50,6 +51,21 @@ static constexpr float MENU_ITEM_BORDER_ROUNDING = 10.0f;
|
||||
static constexpr float SMOOTH_SCROLLING_SPEED = 3.5f;
|
||||
static constexpr u32 LOADING_PROGRESS_SAMPLE_COUNT = 30;
|
||||
|
||||
static std::optional<Image> LoadTextureImage(std::string_view path, u32 svg_width, u32 svg_height);
|
||||
static std::shared_ptr<GPUTexture> UploadTexture(std::string_view path, const Image& image);
|
||||
|
||||
static void CreateFooterTextString(SmallStringBase& dest,
|
||||
std::span<const std::pair<const char*, std::string_view>> items);
|
||||
|
||||
static void DrawBackgroundProgressDialogs(ImVec2& position, float spacing);
|
||||
static void UpdateLoadingScreenProgress(s32 progress_min, s32 progress_max, s32 progress_value);
|
||||
static bool GetLoadingScreenTimeEstimate(SmallString& out_str);
|
||||
static void DrawLoadingScreen(std::string_view image, std::string_view title, std::string_view caption,
|
||||
s32 progress_min, s32 progress_max, s32 progress_value, bool is_persistent);
|
||||
static void DrawNotifications(ImVec2& position, float spacing);
|
||||
static void DrawToast();
|
||||
static ImGuiID GetBackgroundProgressID(std::string_view str_id);
|
||||
|
||||
static constexpr std::array s_theme_display_names = {
|
||||
FSUI_NSTR("Automatic"), FSUI_NSTR("Dark"), FSUI_NSTR("Light"), FSUI_NSTR("AMOLED"),
|
||||
FSUI_NSTR("Cobalt Sky"), FSUI_NSTR("Grey Matter"), FSUI_NSTR("Green Giant"), FSUI_NSTR("Pinky Pals"),
|
||||
@@ -60,17 +76,36 @@ static constexpr std::array s_theme_names = {
|
||||
"", "Dark", "Light", "AMOLED", "CobaltSky", "GreyMatter", "GreenGiant", "PinkyPals", "DarkRuby", "PurpleRain",
|
||||
};
|
||||
|
||||
static std::optional<Image> LoadTextureImage(std::string_view path, u32 svg_width, u32 svg_height);
|
||||
static std::shared_ptr<GPUTexture> UploadTexture(std::string_view path, const Image& image);
|
||||
static constexpr const std::array s_ps_button_mapping{
|
||||
std::make_pair(ICON_PF_LEFT_TRIGGER_LT, ICON_PF_LEFT_TRIGGER_L2),
|
||||
std::make_pair(ICON_PF_RIGHT_TRIGGER_RT, ICON_PF_RIGHT_TRIGGER_R2),
|
||||
std::make_pair(ICON_PF_LEFT_SHOULDER_LB, ICON_PF_LEFT_SHOULDER_L1),
|
||||
std::make_pair(ICON_PF_RIGHT_SHOULDER_RB, ICON_PF_RIGHT_SHOULDER_R1),
|
||||
std::make_pair(ICON_PF_BUTTON_X, ICON_PF_BUTTON_SQUARE),
|
||||
std::make_pair(ICON_PF_BUTTON_Y, ICON_PF_BUTTON_TRIANGLE),
|
||||
std::make_pair(ICON_PF_BUTTON_B, ICON_PF_BUTTON_CIRCLE),
|
||||
std::make_pair(ICON_PF_BUTTON_A, ICON_PF_BUTTON_CROSS),
|
||||
std::make_pair(ICON_PF_SHARE_CAPTURE, ICON_PF_DUALSHOCK_SHARE),
|
||||
std::make_pair(ICON_PF_BURGER_MENU, ICON_PF_DUALSHOCK_OPTIONS),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_LEFT, ICON_PF_DPAD_LEFT),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_UP, ICON_PF_DPAD_UP),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_RIGHT, ICON_PF_DPAD_RIGHT),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_DOWN, ICON_PF_DPAD_DOWN),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_LEFT_RIGHT, ICON_PF_DPAD_LEFT_RIGHT),
|
||||
std::make_pair(ICON_PF_XBOX_DPAD_UP_DOWN, ICON_PF_DPAD_UP_DOWN),
|
||||
std::make_pair(ICON_PF_XBOX, ICON_PF_PLAYSTATION),
|
||||
};
|
||||
static_assert(
|
||||
[]() {
|
||||
for (size_t i = 1; i < s_ps_button_mapping.size(); i++)
|
||||
{
|
||||
if (StringUtil::ConstexprCompare(s_ps_button_mapping[i - 1].first, s_ps_button_mapping[i].first) >= 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
static void DrawBackgroundProgressDialogs(ImVec2& position, float spacing);
|
||||
static void UpdateLoadingScreenProgress(s32 progress_min, s32 progress_max, s32 progress_value);
|
||||
static bool GetLoadingScreenTimeEstimate(SmallString& out_str);
|
||||
static void DrawLoadingScreen(std::string_view image, std::string_view title, std::string_view caption,
|
||||
s32 progress_min, s32 progress_max, s32 progress_value, bool is_persistent);
|
||||
static void DrawNotifications(ImVec2& position, float spacing);
|
||||
static void DrawToast();
|
||||
static ImGuiID GetBackgroundProgressID(std::string_view str_id);
|
||||
return true;
|
||||
}(),
|
||||
"PS button mapping is not sorted");
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -259,7 +294,6 @@ struct ALIGN_TO_CACHE_LINE WidgetsState
|
||||
CloseButtonState close_button_state = CloseButtonState::None;
|
||||
ImGuiDir has_pending_nav_move = ImGuiDir_None;
|
||||
FocusResetType focus_reset_queued = FocusResetType::None;
|
||||
bool initialized = false;
|
||||
|
||||
u32 menu_button_index = 0;
|
||||
ImVec2 horizontal_menu_button_size = {};
|
||||
@@ -272,9 +306,8 @@ struct ALIGN_TO_CACHE_LINE WidgetsState
|
||||
SmallString last_fullscreen_footer_text;
|
||||
SmallString left_fullscreen_footer_text;
|
||||
SmallString last_left_fullscreen_footer_text;
|
||||
std::vector<std::pair<std::string_view, std::string_view>> fullscreen_footer_icon_mapping;
|
||||
std::span<const std::pair<const char*, const char*>> fullscreen_footer_icon_mapping;
|
||||
float fullscreen_text_change_time;
|
||||
float fullscreen_text_alpha;
|
||||
|
||||
ImGuiID enum_choice_button_id = 0;
|
||||
s32 enum_choice_button_value = 0;
|
||||
@@ -338,15 +371,15 @@ bool FullscreenUI::InitializeWidgets()
|
||||
if (!s_state.placeholder_texture)
|
||||
return false;
|
||||
|
||||
s_state.initialized = true;
|
||||
UpdateWidgetsSettings();
|
||||
ResetMenuButtonFrame();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void FullscreenUI::ShutdownWidgets(bool clear_state)
|
||||
{
|
||||
std::unique_lock lock(s_state.shared_state_mutex);
|
||||
s_state.initialized = false;
|
||||
s_state.texture_upload_queue.clear();
|
||||
s_state.placeholder_texture.reset();
|
||||
UIStyle.Font = nullptr;
|
||||
@@ -370,19 +403,15 @@ void FullscreenUI::ShutdownWidgets(bool clear_state)
|
||||
}
|
||||
}
|
||||
|
||||
void FullscreenUI::SetAnimations(bool enabled)
|
||||
void FullscreenUI::UpdateWidgetsSettings()
|
||||
{
|
||||
UIStyle.Animations = enabled;
|
||||
}
|
||||
UIStyle.Animations = Host::GetBaseBoolSettingValue("Main", "FullscreenUIAnimations", true);
|
||||
UIStyle.SmoothScrolling = Host::GetBaseBoolSettingValue("Main", "FullscreenUISmoothScrolling", true);
|
||||
UIStyle.MenuBorders = Host::GetBaseBoolSettingValue("Main", "FullscreenUIMenuBorders", false);
|
||||
|
||||
void FullscreenUI::SetSmoothScrolling(bool enabled)
|
||||
{
|
||||
UIStyle.SmoothScrolling = enabled;
|
||||
}
|
||||
|
||||
void FullscreenUI::SetMenuBorders(bool enabled)
|
||||
{
|
||||
UIStyle.MenuBorders = enabled;
|
||||
s_state.fullscreen_footer_icon_mapping = Host::GetBaseBoolSettingValue("Main", "FullscreenUIDisplayPSIcons", false) ?
|
||||
s_ps_button_mapping :
|
||||
std::span<const std::pair<const char*, const char*>>{};
|
||||
}
|
||||
|
||||
const std::shared_ptr<GPUTexture>& FullscreenUI::GetPlaceholderTexture()
|
||||
@@ -553,8 +582,7 @@ GPUTexture* FullscreenUI::GetCachedTextureAsync(std::string_view name)
|
||||
return;
|
||||
|
||||
std::unique_lock lock(s_state.shared_state_mutex);
|
||||
if (s_state.initialized)
|
||||
s_state.texture_upload_queue.emplace_back(std::move(path), std::move(image.value()));
|
||||
s_state.texture_upload_queue.emplace_back(std::move(path), std::move(image.value()));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -586,8 +614,7 @@ GPUTexture* FullscreenUI::GetCachedTextureAsync(std::string_view name, u32 svg_w
|
||||
return;
|
||||
|
||||
std::unique_lock lock(s_state.shared_state_mutex);
|
||||
if (s_state.initialized)
|
||||
s_state.texture_upload_queue.emplace_back(std::move(wh_name), std::move(image.value()));
|
||||
s_state.texture_upload_queue.emplace_back(std::move(wh_name), std::move(image.value()));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -851,9 +878,6 @@ void FullscreenUI::EndFixedPopupDialog()
|
||||
|
||||
void FullscreenUI::RenderOverlays()
|
||||
{
|
||||
if (!s_state.initialized)
|
||||
return;
|
||||
|
||||
const float margin = std::max(ImGuiManager::GetScreenMargin(), LayoutScale(10.0f));
|
||||
const float spacing = LayoutScale(10.0f);
|
||||
const float notification_vertical_pos = GetNotificationVerticalPosition();
|
||||
@@ -1181,17 +1205,14 @@ void FullscreenUI::CreateFooterTextString(SmallStringBase& dest,
|
||||
}
|
||||
}
|
||||
|
||||
void FullscreenUI::SetFullscreenFooterText(std::string_view text, float background_alpha)
|
||||
void FullscreenUI::SetFullscreenFooterText(std::string_view text)
|
||||
{
|
||||
s_state.fullscreen_footer_text.assign(text);
|
||||
s_state.fullscreen_text_alpha = background_alpha;
|
||||
}
|
||||
|
||||
void FullscreenUI::SetFullscreenFooterText(std::span<const std::pair<const char*, std::string_view>> items,
|
||||
float background_alpha)
|
||||
void FullscreenUI::SetFullscreenFooterText(std::span<const std::pair<const char*, std::string_view>> items)
|
||||
{
|
||||
CreateFooterTextString(s_state.fullscreen_footer_text, items);
|
||||
s_state.fullscreen_text_alpha = background_alpha;
|
||||
}
|
||||
|
||||
void FullscreenUI::SetFullscreenStatusText(std::string_view text)
|
||||
@@ -1204,19 +1225,22 @@ void FullscreenUI::SetFullscreenStatusText(std::span<const std::pair<const char*
|
||||
CreateFooterTextString(s_state.left_fullscreen_footer_text, items);
|
||||
}
|
||||
|
||||
void FullscreenUI::SetFullscreenFooterTextIconMapping(std::span<const std::pair<const char*, const char*>> mapping)
|
||||
void FullscreenUI::SetStandardSelectionFooterText(bool back_instead_of_cancel)
|
||||
{
|
||||
if (mapping.empty())
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
s_state.fullscreen_footer_icon_mapping = {};
|
||||
return;
|
||||
SetFullscreenFooterText(
|
||||
std::array{std::make_pair(ICON_PF_XBOX_DPAD_UP_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, back_instead_of_cancel ? FSUI_VSTR("Back") : FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFullscreenFooterText(
|
||||
std::array{std::make_pair(ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_ESC, back_instead_of_cancel ? FSUI_VSTR("Back") : FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
|
||||
s_state.fullscreen_footer_icon_mapping.reserve(mapping.size());
|
||||
for (const auto& [icon, mapped_icon] : mapping)
|
||||
s_state.fullscreen_footer_icon_mapping.emplace_back(icon, mapped_icon);
|
||||
std::sort(s_state.fullscreen_footer_icon_mapping.begin(), s_state.fullscreen_footer_icon_mapping.end(),
|
||||
[](const auto& lhs, const auto& rhs) { return (lhs.first < rhs.first); });
|
||||
}
|
||||
|
||||
void FullscreenUI::DrawFullscreenFooter()
|
||||
@@ -1235,10 +1259,11 @@ void FullscreenUI::DrawFullscreenFooter()
|
||||
const float height = LayoutScale(LAYOUT_FOOTER_HEIGHT);
|
||||
const ImVec2 shadow_offset = LayoutScale(LAYOUT_SHADOW_OFFSET, LAYOUT_SHADOW_OFFSET);
|
||||
const u32 text_color = ImGui::GetColorU32(UIStyle.PrimaryTextColor);
|
||||
const float bg_alpha = GetBackgroundAlpha();
|
||||
|
||||
ImDrawList* dl = ImGui::GetForegroundDrawList();
|
||||
dl->AddRectFilled(ImVec2(0.0f, io.DisplaySize.y - height), io.DisplaySize,
|
||||
ImGui::GetColorU32(ModAlpha(UIStyle.PrimaryColor, s_state.fullscreen_text_alpha)), 0.0f);
|
||||
ImGui::GetColorU32(ModAlpha(UIStyle.PrimaryColor, bg_alpha)), 0.0f);
|
||||
|
||||
ImFont* const font = UIStyle.Font;
|
||||
const float font_size = UIStyle.MediumFontSize;
|
||||
@@ -1312,9 +1337,6 @@ void FullscreenUI::DrawFullscreenFooter()
|
||||
IMSTR_START_END(s_state.left_fullscreen_footer_text));
|
||||
}
|
||||
}
|
||||
|
||||
// for next frame
|
||||
s_state.fullscreen_text_alpha = 1.0f;
|
||||
}
|
||||
|
||||
void FullscreenUI::PrerenderMenuButtonBorder()
|
||||
@@ -3167,7 +3189,20 @@ void FullscreenUI::FileSelectorDialog::Draw()
|
||||
|
||||
EndMenuButtons();
|
||||
|
||||
GetFileSelectorHelpText(s_state.fullscreen_footer_text);
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
SetFullscreenFooterText(std::array{std::make_pair(ICON_PF_XBOX_DPAD_UP_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_BUTTON_Y, FSUI_VSTR("Parent Directory")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFullscreenFooterText(
|
||||
std::array{std::make_pair(ICON_PF_ARROW_UP ICON_PF_ARROW_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_BACKSPACE, FSUI_VSTR("Parent Directory")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")), std::make_pair(ICON_PF_ESC, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
|
||||
EndRender();
|
||||
|
||||
@@ -3342,7 +3377,7 @@ void FullscreenUI::ChoiceDialog::Draw()
|
||||
EndMenuButtons();
|
||||
}
|
||||
|
||||
GetChoiceDialogHelpText(s_state.fullscreen_footer_text);
|
||||
SetStandardSelectionFooterText(false);
|
||||
|
||||
EndRender();
|
||||
|
||||
@@ -3468,7 +3503,18 @@ void FullscreenUI::InputStringDialog::Draw()
|
||||
|
||||
EndMenuButtons();
|
||||
|
||||
GetInputDialogHelpText(s_state.fullscreen_footer_text);
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
SetFullscreenFooterText(std::array{std::make_pair(ICON_PF_KEYBOARD, FSUI_VSTR("Enter Value")),
|
||||
std::make_pair(ICON_PF_BUTTON_A, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_BUTTON_B, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFullscreenFooterText(std::array{std::make_pair(ICON_PF_KEYBOARD, FSUI_VSTR("Enter Value")),
|
||||
std::make_pair(ICON_PF_ENTER, FSUI_VSTR("Select")),
|
||||
std::make_pair(ICON_PF_ESC, FSUI_VSTR("Cancel"))});
|
||||
}
|
||||
|
||||
EndRender();
|
||||
}
|
||||
@@ -3534,7 +3580,7 @@ void FullscreenUI::MessageDialog::Draw()
|
||||
|
||||
EndMenuButtons();
|
||||
|
||||
GetChoiceDialogHelpText(s_state.fullscreen_footer_text);
|
||||
SetStandardSelectionFooterText(false);
|
||||
|
||||
EndRender();
|
||||
|
||||
|
||||
@@ -212,14 +212,14 @@ bool InitializeWidgets();
|
||||
/// Shuts down, clearing all state.
|
||||
void ShutdownWidgets(bool clear_state);
|
||||
|
||||
/// Loads settings from the settings interface.
|
||||
void UpdateWidgetsSettings();
|
||||
|
||||
std::span<const char* const> GetThemeNames();
|
||||
std::span<const char* const> GetThemeDisplayNames();
|
||||
std::vector<std::string_view> GetLocalizedThemeDisplayNames();
|
||||
void UpdateTheme();
|
||||
|
||||
void SetAnimations(bool enabled);
|
||||
void SetSmoothScrolling(bool enabled);
|
||||
void SetMenuBorders(bool enabled);
|
||||
void SetFont(ImFont* ui_font);
|
||||
bool UpdateLayoutScale();
|
||||
|
||||
@@ -297,10 +297,9 @@ void SetWindowNavWrapping(bool allow_wrap_x = false, bool allow_wrap_y = true);
|
||||
|
||||
bool IsGamepadInputSource();
|
||||
std::string_view GetControllerIconMapping(std::string_view icon);
|
||||
void CreateFooterTextString(SmallStringBase& dest, std::span<const std::pair<const char*, std::string_view>> items);
|
||||
void SetFullscreenFooterText(std::string_view text, float background_alpha);
|
||||
void SetFullscreenFooterText(std::span<const std::pair<const char*, std::string_view>> items, float background_alpha);
|
||||
void SetFullscreenFooterTextIconMapping(std::span<const std::pair<const char*, const char*>> mapping);
|
||||
void SetFullscreenFooterText(std::string_view text);
|
||||
void SetFullscreenFooterText(std::span<const std::pair<const char*, std::string_view>> items);
|
||||
void SetStandardSelectionFooterText(bool back_instead_of_cancel);
|
||||
void SetFullscreenStatusText(std::string_view text);
|
||||
void SetFullscreenStatusText(std::span<const std::pair<const char*, std::string_view>> items);
|
||||
void DrawFullscreenFooter();
|
||||
@@ -474,11 +473,6 @@ void ShowToast(std::string title, std::string message, float duration = 10.0f);
|
||||
bool HasToast();
|
||||
void ClearToast();
|
||||
|
||||
// Message callbacks.
|
||||
void GetChoiceDialogHelpText(SmallStringBase& dest);
|
||||
void GetFileSelectorHelpText(SmallStringBase& dest);
|
||||
void GetInputDialogHelpText(SmallStringBase& dest);
|
||||
|
||||
// Wrapper for an animated popup dialog.
|
||||
class PopupDialog
|
||||
{
|
||||
|
||||
@@ -1087,7 +1087,8 @@ bool GPUPresenter::PresentFrame(GPUPresenter* presenter, GPUBackend* backend, bo
|
||||
|
||||
ImGuiManager::RenderOSDMessages();
|
||||
|
||||
FullscreenUI::RenderOverlays();
|
||||
if (FullscreenUI::IsInitialized())
|
||||
FullscreenUI::RenderOverlays();
|
||||
|
||||
if (backend && !GPUThread::IsSystemPaused())
|
||||
ImGuiManager::RenderSoftwareCursors();
|
||||
|
||||
Reference in New Issue
Block a user