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 @@
+
+
+
\ 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;