mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-23 14:25:37 +00:00
CommonHostInterface: De-duplicate OSD messages from FS UI
This commit is contained in:
parent
4d9aa5ecdf
commit
e6ea6358a0
|
@ -1388,17 +1388,35 @@ void CommonHostInterface::DrawOSDMessages()
|
||||||
{
|
{
|
||||||
AcquirePendingOSDMessages();
|
AcquirePendingOSDMessages();
|
||||||
|
|
||||||
const float scale = ImGui::GetIO().DisplayFramebufferScale.x;
|
float max_width, margin, spacing, padding, rounding, position_x, position_y;
|
||||||
const float spacing = 5.0f * scale;
|
ImFont* font;
|
||||||
const float margin = 10.0f * scale;
|
|
||||||
const float padding = 8.0f * scale;
|
|
||||||
const float rounding = 5.0f * scale;
|
|
||||||
const float max_width = ImGui::GetIO().DisplaySize.x - margin;
|
|
||||||
float position_x = margin;
|
|
||||||
float position_y = margin;
|
|
||||||
|
|
||||||
EnumerateOSDMessages([max_width, spacing, padding, rounding, &position_x, &position_y](const std::string& message,
|
if (m_fullscreen_ui_enabled)
|
||||||
float time_remaining) -> bool {
|
{
|
||||||
|
max_width = ImGuiFullscreen::LayoutScale(1080.0f);
|
||||||
|
spacing = ImGuiFullscreen::LayoutScale(4.0f);
|
||||||
|
margin = ImGuiFullscreen::LayoutScale(10.0f);
|
||||||
|
padding = ImGuiFullscreen::LayoutScale(10.0f);
|
||||||
|
rounding = ImGuiFullscreen::LayoutScale(10.0f);
|
||||||
|
position_x = margin;
|
||||||
|
position_y = margin + ImGuiFullscreen::g_menu_bar_size;
|
||||||
|
font = ImGuiFullscreen::g_large_font;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const float scale = ImGui::GetIO().DisplayFramebufferScale.x;
|
||||||
|
spacing = 5.0f * scale;
|
||||||
|
margin = 10.0f * scale;
|
||||||
|
padding = 8.0f * scale;
|
||||||
|
rounding = 5.0f * scale;
|
||||||
|
max_width = ImGui::GetIO().DisplaySize.x - margin;
|
||||||
|
position_x = margin;
|
||||||
|
position_y = margin;
|
||||||
|
font = ImGui::GetFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
EnumerateOSDMessages([max_width, spacing, padding, rounding, &position_x, &position_y,
|
||||||
|
font](const std::string& message, float time_remaining) -> bool {
|
||||||
const float opacity = std::min(time_remaining, 1.0f);
|
const float opacity = std::min(time_remaining, 1.0f);
|
||||||
const u32 alpha = static_cast<u32>(opacity * 255.0f);
|
const u32 alpha = static_cast<u32>(opacity * 255.0f);
|
||||||
|
|
||||||
|
@ -1406,12 +1424,12 @@ void CommonHostInterface::DrawOSDMessages()
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const ImVec2 pos(position_x, position_y);
|
const ImVec2 pos(position_x, position_y);
|
||||||
const ImVec2 text_size(ImGui::CalcTextSize(message.c_str(), nullptr, false, max_width));
|
const ImVec2 text_size(
|
||||||
|
font->CalcTextSizeA(font->FontSize, max_width, -1.0f, message.c_str(), message.c_str() + message.length()));
|
||||||
const ImVec2 size(text_size.x + padding * 2.0f, text_size.y + padding * 2.0f);
|
const ImVec2 size(text_size.x + padding * 2.0f, text_size.y + padding * 2.0f);
|
||||||
const ImVec4 text_rect(pos.x + padding, pos.y + padding, pos.x + size.x - padding, pos.y + size.y - padding);
|
const ImVec4 text_rect(pos.x + padding, pos.y + padding, pos.x + size.x - padding, pos.y + size.y - padding);
|
||||||
|
|
||||||
ImDrawList* dl = ImGui::GetBackgroundDrawList();
|
ImDrawList* dl = ImGui::GetBackgroundDrawList();
|
||||||
ImFont* font = ImGui::GetFont();
|
|
||||||
dl->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(0x21, 0x21, 0x21, alpha), rounding);
|
dl->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(0x21, 0x21, 0x21, alpha), rounding);
|
||||||
dl->AddRect(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(0x48, 0x48, 0x48, alpha), rounding);
|
dl->AddRect(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(0x48, 0x48, 0x48, alpha), rounding);
|
||||||
dl->AddText(font, font->FontSize, ImVec2(text_rect.x, text_rect.y), IM_COL32(0xff, 0xff, 0xff, alpha),
|
dl->AddText(font, font->FontSize, ImVec2(text_rect.x, text_rect.y), IM_COL32(0xff, 0xff, 0xff, alpha),
|
||||||
|
|
|
@ -92,7 +92,6 @@ static void DrawQuickMenu(MainWindowType type);
|
||||||
static void DrawAchievementWindow();
|
static void DrawAchievementWindow();
|
||||||
static void DrawLeaderboardsWindow();
|
static void DrawLeaderboardsWindow();
|
||||||
static void DrawDebugMenu();
|
static void DrawDebugMenu();
|
||||||
static void DrawOSDMessages();
|
|
||||||
static void DrawAboutWindow();
|
static void DrawAboutWindow();
|
||||||
static void OpenAboutWindow();
|
static void OpenAboutWindow();
|
||||||
static void SetDebugMenuEnabled(bool enabled);
|
static void SetDebugMenuEnabled(bool enabled);
|
||||||
|
@ -391,7 +390,7 @@ void Render()
|
||||||
if (s_input_binding_type != InputBindingType::None)
|
if (s_input_binding_type != InputBindingType::None)
|
||||||
DrawInputBindingWindow();
|
DrawInputBindingWindow();
|
||||||
|
|
||||||
DrawOSDMessages();
|
s_host_interface->DrawOSDMessages();
|
||||||
|
|
||||||
ImGuiFullscreen::EndLayout();
|
ImGuiFullscreen::EndLayout();
|
||||||
}
|
}
|
||||||
|
@ -3331,46 +3330,6 @@ HostDisplayTexture* GetCoverForCurrentGame()
|
||||||
// Overlays
|
// Overlays
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void DrawOSDMessages()
|
|
||||||
{
|
|
||||||
s_host_interface->AcquirePendingOSDMessages();
|
|
||||||
|
|
||||||
ImGui::PushFont(g_large_font);
|
|
||||||
|
|
||||||
const float max_width = LayoutScale(1080.0f);
|
|
||||||
const float spacing = LayoutScale(4.0f);
|
|
||||||
const float margin = LayoutScale(10.0f);
|
|
||||||
const float padding = LayoutScale(10.0f);
|
|
||||||
float position_x = margin;
|
|
||||||
float position_y = margin + ImGuiFullscreen::g_menu_bar_size;
|
|
||||||
|
|
||||||
s_host_interface->EnumerateOSDMessages(
|
|
||||||
[max_width, spacing, padding, &position_x, &position_y](const std::string& message, float time_remaining) -> bool {
|
|
||||||
const float opacity = std::min(time_remaining, 1.0f);
|
|
||||||
const u32 alpha = static_cast<u32>(opacity * 255.0f);
|
|
||||||
|
|
||||||
if (position_y >= ImGui::GetIO().DisplaySize.y)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const ImVec2 pos(position_x, position_y);
|
|
||||||
const ImVec2 text_size(ImGui::CalcTextSize(message.c_str(), nullptr, false, max_width));
|
|
||||||
const ImVec2 size(text_size + LayoutScale(20.0f, 20.0f));
|
|
||||||
const ImVec4 text_rect(pos.x + padding, pos.y + padding, pos.x + size.x - padding, pos.y + size.y - padding);
|
|
||||||
|
|
||||||
// If we're in the landing page, draw the OSD over the windows (since it covers it)
|
|
||||||
ImDrawList* dl = (s_current_main_window != MainWindowType::None) ? ImGui::GetForegroundDrawList() :
|
|
||||||
ImGui::GetBackgroundDrawList();
|
|
||||||
dl->AddRectFilled(pos, pos + size, IM_COL32(0x21, 0x21, 0x21, alpha), LayoutScale(10.0f));
|
|
||||||
dl->AddRect(pos, pos + size, IM_COL32(0x48, 0x48, 0x48, alpha), LayoutScale(10.0f));
|
|
||||||
dl->AddText(g_large_font, g_large_font->FontSize, ImVec2(text_rect.x, text_rect.y),
|
|
||||||
IM_COL32(0xff, 0xff, 0xff, alpha), message.c_str(), nullptr, max_width, &text_rect);
|
|
||||||
position_y += size.y + spacing;
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
ImGui::PopFont();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenAboutWindow()
|
void OpenAboutWindow()
|
||||||
{
|
{
|
||||||
s_about_window_open = true;
|
s_about_window_open = true;
|
||||||
|
|
Loading…
Reference in a new issue