diff --git a/bin/resources/fullscreenui/applications-system.png b/bin/resources/fullscreenui/applications-system.png deleted file mode 100644 index 7f7bfef5f6..0000000000 Binary files a/bin/resources/fullscreenui/applications-system.png and /dev/null differ diff --git a/bin/resources/fullscreenui/applications-system.svg b/bin/resources/fullscreenui/applications-system.svg new file mode 100644 index 0000000000..fb1abd2377 --- /dev/null +++ b/bin/resources/fullscreenui/applications-system.svg @@ -0,0 +1,41 @@ + + + + + + + + diff --git a/bin/resources/fullscreenui/back-icon.png b/bin/resources/fullscreenui/back-icon.png deleted file mode 100644 index 6434c8130b..0000000000 Binary files a/bin/resources/fullscreenui/back-icon.png and /dev/null differ diff --git a/bin/resources/fullscreenui/back-icon.svg b/bin/resources/fullscreenui/back-icon.svg new file mode 100644 index 0000000000..07235afc6e --- /dev/null +++ b/bin/resources/fullscreenui/back-icon.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/bin/resources/fullscreenui/desktop-mode.png b/bin/resources/fullscreenui/desktop-mode.png deleted file mode 100644 index 9063d0a797..0000000000 Binary files a/bin/resources/fullscreenui/desktop-mode.png and /dev/null differ diff --git a/bin/resources/fullscreenui/desktop-mode.svg b/bin/resources/fullscreenui/desktop-mode.svg new file mode 100644 index 0000000000..5c1604557b --- /dev/null +++ b/bin/resources/fullscreenui/desktop-mode.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/bin/resources/fullscreenui/drive-cdrom.png b/bin/resources/fullscreenui/drive-cdrom.png deleted file mode 100644 index 58a497d871..0000000000 Binary files a/bin/resources/fullscreenui/drive-cdrom.png and /dev/null differ diff --git a/bin/resources/fullscreenui/drive-cdrom.svg b/bin/resources/fullscreenui/drive-cdrom.svg new file mode 100644 index 0000000000..7a2b220702 --- /dev/null +++ b/bin/resources/fullscreenui/drive-cdrom.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/bin/resources/fullscreenui/exit.png b/bin/resources/fullscreenui/exit.png deleted file mode 100644 index 37ce93479c..0000000000 Binary files a/bin/resources/fullscreenui/exit.png and /dev/null differ diff --git a/bin/resources/fullscreenui/exit.svg b/bin/resources/fullscreenui/exit.svg new file mode 100644 index 0000000000..72f0a24403 --- /dev/null +++ b/bin/resources/fullscreenui/exit.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/bin/resources/fullscreenui/game-list.png b/bin/resources/fullscreenui/game-list.png deleted file mode 100644 index 70a1312d89..0000000000 Binary files a/bin/resources/fullscreenui/game-list.png and /dev/null differ diff --git a/bin/resources/fullscreenui/game-list.svg b/bin/resources/fullscreenui/game-list.svg new file mode 100644 index 0000000000..55529ac597 --- /dev/null +++ b/bin/resources/fullscreenui/game-list.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/bin/resources/fullscreenui/media-cdrom.png b/bin/resources/fullscreenui/media-cdrom.png deleted file mode 100644 index 58fcfb7b6e..0000000000 Binary files a/bin/resources/fullscreenui/media-cdrom.png and /dev/null differ diff --git a/bin/resources/fullscreenui/media-cdrom.svg b/bin/resources/fullscreenui/media-cdrom.svg new file mode 100644 index 0000000000..d586239bd4 --- /dev/null +++ b/bin/resources/fullscreenui/media-cdrom.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/bin/resources/fullscreenui/start-bios.png b/bin/resources/fullscreenui/start-bios.png deleted file mode 100644 index 38bfc0dbb3..0000000000 Binary files a/bin/resources/fullscreenui/start-bios.png and /dev/null differ diff --git a/bin/resources/fullscreenui/start-bios.svg b/bin/resources/fullscreenui/start-bios.svg new file mode 100644 index 0000000000..e30de390ab --- /dev/null +++ b/bin/resources/fullscreenui/start-bios.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/bin/resources/fullscreenui/start-file.png b/bin/resources/fullscreenui/start-file.png deleted file mode 100644 index 28993c96b2..0000000000 Binary files a/bin/resources/fullscreenui/start-file.png and /dev/null differ diff --git a/bin/resources/fullscreenui/start-file.svg b/bin/resources/fullscreenui/start-file.svg new file mode 100644 index 0000000000..6ae8b86702 --- /dev/null +++ b/bin/resources/fullscreenui/start-file.svg @@ -0,0 +1,7 @@ + + + + + + Folder + \ No newline at end of file diff --git a/pcsx2/ImGui/FullscreenUI.cpp b/pcsx2/ImGui/FullscreenUI.cpp index 32adcf9dc0..10a393d825 100644 --- a/pcsx2/ImGui/FullscreenUI.cpp +++ b/pcsx2/ImGui/FullscreenUI.cpp @@ -139,6 +139,7 @@ using ImGuiFullscreen::GetCachedTextureAsync; using ImGuiFullscreen::GetPlaceholderTexture; using ImGuiFullscreen::GetQueuedFocusResetType; using ImGuiFullscreen::HorizontalMenuItem; +using ImGuiFullscreen::HorizontalMenuSvgItem; using ImGuiFullscreen::IsFocusResetQueued; using ImGuiFullscreen::IsGamepadInputSource; using ImGuiFullscreen::LayoutScale; @@ -271,8 +272,6 @@ namespace FullscreenUI static std::array, static_cast(GameDatabaseSchema::Compatibility::Perfect)> s_game_compatibility_textures; static std::shared_ptr s_banner_texture; - static std::shared_ptr s_fallback_disc_texture; - static std::shared_ptr s_fallback_exe_texture; static std::vector> s_cleanup_textures; ////////////////////////////////////////////////////////////////////////// @@ -476,9 +475,13 @@ namespace FullscreenUI static void DrawGameListSettingsWindow(); static void SwitchToGameList(); static void PopulateGameListEntryList(); - static GSTexture* GetTextureForGameListEntryType(GameList::EntryType type); + static GSTexture* GetTextureForGameListEntryType(GameList::EntryType type, const ImVec2& size, SvgScaling mode = SvgScaling::Stretch); static GSTexture* GetGameListCover(const GameList::Entry* entry); - static GSTexture* GetCoverForCurrentGame(); + static void DrawGameCover(const GameList::Entry* entry, const ImVec2& size); + static void DrawGameCover(const GameList::Entry* entry, ImDrawList* draw_list, const ImVec2& min, const ImVec2& max); + // For when we have no GameList entry + static void DrawFallbackCover(const ImVec2& size); + static void DrawFallbackCover(ImDrawList* draw_list, const ImVec2& min, const ImVec2& max); // Lazily populated cover images. static std::unordered_map s_cover_image_map; @@ -1107,9 +1110,6 @@ void FullscreenUI::ReturnToMainWindow() bool FullscreenUI::LoadResources() { - s_fallback_disc_texture = LoadTexture("fullscreenui/media-cdrom.png"); - s_fallback_exe_texture = LoadTexture("fullscreenui/applications-system.png"); - return LoadSvgResources(); } @@ -1128,8 +1128,6 @@ bool FullscreenUI::LoadSvgResources() void FullscreenUI::DestroyResources() { - s_fallback_exe_texture.reset(); - s_fallback_disc_texture.reset(); s_banner_texture.reset(); for (auto& tex : s_game_compatibility_textures) tex.reset(); @@ -1457,27 +1455,26 @@ void FullscreenUI::DrawLandingWindow() { ResetFocusHere(); - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/game-list.png"), FSUI_CSTR("Game List"), + if (HorizontalMenuSvgItem("fullscreenui/game-list.svg", FSUI_CSTR("Game List"), FSUI_CSTR("Launch a game from images scanned from your game directories."))) { SwitchToGameList(); } - if (HorizontalMenuItem( - GetCachedTexture("fullscreenui/media-cdrom.png"), FSUI_CSTR("Start Game"), + if (HorizontalMenuSvgItem("fullscreenui/media-cdrom.svg", FSUI_CSTR("Start Game"), FSUI_CSTR("Launch a game from a file, disc, or starts the console without any disc inserted."))) { s_current_main_window = MainWindowType::StartGame; QueueResetFocus(FocusResetType::WindowChanged); } - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/applications-system.png"), FSUI_CSTR("Settings"), + if (HorizontalMenuSvgItem("fullscreenui/applications-system.svg", FSUI_CSTR("Settings"), FSUI_CSTR("Changes settings for the application."))) { SwitchToSettings(); } - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/exit.png"), FSUI_CSTR("Exit"), + if (HorizontalMenuSvgItem("fullscreenui/exit.svg", FSUI_CSTR("Exit"), FSUI_CSTR("Return to desktop mode, or exit the application.")) || (!AreAnyDialogsOpen() && WantsToCloseMenu())) { @@ -1536,26 +1533,25 @@ void FullscreenUI::DrawStartGameWindow() { ResetFocusHere(); - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/start-file.png"), FSUI_CSTR("Start File"), + if (HorizontalMenuSvgItem("fullscreenui/start-file.svg", FSUI_CSTR("Start File"), FSUI_CSTR("Launch a game by selecting a file/disc image."))) { DoStartFile(); } - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/drive-cdrom.png"), FSUI_CSTR("Start Disc"), + if (HorizontalMenuSvgItem("fullscreenui/drive-cdrom.svg", FSUI_CSTR("Start Disc"), FSUI_CSTR("Start a game from a disc in your PC's DVD drive."))) { DoStartDisc(); } - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/start-bios.png"), FSUI_CSTR("Start BIOS"), + if (HorizontalMenuSvgItem("fullscreenui/start-bios.svg", FSUI_CSTR("Start BIOS"), FSUI_CSTR("Start the console without any disc inserted."))) { DoStartBIOS(); } - // https://www.iconpacks.net/free-icon/arrow-back-3783.html - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/back-icon.png"), FSUI_CSTR("Back"), + if (HorizontalMenuSvgItem("fullscreenui/back-icon.svg", FSUI_CSTR("Back"), FSUI_CSTR("Return to the previous menu.")) || (!AreAnyDialogsOpen() && WantsToCloseMenu())) { @@ -1606,8 +1602,7 @@ void FullscreenUI::DrawExitWindow() { ResetFocusHere(); - // https://www.iconpacks.net/free-icon/arrow-back-3783.html - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/back-icon.png"), FSUI_CSTR("Back"), + if (HorizontalMenuSvgItem("fullscreenui/back-icon.svg", FSUI_CSTR("Back"), FSUI_CSTR("Return to the previous menu.")) || WantsToCloseMenu()) { @@ -1615,7 +1610,7 @@ void FullscreenUI::DrawExitWindow() QueueResetFocus(FocusResetType::WindowChanged); } - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/exit.png"), FSUI_CSTR("Exit PCSX2"), + if (HorizontalMenuSvgItem("fullscreenui/exit.svg", FSUI_CSTR("Exit PCSX2"), FSUI_CSTR("Completely exits the application, returning you to your desktop."))) { DoRequestExit(); @@ -1623,8 +1618,8 @@ void FullscreenUI::DrawExitWindow() if (!Host::InNoGUIMode()) { - if (HorizontalMenuItem(GetCachedTexture("fullscreenui/desktop-mode.png"), FSUI_CSTR("Desktop Mode"), - FSUI_CSTR("Exits Big Picture mode, returning to the desktop interface."))) + if (HorizontalMenuSvgItem("fullscreenui/desktop-mode.svg", FSUI_CSTR("Desktop Mode"), + FSUI_CSTR("Exits Big Picture mode, returning to the desktop interface."))) { DoDesktopMode(); } @@ -5463,14 +5458,18 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) } DrawShadowedText(dl, g_medium_font, subtitle_pos, text_color, s_current_game_subtitle.c_str()); - - GSTexture* const cover = GetCoverForCurrentGame(); const ImVec2 image_min(display_size.x - LayoutScale(10.0f + image_width), display_size.y - LayoutScale(LAYOUT_FOOTER_HEIGHT) - LayoutScale(10.0f + image_height) - rp_height); const ImVec2 image_max(image_min.x + LayoutScale(image_width), image_min.y + LayoutScale(image_height) + rp_height); - const ImRect image_rect(CenterImage( - ImRect(image_min, image_max), ImVec2(static_cast(cover->GetWidth()), static_cast(cover->GetHeight())))); - dl->AddImage(reinterpret_cast(cover->GetNativeHandle()), image_rect.Min, image_rect.Max); + { + auto lock = GameList::GetLock(); + + const GameList::Entry* entry = GameList::GetEntryForPath(s_current_disc_path.c_str()); + if (entry) + DrawGameCover(entry, dl, image_min, image_max); + else + DrawFallbackCover(dl, image_min, image_max); + } } // current time / play time @@ -6458,8 +6457,6 @@ void FullscreenUI::DrawGameList(const ImVec2& heading_size) if (!visible) continue; - GSTexture* cover_texture = GetGameListCover(entry); - summary.clear(); if (entry->serial.empty()) fmt::format_to(std::back_inserter(summary), "{} - ", GameList::RegionToString(entry->region, true)); @@ -6469,11 +6466,7 @@ void FullscreenUI::DrawGameList(const ImVec2& heading_size) const std::string_view filename(Path::GetFileName(entry->path)); summary.append(filename); - const ImRect image_rect(CenterImage(ImRect(bb.Min, bb.Min + image_size), - ImVec2(static_cast(cover_texture->GetWidth()), static_cast(cover_texture->GetHeight())))); - - ImGui::GetWindowDrawList()->AddImage(reinterpret_cast(cover_texture->GetNativeHandle()), - image_rect.Min, image_rect.Max, ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255)); + DrawGameCover(entry, ImGui::GetWindowDrawList(), bb.Min, bb.Min + image_size); 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); @@ -6514,18 +6507,13 @@ void FullscreenUI::DrawGameList(const ImVec2& heading_size) if (BeginFullscreenColumnWindow(-530.0f, 0.0f, "game_list_info", UIPrimaryDarkColor)) { - const GSTexture* cover_texture = - selected_entry ? GetGameListCover(selected_entry) : GetTextureForGameListEntryType(GameList::EntryType::Count); - if (cover_texture) - { - const ImRect image_rect(CenterImage(LayoutScale(ImVec2(275.0f, 400.0f)), - ImVec2(static_cast(cover_texture->GetWidth()), static_cast(cover_texture->GetHeight())))); + const ImVec2 image_size = LayoutScale(ImVec2(275.0f, 400.0f)); + ImGui::SetCursorPos(LayoutScale(ImVec2(128.0f, 20.0f))); - ImGui::SetCursorPos(LayoutScale(ImVec2(128.0f, 20.0f)) + image_rect.Min); - ImGui::Image(reinterpret_cast(selected_entry ? GetGameListCover(selected_entry)->GetNativeHandle() : - GetTextureForGameListEntryType(GameList::EntryType::Count)->GetNativeHandle()), - image_rect.GetSize()); - } + if (selected_entry) + DrawGameCover(selected_entry, image_size); + else + DrawFallbackCover(image_size); const float work_width = ImGui::GetCurrentWindow()->WorkRect.GetWidth(); constexpr float field_margin_y = 10.0f; @@ -6693,12 +6681,7 @@ void FullscreenUI::DrawGameGrid(const ImVec2& heading_size) bb.Min += style.FramePadding; bb.Max -= style.FramePadding; - const GSTexture* const cover_texture = GetGameListCover(entry); - const ImRect image_rect(CenterImage(ImRect(bb.Min, bb.Min + image_size), - ImVec2(static_cast(cover_texture->GetWidth()), static_cast(cover_texture->GetHeight())))); - - ImGui::GetWindowDrawList()->AddImage(reinterpret_cast(cover_texture->GetNativeHandle()), - image_rect.Min, image_rect.Max, ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255)); + DrawGameCover(entry, ImGui::GetWindowDrawList(), bb.Min, bb.Min + image_size); const ImRect title_bb(ImVec2(bb.Min.x, bb.Min.y + image_height + title_spacing), bb.Max); const std::string_view title(std::string_view(entry->GetTitle(true)).substr(0, 31)); @@ -6987,33 +6970,104 @@ GSTexture* FullscreenUI::GetGameListCover(const GameList::Entry* entry) cover_it = s_cover_image_map.emplace(entry->path, std::move(cover_path)).first; } - GSTexture* tex = (!cover_it->second.empty()) ? GetCachedTextureAsync(cover_it->second.c_str()) : nullptr; - return tex ? tex : GetTextureForGameListEntryType(entry->type); + return (!cover_it->second.empty()) ? GetCachedTextureAsync(cover_it->second.c_str()) : nullptr; } -GSTexture* FullscreenUI::GetTextureForGameListEntryType(GameList::EntryType type) +GSTexture* FullscreenUI::GetTextureForGameListEntryType(GameList::EntryType type, const ImVec2& size, SvgScaling mode) { switch (type) { case GameList::EntryType::ELF: - return s_fallback_exe_texture.get(); + return GetCachedSvgTexture("fullscreenui/applications-system.svg", size, mode); case GameList::EntryType::PS1Disc: case GameList::EntryType::PS2Disc: default: - return s_fallback_disc_texture.get(); + return GetCachedSvgTexture("fullscreenui/media-cdrom.svg", size, mode); } } -GSTexture* FullscreenUI::GetCoverForCurrentGame() +void FullscreenUI::DrawGameCover(const GameList::Entry* entry, const ImVec2& size) { - auto lock = GameList::GetLock(); + // Used in DrawGameList (selected preview) + const GSTexture* cover_texture = GetGameListCover(entry); - const GameList::Entry* entry = GameList::GetEntryForPath(s_current_disc_path.c_str()); - if (!entry) - return s_fallback_disc_texture.get(); + pxAssert(ImGui::GetCurrentContext()->Style.ImageBorderSize == 0); + const ImVec2 origin = ImGui::GetCursorPos(); - return GetGameListCover(entry); + if (cover_texture) + { + const ImRect image_rect(CenterImage(size, + ImVec2(static_cast(cover_texture->GetWidth()), static_cast(cover_texture->GetHeight())))); + + ImGui::SetCursorPos(origin + image_rect.Min); + ImGui::Image(reinterpret_cast(cover_texture->GetNativeHandle()), image_rect.GetSize()); + } + else + { + const float min_size = std::min(size.x, size.y); + const ImVec2 image_square(min_size, min_size); + GSTexture* const icon_texture = GetTextureForGameListEntryType(entry->type, image_square); + + const ImRect image_rect(CenterImage(size, image_square)); + DrawSvgTexture(icon_texture, image_square); + } + // Pretend the image we drew was the the size passed to us + ImGui::SetCursorPos(origin); + ImGui::Dummy(size); +} + +void FullscreenUI::DrawGameCover(const GameList::Entry* entry, ImDrawList* draw_list, const ImVec2& min, const ImVec2& max) +{ + // Used in DrawPauseMenu, DrawGameList (list item), DrawGameGrid + const GSTexture* cover_texture = GetGameListCover(entry); + + if (cover_texture) + { + const ImRect image_rect(CenterImage(ImRect(min, max), + ImVec2(static_cast(cover_texture->GetWidth()), static_cast(cover_texture->GetHeight())))); + + draw_list->AddImage(reinterpret_cast(cover_texture->GetNativeHandle()), + image_rect.Min, image_rect.Max); + } + else + { + const float min_size = std::min(max.x - min.x, max.y - min.y); + const ImVec2 image_square(min_size, min_size); + + const ImRect image_rect(CenterImage(ImRect(min, max), image_square)); + + DrawListSvgTexture(draw_list, GetTextureForGameListEntryType(entry->type, image_square, SvgScaling::Fit), + image_rect.Min, image_rect.Max); + } +} + +void FullscreenUI::DrawFallbackCover(const ImVec2& size) +{ + pxAssert(ImGui::GetCurrentContext()->Style.ImageBorderSize == 0); + const ImVec2 origin = ImGui::GetCursorPos(); + + const float min_size = std::min(size.x, size.y); + const ImVec2 image_square(min_size, min_size); + GSTexture* const icon_texture = GetTextureForGameListEntryType(GameList::EntryType::PS2Disc, image_square); + + const ImRect image_rect(CenterImage(size, image_square)); + DrawSvgTexture(icon_texture, image_square); + + // Pretend the image we drew was the the size passed to us + ImGui::SetCursorPos(origin); + ImGui::Dummy(size); +} + +void FullscreenUI::DrawFallbackCover(ImDrawList* draw_list, const ImVec2& min, const ImVec2& max) +{ + const float min_size = std::min(max.x - min.x, max.y - min.y); + const ImVec2 image_square(min_size, min_size); + + const ImRect image_rect(CenterImage(ImRect(min, max), image_square)); + + DrawListSvgTexture(draw_list, GetTextureForGameListEntryType(GameList::EntryType::PS2Disc, image_square, SvgScaling::Fit), + image_rect.Min, image_rect.Max); } ////////////////////////////////////////////////////////////////////////// diff --git a/pcsx2/ImGui/ImGuiFullscreen.cpp b/pcsx2/ImGui/ImGuiFullscreen.cpp index 2e7f51c954..257bca33a6 100644 --- a/pcsx2/ImGui/ImGuiFullscreen.cpp +++ b/pcsx2/ImGui/ImGuiFullscreen.cpp @@ -1992,7 +1992,7 @@ void ImGuiFullscreen::EndHorizontalMenu() EndFullscreenWindow(); } -bool ImGuiFullscreen::HorizontalMenuItem(GSTexture* icon, const char* title, const char* description) +bool ImGuiFullscreen::HorizontalMenuItem(GSTexture* icon, const ImVec2& icon_uv0, const ImVec2& icon_uv1, const char* title, const char* description) { ImGuiWindow* window = ImGui::GetCurrentWindow(); if (window->SkipItems) @@ -2031,7 +2031,7 @@ bool ImGuiFullscreen::HorizontalMenuItem(GSTexture* icon, const char* title, con const ImVec2 icon_pos = bb.Min + ImVec2((avail_width - icon_size) * 0.5f, 0.0f); ImDrawList* dl = ImGui::GetWindowDrawList(); - dl->AddImage(reinterpret_cast(icon->GetNativeHandle()), icon_pos, icon_pos + ImVec2(icon_size, icon_size)); + dl->AddImage(reinterpret_cast(icon->GetNativeHandle()), icon_pos, icon_pos + ImVec2(icon_size, icon_size), icon_uv0, icon_uv1); ImFont* title_font = g_large_font; const ImVec2 title_size = title_font->CalcTextSizeA(title_font->FontSize, avail_width, 0.0f, title); @@ -2056,6 +2056,22 @@ bool ImGuiFullscreen::HorizontalMenuItem(GSTexture* icon, const char* title, con return pressed; } +bool ImGuiFullscreen::HorizontalMenuItem(GSTexture* icon, const char* title, const char* description) +{ + return HorizontalMenuItem(icon, ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), title, description); +} + +bool ImGuiFullscreen::HorizontalMenuSvgItem(const char* svg_path, const char* title, const char* description, SvgScaling mode) +{ + const ImVec2 icon_size = LayoutScale(150.0f, 150.0f); + GSTexture* padded_texture = GetCachedSvgTexture(svg_path, icon_size, mode); + + const ImVec2 padded_size(padded_texture->GetWidth(), padded_texture->GetHeight()); + const ImVec2 uv1 = icon_size / padded_size; + + return HorizontalMenuItem(padded_texture, ImVec2(0.0f, 0.0f), uv1, title, description); +} + void ImGuiFullscreen::PopulateFileSelectorItems() { s_file_selector_items.clear(); diff --git a/pcsx2/ImGui/ImGuiFullscreen.h b/pcsx2/ImGui/ImGuiFullscreen.h index 239ce0958d..010b7e56b2 100644 --- a/pcsx2/ImGui/ImGuiFullscreen.h +++ b/pcsx2/ImGui/ImGuiFullscreen.h @@ -235,7 +235,9 @@ namespace ImGuiFullscreen bool BeginHorizontalMenu(const char* name, const ImVec2& position, const ImVec2& size, u32 num_items); void EndHorizontalMenu(); + bool HorizontalMenuItem(GSTexture* icon, const ImVec2& icon_uv0, const ImVec2& icon_uv1, const char* title, const char* description); bool HorizontalMenuItem(GSTexture* icon, const char* title, const char* description); + bool HorizontalMenuSvgItem(const char* svg_path, const char* title, const char* description, SvgScaling mode = SvgScaling::Stretch); using FileSelectorCallback = std::function; using FileSelectorFilters = std::vector;