From bb2e35b732bc43d3f7b66ee7cb6ee560cbef3047 Mon Sep 17 00:00:00 2001
From: Connor McLaughlin <stenzek@gmail.com>
Date: Sun, 31 Jan 2021 17:40:50 +1000
Subject: [PATCH] FullscreenUI: Load covers on demand

---
 src/frontend-common/fullscreen_ui.cpp | 42 ++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 8 deletions(-)

diff --git a/src/frontend-common/fullscreen_ui.cpp b/src/frontend-common/fullscreen_ui.cpp
index 62f35df88..e02ba24b4 100644
--- a/src/frontend-common/fullscreen_ui.cpp
+++ b/src/frontend-common/fullscreen_ui.cpp
@@ -37,6 +37,8 @@ using ImGuiFullscreen::g_large_font;
 using ImGuiFullscreen::g_medium_font;
 using ImGuiFullscreen::LAYOUT_LARGE_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_WIDTH;
 
@@ -2300,17 +2302,22 @@ void DrawGameListWindow()
 
   if (BeginFullscreenColumnWindow(450.0f, LAYOUT_SCREEN_WIDTH, "game_list_entries"))
   {
+    const ImVec2 image_size(LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT, LAYOUT_MENU_BUTTON_HEIGHT));
+
     BeginMenuButtons();
 
     SmallString summary;
-    PathString title;
 
     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);
-
-      title.Format("%s##%s", entry->title.c_str(), entry->path.c_str());
-
       if (entry->code.empty())
         summary.Format("%s - ", Settings::GetDiscRegionName(entry->region));
       else
@@ -2318,16 +2325,35 @@ void DrawGameListWindow()
 
       summary.AppendString(FileSystem::GetFileNameFromPath(entry->path.c_str()));
 
-      if (MenuImageButton(
-            title, summary, static_cast<ImTextureID>(cover_texture->GetHandle()),
-            LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT)))
+      ImGui::GetWindowDrawList()->AddImage(cover_texture->GetHandle(), bb.Min, bb.Min + image_size, ImVec2(0.0f, 0.0f),
+                                           ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255));
+
+      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
         const std::string& path_to_launch(entry->path);
         s_host_interface->RunLater([path_to_launch]() { DoStartPath(path_to_launch, true); });
       }
 
-      if (ImGui::IsItemHovered())
+      if (hovered)
         selected_entry = entry;
     }