FullscreenUI: Load covers on demand

This commit is contained in:
Connor McLaughlin 2021-01-31 17:40:50 +10:00
parent 2dabccffc6
commit bb2e35b732
1 changed files with 34 additions and 8 deletions

View File

@ -37,6 +37,8 @@ using ImGuiFullscreen::g_large_font;
using ImGuiFullscreen::g_medium_font; using ImGuiFullscreen::g_medium_font;
using ImGuiFullscreen::LAYOUT_LARGE_FONT_SIZE; using ImGuiFullscreen::LAYOUT_LARGE_FONT_SIZE;
using ImGuiFullscreen::LAYOUT_MEDIUM_FONT_SIZE; using ImGuiFullscreen::LAYOUT_MEDIUM_FONT_SIZE;
using ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT;
using ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY;
using ImGuiFullscreen::LAYOUT_SCREEN_HEIGHT; using ImGuiFullscreen::LAYOUT_SCREEN_HEIGHT;
using ImGuiFullscreen::LAYOUT_SCREEN_WIDTH; using ImGuiFullscreen::LAYOUT_SCREEN_WIDTH;
@ -2300,17 +2302,22 @@ void DrawGameListWindow()
if (BeginFullscreenColumnWindow(450.0f, LAYOUT_SCREEN_WIDTH, "game_list_entries")) if (BeginFullscreenColumnWindow(450.0f, LAYOUT_SCREEN_WIDTH, "game_list_entries"))
{ {
const ImVec2 image_size(LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT, LAYOUT_MENU_BUTTON_HEIGHT));
BeginMenuButtons(); BeginMenuButtons();
SmallString summary; SmallString summary;
PathString title;
for (const GameListEntry* entry : s_game_list_sorted_entries) for (const GameListEntry* entry : s_game_list_sorted_entries)
{ {
ImRect bb;
bool visible, hovered;
bool pressed =
MenuButtonFrame(entry->path.c_str(), true, LAYOUT_MENU_BUTTON_HEIGHT, &visible, &hovered, &bb.Min, &bb.Max);
if (!visible)
continue;
HostDisplayTexture* cover_texture = GetGameListCover(entry); HostDisplayTexture* cover_texture = GetGameListCover(entry);
title.Format("%s##%s", entry->title.c_str(), entry->path.c_str());
if (entry->code.empty()) if (entry->code.empty())
summary.Format("%s - ", Settings::GetDiscRegionName(entry->region)); summary.Format("%s - ", Settings::GetDiscRegionName(entry->region));
else else
@ -2318,16 +2325,35 @@ void DrawGameListWindow()
summary.AppendString(FileSystem::GetFileNameFromPath(entry->path.c_str())); summary.AppendString(FileSystem::GetFileNameFromPath(entry->path.c_str()));
if (MenuImageButton( ImGui::GetWindowDrawList()->AddImage(cover_texture->GetHandle(), bb.Min, bb.Min + image_size, ImVec2(0.0f, 0.0f),
title, summary, static_cast<ImTextureID>(cover_texture->GetHandle()), ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255));
LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT)))
const float midpoint = bb.Min.y + g_large_font->FontSize + LayoutScale(4.0f);
const float text_start_x = bb.Min.x + image_size.x + LayoutScale(15.0f);
const ImRect title_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint));
const ImRect summary_bb(ImVec2(text_start_x, midpoint), bb.Max);
ImGui::PushFont(g_large_font);
ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, entry->title.c_str(),
entry->title.c_str() + entry->title.size(), nullptr, ImVec2(0.0f, 0.0f), &title_bb);
ImGui::PopFont();
if (summary)
{
ImGui::PushFont(g_medium_font);
ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, summary, summary.GetCharArray() + summary.GetLength(),
nullptr, ImVec2(0.0f, 0.0f), &summary_bb);
ImGui::PopFont();
}
if (pressed)
{ {
// launch game // launch game
const std::string& path_to_launch(entry->path); const std::string& path_to_launch(entry->path);
s_host_interface->RunLater([path_to_launch]() { DoStartPath(path_to_launch, true); }); s_host_interface->RunLater([path_to_launch]() { DoStartPath(path_to_launch, true); });
} }
if (ImGui::IsItemHovered()) if (hovered)
selected_entry = entry; selected_entry = entry;
} }