FullscreenUI: Add fullscreen/close buttons to landing window

This commit is contained in:
Connor McLaughlin 2021-02-25 02:08:01 +10:00
parent 1969a10034
commit defea38a60
3 changed files with 111 additions and 15 deletions

View File

@ -60,6 +60,7 @@ using ImGuiFullscreen::EndFullscreenColumnWindow;
using ImGuiFullscreen::EndFullscreenWindow;
using ImGuiFullscreen::EndMenuButtons;
using ImGuiFullscreen::EnumChoiceButton;
using ImGuiFullscreen::FloatingButton;
using ImGuiFullscreen::LayoutScale;
using ImGuiFullscreen::MenuButton;
using ImGuiFullscreen::MenuButtonFrame;
@ -731,21 +732,20 @@ void DrawLandingWindow()
s_host_interface->RequestExit();
{
bool about_visible, about_hovered, about_pressed;
ImRect about_rect;
ImGui::SetCursorPosY(ImGui::GetWindowHeight() - LayoutScale(50.0f));
about_pressed = MenuButtonFrame("About", true, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY,
&about_visible, &about_hovered, &about_rect.Min, &about_rect.Max);
if (about_visible)
ImVec2 fullscreen_pos;
if (FloatingButton(ICON_FA_WINDOW_CLOSE, 0.0f, 0.0f, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font,
&fullscreen_pos))
{
ImGui::PushFont(g_large_font);
ImGui::RenderTextClipped(about_rect.Min, about_rect.Max, ICON_FA_QUESTION_CIRCLE, nullptr, nullptr,
ImVec2(1.0f, 0.0f), &about_rect);
ImGui::PopFont();
s_host_interface->RequestExit();
}
if (about_pressed)
if (FloatingButton(ICON_FA_EXPAND, fullscreen_pos.x, 0.0f, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font,
&fullscreen_pos))
{
s_host_interface->RunLater([]() { s_host_interface->SetFullscreen(!s_host_interface->IsFullscreen()); });
}
if (FloatingButton(ICON_FA_QUESTION_CIRCLE, fullscreen_pos.x, 0.0f, -1.0f, -1.0f, -1.0f, 0.0f))
OpenAboutWindow();
}
@ -2879,11 +2879,19 @@ void DrawAboutWindow()
BeginMenuButtons();
if (ActiveButton(ICON_FA_GLOBE " GitHub Repository", false))
s_host_interface->ReportError("Go to https://github.com/stenzek/duckstation/");
{
s_host_interface->RunLater(
[]() { s_host_interface->ReportError("Go to https://github.com/stenzek/duckstation/"); });
}
if (ActiveButton(ICON_FA_BUG " Issue Tracker", false))
s_host_interface->ReportError("Go to https://github.com/stenzek/duckstation/issues");
{
s_host_interface->RunLater(
[]() { s_host_interface->ReportError("Go to https://github.com/stenzek/duckstation/issues"); });
}
if (ActiveButton(ICON_FA_COMMENT " Discord Server", false))
s_host_interface->ReportError("Go to https://discord.gg/Buktv3t");
{
s_host_interface->RunLater([]() { s_host_interface->ReportError("Go to https://discord.gg/Buktv3t"); });
}
if (ActiveButton(ICON_FA_WINDOW_CLOSE " Close", false))
{

View File

@ -579,6 +579,91 @@ bool MenuImageButton(const char* title, const char* summary, ImTextureID user_te
return pressed;
}
bool FloatingButton(const char* text, float x, float y, float width, float height, float anchor_x, float anchor_y,
bool enabled, ImFont* font, ImVec2* out_position)
{
const ImVec2 text_size(font->CalcTextSizeA(font->FontSize, std::numeric_limits<float>::max(), 0.0f, text));
const ImVec2& padding(ImGui::GetStyle().FramePadding);
if (width < 0.0f)
width = (padding.x * 2.0f) + text_size.x;
if (height < 0.0f)
height = (padding.y * 2.0f) + text_size.y;
const ImVec2 window_size(ImGui::GetWindowSize());
if (anchor_x == -1.0f)
x -= width;
else if (anchor_x == -0.5f)
x -= (width * 0.5f);
else if (anchor_x == 0.5f)
x = (window_size.x * 0.5f) - (width * 0.5f) - x;
else if (anchor_x == 1.0f)
x = window_size.x - width - x;
if (anchor_y == -1.0f)
y -= height;
else if (anchor_y == -0.5f)
y -= (height * 0.5f);
else if (anchor_y == 0.5f)
y = (window_size.y * 0.5f) - (height * 0.5f) - y;
else if (anchor_y == 1.0f)
y = window_size.y - height - y;
if (out_position)
*out_position = ImVec2(x, y);
ImGuiWindow* window = ImGui::GetCurrentWindow();
if (window->SkipItems)
return false;
const ImVec2 base(ImGui::GetWindowPos() + ImVec2(x, y));
ImRect bb(base, base + ImVec2(width, height));
const ImGuiID id = window->GetID(text);
if (enabled)
{
if (!ImGui::ItemAdd(bb, id))
return false;
}
else
{
if (ImGui::IsClippedEx(bb, id, false))
return false;
}
bool hovered;
bool held;
bool pressed;
if (enabled)
{
pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, 0);
if (hovered)
{
const ImU32 col = ImGui::GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered, 1.0f);
ImGui::RenderFrame(bb.Min, bb.Max, col, true, 0.0f);
}
}
else
{
hovered = false;
pressed = false;
held = false;
}
bb.Min += padding;
bb.Max -= padding;
if (!enabled)
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled));
ImGui::PushFont(font);
ImGui::RenderTextClipped(bb.Min, bb.Max, text, nullptr, nullptr, ImVec2(0.0f, 0.0f), &bb);
ImGui::PopFont();
if (!enabled)
ImGui::PopStyleColor();
return pressed;
}
bool ToggleButton(const char* title, const char* summary, bool* v, bool enabled, float height, ImFont* font,
ImFont* summary_font)
{

View File

@ -188,6 +188,9 @@ bool MenuImageButton(const char* title, const char* summary, ImTextureID user_te
bool enabled = true, float height = LAYOUT_MENU_BUTTON_HEIGHT,
const ImVec2& uv0 = ImVec2(0.0f, 0.0f), const ImVec2& uv1 = ImVec2(1.0f, 1.0f),
ImFont* font = g_large_font, ImFont* summary_font = g_medium_font);
bool FloatingButton(const char* text, float x, float y, float width = -1.0f,
float height = LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, float anchor_x = 0.0f, float anchor_y = 0.0f,
bool enabled = true, ImFont* font = g_large_font, ImVec2* out_position = nullptr);
bool ToggleButton(const char* title, const char* summary, bool* v, bool enabled = true,
float height = LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font,
ImFont* summary_font = g_medium_font);