From 22eee94436f7e33f130c6224c0e616d2eb9a70d4 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Thu, 16 Nov 2023 09:32:24 +0100 Subject: [PATCH] impr: Better UI for the Welcome screen --- .../include/hex/ui/imgui_imhex_extensions.h | 2 +- .../source/ui/imgui_imhex_extensions.cpp | 11 ++-- main/gui/source/window/win_window.cpp | 13 ++-- plugins/builtin/source/content/recent.cpp | 16 ++--- .../builtin/source/content/welcome_screen.cpp | 60 +++++++++++-------- 5 files changed, 58 insertions(+), 44 deletions(-) diff --git a/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h b/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h index b57ea0653..264b6c1cf 100644 --- a/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h +++ b/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h @@ -269,7 +269,7 @@ namespace ImGui { bool BeginBox(); void EndBox(); - void BeginSubWindow(const char *label, ImVec2 size = ImVec2(0, 0)); + void BeginSubWindow(const char *label, ImVec2 size = ImVec2(0, 0), ImGuiChildFlags flags = ImGuiChildFlags_None); void EndSubWindow(); template diff --git a/lib/libimhex/source/ui/imgui_imhex_extensions.cpp b/lib/libimhex/source/ui/imgui_imhex_extensions.cpp index 9b1ddda04..3369ca4eb 100644 --- a/lib/libimhex/source/ui/imgui_imhex_extensions.cpp +++ b/lib/libimhex/source/ui/imgui_imhex_extensions.cpp @@ -240,7 +240,8 @@ namespace ImGui { bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0, 0.5)); + PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0, 0.5)); + PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1); // Render const ImU32 col = GetCustomColorU32((held && hovered) ? ImGuiCustomCol_DescButtonActive : hovered ? ImGuiCustomCol_DescButtonHovered @@ -254,7 +255,7 @@ namespace ImGui { RenderTextClipped(bb.Min + style.FramePadding * 2 + ImVec2(style.FramePadding.x * 2, label_size.y), bb.Max - style.FramePadding, description, nullptr, &text_size, style.ButtonTextAlign, &bb); PopStyleColor(); - ImGui::PopStyleVar(); + PopStyleVar(2); // Automatically close popups // if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup)) @@ -834,21 +835,21 @@ namespace ImGui { ImGui::PopStyleVar(); } - void BeginSubWindow(const char *label, ImVec2 size) { + void BeginSubWindow(const char *label, ImVec2 size, ImGuiChildFlags flags) { const bool hasMenuBar = !std::string_view(label).empty(); ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); - if (ImGui::BeginChild(label, size, ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeY, hasMenuBar ? ImGuiWindowFlags_MenuBar : ImGuiWindowFlags_None)) { + if (ImGui::BeginChild(label, size, ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeY | flags, hasMenuBar ? ImGuiWindowFlags_MenuBar : ImGuiWindowFlags_None)) { if (hasMenuBar && ImGui::BeginMenuBar()) { ImGui::TextUnformatted(label); ImGui::EndMenuBar(); } } + ImGui::PopStyleVar(); } void EndSubWindow() { ImGui::EndChild(); - ImGui::PopStyleVar(); } } \ No newline at end of file diff --git a/main/gui/source/window/win_window.cpp b/main/gui/source/window/win_window.cpp index ebe7fd680..45586b8c8 100644 --- a/main/gui/source/window/win_window.cpp +++ b/main/gui/source/window/win_window.cpp @@ -215,10 +215,15 @@ namespace hex { return HTBOTTOMRIGHT; case RegionClient: default: - if ((cursor.y < (window.top + g_titleBarHeight * 2)) && !ImGui::IsAnyItemHovered() && (hoveredWindowName == "##MainMenuBar" || hoveredWindowName == "ImHexDockSpace")) - return HTCAPTION; - else - break; + if (cursor.y < (window.top + g_titleBarHeight * 2)) { + if (hoveredWindowName == "##MainMenuBar" || hoveredWindowName == "ImHexDockSpace") { + if (!ImGui::IsAnyItemHovered()) { + return HTCAPTION; + } + } + } + + break; } break; } diff --git a/plugins/builtin/source/content/recent.cpp b/plugins/builtin/source/content/recent.cpp index 17fb01d99..a37c09e7e 100644 --- a/plugins/builtin/source/content/recent.cpp +++ b/plugins/builtin/source/content/recent.cpp @@ -170,16 +170,11 @@ namespace hex::plugin::builtin::recent { void draw() { - ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 9); - ImGui::TableNextColumn(); - ImGui::UnderlinedText(s_recentEntries.empty() ? "" : "hex.builtin.welcome.start.recent"_lang); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 5_scaled); - ImGui::Dummy({0, 0}); - ImGui::SameLine(0, 0); + ImGui::BeginSubWindow("hex.builtin.welcome.start.recent"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); { if (!s_recentEntriesUpdating) { - auto it = s_recentEntries.begin(); - while (it != s_recentEntries.end()) { + + for (auto it = s_recentEntries.begin(); it != s_recentEntries.end();) { const auto &recentEntry = *it; bool shouldRemove = false; @@ -192,13 +187,13 @@ namespace hex::plugin::builtin::recent { } else { icon = ICON_VS_FILE_BINARY; } - if (ImGui::BulletHyperlink(hex::format("{} {}", icon, recentEntry.displayName).c_str())) { + if (ImGui::BulletHyperlink(hex::format("{} {}", icon, hex::limitStringLength(recentEntry.displayName, 32)).c_str())) { loadRecentEntry(recentEntry); break; } // Detect right click on recent provider - std::string popupID = std::string("RecentEntryMenu.")+std::to_string(recentEntry.getHash()); + std::string popupID = hex::format("RecentEntryMenu.{}", recentEntry.getHash()); if (ImGui::IsMouseReleased(1) && ImGui::IsItemHovered()) { ImGui::OpenPopup(popupID.c_str()); } @@ -220,6 +215,7 @@ namespace hex::plugin::builtin::recent { } } } + ImGui::EndSubWindow(); } void drawFileMenuItem() { diff --git a/plugins/builtin/source/content/welcome_screen.cpp b/plugins/builtin/source/content/welcome_screen.cpp index 631d7f589..928ed2baa 100644 --- a/plugins/builtin/source/content/welcome_screen.cpp +++ b/plugins/builtin/source/content/welcome_screen.cpp @@ -149,6 +149,8 @@ namespace hex::plugin::builtin { ImGui::Image(s_bannerTexture, s_bannerTexture.getSize() / (2 * (1.0F / ImHexApi::System::getGlobalScale()))); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::GetStyleColorVec4(ImGuiCol_PopupBg)); + ON_SCOPE_EXIT { ImGui::PopStyleColor(); }; ImGui::Indent(); if (ImGui::BeginTable("Welcome Left", 1, ImGuiTableFlags_NoBordersInBody, ImVec2(availableSpace.x / 2, 0))) { @@ -162,9 +164,8 @@ namespace hex::plugin::builtin { ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 6); ImGui::TableNextColumn(); - - ImGui::UnderlinedText("hex.builtin.welcome.header.start"_lang); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 5_scaled); + ImGui::BeginSubWindow("hex.builtin.welcome.header.start"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); { if (ImGui::IconHyperlink(ICON_VS_NEW_FILE, "hex.builtin.welcome.start.create_file"_lang)) { auto newProvider = hex::ImHexApi::Provider::createProvider("hex.builtin.provider.mem_file", true); @@ -179,20 +180,22 @@ namespace hex::plugin::builtin { EventManager::post("Open Project"); if (ImGui::IconHyperlink(ICON_VS_TELESCOPE, "hex.builtin.welcome.start.open_other"_lang)) ImGui::OpenPopup("hex.builtin.welcome.start.popup.open_other"_lang); - } - ImGui::SetNextWindowPos(ImGui::GetWindowPos() + ImGui::GetCursorPos()); - if (ImGui::BeginPopup("hex.builtin.welcome.start.popup.open_other"_lang)) { + ImGui::SetNextWindowPos(ImGui::GetWindowPos() + ImGui::GetCursorPos()); + if (ImGui::BeginPopup("hex.builtin.welcome.start.popup.open_other"_lang)) { - for (const auto &unlocalizedProviderName : ContentRegistry::Provider::impl::getEntries()) { - if (ImGui::Hyperlink(LangEntry(unlocalizedProviderName))) { - ImHexApi::Provider::createProvider(unlocalizedProviderName); - ImGui::CloseCurrentPopup(); + for (const auto &unlocalizedProviderName : ContentRegistry::Provider::impl::getEntries()) { + if (ImGui::Hyperlink(LangEntry(unlocalizedProviderName))) { + ImHexApi::Provider::createProvider(unlocalizedProviderName); + ImGui::CloseCurrentPopup(); + } } - } - ImGui::EndPopup(); + ImGui::EndPopup(); + } } + ImGui::EndSubWindow(); + // Draw recent entries ImGui::Dummy({}); @@ -210,27 +213,28 @@ namespace hex::plugin::builtin { ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 6); ImGui::TableNextColumn(); - ImGui::UnderlinedText("hex.builtin.welcome.header.help"_lang); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 5_scaled); - ImGui::Dummy({0, 0}); + ImGui::BeginSubWindow("hex.builtin.welcome.header.help"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); { if (ImGui::IconHyperlink(ICON_VS_GITHUB, "hex.builtin.welcome.help.repo"_lang)) hex::openWebpage("hex.builtin.welcome.help.repo.link"_lang); if (ImGui::IconHyperlink(ICON_VS_ORGANIZATION, "hex.builtin.welcome.help.gethelp"_lang)) hex::openWebpage("hex.builtin.welcome.help.gethelp.link"_lang); if (ImGui::IconHyperlink(ICON_VS_COMMENT_DISCUSSION, "hex.builtin.welcome.help.discord"_lang)) hex::openWebpage("hex.builtin.welcome.help.discord.link"_lang); } + ImGui::EndSubWindow(); ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); ImGui::TableNextColumn(); - ImGui::UnderlinedText("hex.builtin.welcome.header.plugins"_lang); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); + ImGui::BeginSubWindow("hex.builtin.welcome.header.plugins"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); { const auto &plugins = PluginManager::getPlugins(); if (!plugins.empty()) { - if (ImGui::BeginTable("plugins", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2((ImGui::GetContentRegionAvail().x * 5) / 6, ImGui::GetTextLineHeightWithSpacing() * 5))) { + if (ImGui::BeginTable("plugins", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 5))) { ImGui::TableSetupScrollFreeze(0, 1); ImGui::TableSetupColumn("hex.builtin.welcome.plugins.plugin"_lang, ImGuiTableColumnFlags_WidthStretch, 0.2); ImGui::TableSetupColumn("hex.builtin.welcome.plugins.author"_lang, ImGuiTableColumnFlags_WidthStretch, 0.2); - ImGui::TableSetupColumn("hex.builtin.welcome.plugins.desc"_lang, ImGuiTableColumnFlags_WidthStretch, 0.6); + ImGui::TableSetupColumn("hex.builtin.welcome.plugins.desc"_lang, ImGuiTableColumnFlags_WidthStretch, 0.5); ImGui::TableSetupColumn("##loaded", ImGuiTableColumnFlags_WidthFixed, ImGui::GetTextLineHeight()); ImGui::TableHeadersRow(); @@ -260,6 +264,8 @@ namespace hex::plugin::builtin { } } } + ImGui::EndSubWindow(); + ImGui::PopStyleVar(); ImGui::EndTable(); } @@ -267,36 +273,42 @@ namespace hex::plugin::builtin { if (ImGui::BeginTable("Welcome Right", 1, ImGuiTableFlags_NoBordersInBody, ImVec2(availableSpace.x / 2, 0))) { ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); ImGui::TableNextColumn(); - ImGui::UnderlinedText("hex.builtin.welcome.header.customize"_lang); + + auto windowPadding = ImGui::GetStyle().WindowPadding.x * 3; + + ImGui::BeginSubWindow("hex.builtin.welcome.header.customize"_lang, ImVec2(ImGui::GetContentRegionAvail().x - windowPadding, 0), ImGuiChildFlags_AutoResizeX); { - if (ImGui::DescriptionButton("hex.builtin.welcome.customize.settings.title"_lang, "hex.builtin.welcome.customize.settings.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x * 0.8F, 0))) + if (ImGui::DescriptionButton("hex.builtin.welcome.customize.settings.title"_lang, "hex.builtin.welcome.customize.settings.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) EventManager::post("Settings"); } + ImGui::EndSubWindow(); ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); ImGui::TableNextColumn(); - ImGui::UnderlinedText("hex.builtin.welcome.header.learn"_lang); + ImGui::BeginSubWindow("hex.builtin.welcome.header.learn"_lang, ImVec2(ImGui::GetContentRegionAvail().x - windowPadding, 0), ImGuiChildFlags_AutoResizeX); { - if (ImGui::DescriptionButton("hex.builtin.welcome.learn.latest.title"_lang, "hex.builtin.welcome.learn.latest.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x * 0.8F, 0))) + if (ImGui::DescriptionButton("hex.builtin.welcome.learn.latest.title"_lang, "hex.builtin.welcome.learn.latest.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) hex::openWebpage("hex.builtin.welcome.learn.latest.link"_lang); - if (ImGui::DescriptionButton("hex.builtin.welcome.learn.imhex.title"_lang, "hex.builtin.welcome.learn.imhex.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x * 0.8F, 0))) { + if (ImGui::DescriptionButton("hex.builtin.welcome.learn.imhex.title"_lang, "hex.builtin.welcome.learn.imhex.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) { AchievementManager::unlockAchievement("hex.builtin.achievement.starting_out", "hex.builtin.achievement.starting_out.docs.name"); hex::openWebpage("hex.builtin.welcome.learn.imhex.link"_lang); } - if (ImGui::DescriptionButton("hex.builtin.welcome.learn.pattern.title"_lang, "hex.builtin.welcome.learn.pattern.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x * 0.8F, 0))) + if (ImGui::DescriptionButton("hex.builtin.welcome.learn.pattern.title"_lang, "hex.builtin.welcome.learn.pattern.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) hex::openWebpage("hex.builtin.welcome.learn.pattern.link"_lang); - if (ImGui::DescriptionButton("hex.builtin.welcome.learn.plugins.title"_lang, "hex.builtin.welcome.learn.plugins.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x * 0.8F, 0))) + if (ImGui::DescriptionButton("hex.builtin.welcome.learn.plugins.title"_lang, "hex.builtin.welcome.learn.plugins.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) hex::openWebpage("hex.builtin.welcome.learn.plugins.link"_lang); } + ImGui::EndSubWindow(); auto extraWelcomeScreenEntries = ContentRegistry::Interface::impl::getWelcomeScreenEntries(); if (!extraWelcomeScreenEntries.empty()) { ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); ImGui::TableNextColumn(); - ImGui::UnderlinedText("hex.builtin.welcome.header.various"_lang); + ImGui::BeginSubWindow("hex.builtin.welcome.header.various"_lang, ImVec2(ImGui::GetContentRegionAvail().x - windowPadding, 0)); { for (const auto &callback : extraWelcomeScreenEntries) callback(); } + ImGui::EndSubWindow(); }