FullscreenUI: Add status text (left side of footer)

This commit is contained in:
Stenzek 2025-03-15 15:58:22 +10:00
parent 4f00a7c7c1
commit 61de096d26
No known key found for this signature in database
2 changed files with 65 additions and 20 deletions

View File

@ -133,6 +133,8 @@ struct ALIGN_TO_CACHE_LINE UIState
SmallString fullscreen_footer_text;
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;
float fullscreen_text_change_time;
float fullscreen_text_alpha;
@ -242,6 +244,8 @@ void ImGuiFullscreen::Shutdown(bool clear_state)
s_state.background_progress_dialogs.clear();
s_state.fullscreen_footer_text.clear();
s_state.last_fullscreen_footer_text.clear();
s_state.left_fullscreen_footer_text.clear();
s_state.last_left_fullscreen_footer_text.clear();
s_state.fullscreen_text_change_time = 0.0f;
CloseInputDialog();
CloseMessageDialog();
@ -646,6 +650,7 @@ void ImGuiFullscreen::EndLayout()
PopResetLayout();
s_state.left_fullscreen_footer_text.clear();
s_state.fullscreen_footer_text.clear();
s_state.rendered_menu_item_border = false;
@ -1018,6 +1023,16 @@ void ImGuiFullscreen::SetFullscreenFooterText(std::span<const std::pair<const ch
s_state.fullscreen_text_alpha = background_alpha;
}
void ImGuiFullscreen::SetFullscreenStatusText(std::string_view text)
{
s_state.left_fullscreen_footer_text = text;
}
void ImGuiFullscreen::SetFullscreenStatusText(std::span<const std::pair<const char*, std::string_view>> items)
{
CreateFooterTextString(s_state.left_fullscreen_footer_text, items);
}
void ImGuiFullscreen::SetFullscreenFooterTextIconMapping(std::span<const std::pair<const char*, const char*>> mapping)
{
if (mapping.empty())
@ -1036,9 +1051,10 @@ void ImGuiFullscreen::SetFullscreenFooterTextIconMapping(std::span<const std::pa
void ImGuiFullscreen::DrawFullscreenFooter()
{
const ImGuiIO& io = ImGui::GetIO();
if (s_state.fullscreen_footer_text.empty())
if (s_state.fullscreen_footer_text.empty() && s_state.left_fullscreen_footer_text.empty())
{
s_state.last_fullscreen_footer_text.clear();
s_state.last_left_fullscreen_footer_text.clear();
return;
}
@ -1070,6 +1086,8 @@ void ImGuiFullscreen::DrawFullscreenFooter()
prev_opacity = s_state.fullscreen_text_change_time * (1.0f / TRANSITION_TIME);
if (prev_opacity > 0.0f)
{
if (!s_state.last_fullscreen_footer_text.empty())
{
const ImVec2 text_size =
font->CalcTextSizeA(font->FontSize, max_width, 0.0f, s_state.last_fullscreen_footer_text.c_str(),
@ -1081,6 +1099,18 @@ void ImGuiFullscreen::DrawFullscreenFooter()
dl->AddText(font, font->FontSize, text_pos, ModAlpha(text_color, prev_opacity),
s_state.last_fullscreen_footer_text.c_str(), s_state.last_fullscreen_footer_text.end_ptr());
}
if (!s_state.last_left_fullscreen_footer_text.empty())
{
const ImVec2 text_pos = ImVec2(padding, io.DisplaySize.y - font->FontSize - padding);
dl->AddText(font, font->FontSize, text_pos + shadow_offset, MulAlpha(UIStyle.ShadowColor, prev_opacity),
s_state.last_left_fullscreen_footer_text.c_str(),
s_state.last_left_fullscreen_footer_text.end_ptr());
dl->AddText(font, font->FontSize, text_pos, ModAlpha(text_color, prev_opacity),
s_state.last_left_fullscreen_footer_text.c_str(),
s_state.last_left_fullscreen_footer_text.end_ptr());
}
}
}
else if (s_state.last_fullscreen_footer_text.empty())
{
@ -1088,6 +1118,8 @@ void ImGuiFullscreen::DrawFullscreenFooter()
}
if (prev_opacity < 1.0f)
{
if (!s_state.fullscreen_footer_text.empty())
{
const ImVec2 text_size =
font->CalcTextSizeA(font->FontSize, max_width, 0.0f, s_state.fullscreen_footer_text.c_str(),
@ -1101,6 +1133,17 @@ void ImGuiFullscreen::DrawFullscreenFooter()
s_state.fullscreen_footer_text.end_ptr());
}
if (!s_state.left_fullscreen_footer_text.empty())
{
const ImVec2 text_pos = ImVec2(padding, io.DisplaySize.y - font->FontSize - padding);
const float opacity = 1.0f - prev_opacity;
dl->AddText(font, font->FontSize, text_pos + shadow_offset, MulAlpha(UIStyle.ShadowColor, opacity),
s_state.left_fullscreen_footer_text.c_str(), s_state.left_fullscreen_footer_text.end_ptr());
dl->AddText(font, font->FontSize, text_pos, ModAlpha(text_color, opacity),
s_state.left_fullscreen_footer_text.c_str(), s_state.left_fullscreen_footer_text.end_ptr());
}
}
// for next frame
s_state.fullscreen_text_alpha = 1.0f;
}

View File

@ -239,6 +239,8 @@ void CreateFooterTextString(SmallStringBase& dest, std::span<const std::pair<con
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 SetFullscreenStatusText(std::string_view text);
void SetFullscreenStatusText(std::span<const std::pair<const char*, std::string_view>> items);
void DrawFullscreenFooter();
void PrerenderMenuButtonBorder();