From e5f36ca08dd878d683a4796c3e2eb79cdc30e082 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sat, 25 Nov 2023 00:43:03 +0100 Subject: [PATCH] impr: Greatly improve UI of about page --- .../include/content/views/view_about.hpp | 4 +- .../romfs/assets/common/donation/github.png | Bin 0 -> 3656 bytes .../romfs/assets/common/donation/patreon.png | Bin 0 -> 11390 bytes .../romfs/assets/common/donation/paypal.png | Bin 0 -> 8274 bytes .../source/content/views/view_about.cpp | 473 +++++++++++------- 5 files changed, 291 insertions(+), 186 deletions(-) create mode 100644 plugins/builtin/romfs/assets/common/donation/github.png create mode 100644 plugins/builtin/romfs/assets/common/donation/patreon.png create mode 100644 plugins/builtin/romfs/assets/common/donation/paypal.png diff --git a/plugins/builtin/include/content/views/view_about.hpp b/plugins/builtin/include/content/views/view_about.hpp index 942f0edfd..8ed4f1c68 100644 --- a/plugins/builtin/include/content/views/view_about.hpp +++ b/plugins/builtin/include/content/views/view_about.hpp @@ -17,8 +17,8 @@ namespace hex::plugin::builtin { [[nodiscard]] bool shouldDraw() const override { return true; } [[nodiscard]] bool hasViewMenuItemEntry() const override { return false; } - [[nodiscard]] ImVec2 getMinSize() const override { - return scaled({ 700, 400 }); + [[nodiscard]] ImGuiWindowFlags getWindowFlags() const override { + return ImGuiWindowFlags_AlwaysAutoResize; } private: diff --git a/plugins/builtin/romfs/assets/common/donation/github.png b/plugins/builtin/romfs/assets/common/donation/github.png new file mode 100644 index 0000000000000000000000000000000000000000..bae6e9e3b2f3d655ed066a1cd112306c35cb262c GIT binary patch literal 3656 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.isValid()) this->m_logoTexture = ImGuiExt::Texture(romfs::get("assets/common/logo.png").span()); - ImGui::Image(this->m_logoTexture, scaled({ 64, 64 })); + ImGui::Image(this->m_logoTexture, scaled({ 100, 100 })); if (ImGui::IsItemHovered() && ImGui::IsItemClicked()) { this->m_clickCount += 1; } ImGui::TableNextColumn(); - // Draw basic information about ImHex and its version - ImGuiExt::TextFormatted("ImHex Hex Editor v{} by WerWolv " ICON_FA_CODE_BRANCH, ImHexApi::System::getImHexVersion()); + ImGuiExt::BeginSubWindow("Build Information", ImVec2(0, 0), ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY); + { + if (ImGui::BeginTable("Information", 1, ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersInner)) { + ImGui::TableNextRow(); - ImGui::SameLine(); + ImGui::TableNextColumn(); + { + // Draw basic information about ImHex and its version + ImGuiExt::TextFormatted("ImHex Hex Editor v{} by WerWolv " ICON_FA_CODE_BRANCH, ImHexApi::System::getImHexVersion()); - // Draw a clickable link to the current commit - if (ImGuiExt::Hyperlink(hex::format("{0}@{1}", ImHexApi::System::getCommitBranch(), ImHexApi::System::getCommitHash()).c_str())) - hex::openWebpage("https://github.com/WerWolv/ImHex/commit/" + ImHexApi::System::getCommitHash(true)); + ImGui::SameLine(); - // Draw the build date and time - ImGuiExt::TextFormatted("{}, {}", __DATE__, __TIME__); + // Draw a clickable link to the current commit + if (ImGuiExt::Hyperlink(hex::format("{0}@{1}", ImHexApi::System::getCommitBranch(), ImHexApi::System::getCommitHash()).c_str())) + hex::openWebpage("https://github.com/WerWolv/ImHex/commit/" + ImHexApi::System::getCommitHash(true)); + } - // Draw the author of the current translation - ImGui::TextUnformatted("hex.builtin.view.help.about.translator"_lang); + ImGui::TableNextColumn(); + { + // Draw the build date and time + ImGuiExt::TextFormatted("Compiled on {} at {}", __DATE__, __TIME__); + } - // Draw information about the open-source nature of ImHex - ImGui::TextUnformatted("hex.builtin.view.help.about.source"_lang); + ImGui::TableNextColumn(); + { + // Draw the author of the current translation + ImGui::TextUnformatted("hex.builtin.view.help.about.translator"_lang); + } - ImGui::SameLine(); + ImGui::TableNextColumn(); + { + // Draw information about the open-source nature of ImHex + ImGui::TextUnformatted("hex.builtin.view.help.about.source"_lang); - // Draw a clickable link to the GitHub repository - if (ImGuiExt::Hyperlink("WerWolv/ImHex")) - hex::openWebpage("https://github.com/WerWolv/ImHex"); + ImGui::SameLine(); + + // Draw a clickable link to the GitHub repository + if (ImGuiExt::Hyperlink("WerWolv/ImHex")) + hex::openWebpage("https://github.com/WerWolv/ImHex"); + } + ImGui::EndTable(); + } + } + ImGuiExt::EndSubWindow(); ImGui::EndTable(); } - ImGui::NewLine(); - // Draw donation links - ImGui::TextUnformatted("hex.builtin.view.help.about.donations"_lang); - ImGui::Separator(); - - constexpr std::array Links = { "https://werwolv.net/donate", "https://www.patreon.com/werwolv", "https://github.com/sponsors/WerWolv" }; + ImGuiExt::Header("hex.builtin.view.help.about.donations"_lang); ImGuiExt::TextFormattedWrapped("{}", static_cast("hex.builtin.view.help.about.thanks"_lang)); ImGui::NewLine(); - for (auto &link : Links) { - if (ImGuiExt::Hyperlink(link)) - hex::openWebpage(link); - } - } + struct DonationPage { + ImGuiExt::Texture texture; + const char *link; + }; - void ViewAbout::drawContributorPage() { - ImGuiExt::TextFormattedWrapped("These amazing people have contributed to ImHex in the past. If you'd like to become part of them, please submit a PR to the GitHub Repository!"); - ImGui::NewLine(); - - // Draw main ImHex contributors - link("iTrooz for a huge amount of help maintaining ImHex and the CI", "", "https://github.com/iTrooz"); - link("jumanji144 for a ton of help with the Pattern Language, API and usage stats", "", "https://github.com/Nowilltolife"); + static std::array DonationPages = { + DonationPage { ImGuiExt::Texture(romfs::get("assets/common/donation/paypal.png").span()), "https://werwolv.net/donate" }, + DonationPage { ImGuiExt::Texture(romfs::get("assets/common/donation/github.png").span()), "https://github.com/sponsors/WerWolv" }, + DonationPage { ImGuiExt::Texture(romfs::get("assets/common/donation/patreon.png").span()), "https://patreon.com/werwolv" }, + }; ImGui::NewLine(); + if (ImGui::BeginTable("DonationLinks", 5, ImGuiTableFlags_SizingStretchSame, ImGui::GetContentRegionAvail())) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); - // Draw additional contributors - link("Mary for porting ImHex to MacOS", "", "https://github.com/marysaka"); - link("Roblabla for adding the MSI Windows installer", "", "https://github.com/roblabla"); - link("jam1garner for adding support for Rust plugins", "", "https://github.com/jam1garner"); + for (const auto &page : DonationPages) { + ImGui::TableNextColumn(); - ImGui::NewLine(); + const auto size = page.texture.getSize() / 1.5F; + const auto startPos = ImGui::GetCursorScreenPos(); + ImGui::Image(page.texture, page.texture.getSize() / 1.5F); - link("All other amazing contributors", "", "https://github.com/WerWolv/ImHex/graphs/contributors/"); - } - - void ViewAbout::drawLibraryCreditsPage() { - ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.2F, 0.2F, 0.2F, 0.3F)); - - // Draw ImGui dependencies - link("ImGui", "ocornut", "https://github.com/ocornut/imgui/"); - link("imgui_club", "ocornut", "https://github.com/ocornut/imgui_club/"); - link("imnodes", "Nelarius", "https://github.com/Nelarius/imnodes/"); - link("ImGuiColorTextEdit", "BalazsJako", "https://github.com/BalazsJako/ImGuiColorTextEdit/"); - link("ImPlot", "epezent", "https://github.com/epezent/implot/"); - - ImGui::NewLine(); - - // Draw dependencies maintained by individual people - link("capstone", "aquynh", "https://github.com/aquynh/capstone/"); - link("JSON for Modern C++", "nlohmann", "https://github.com/nlohmann/json/"); - link("YARA", "VirusTotal", "https://github.com/VirusTotal/yara/"); - link("Native File Dialog Extended", "btzy and mlabbe", "https://github.com/btzy/nativefiledialog-extended/"); - link("libromfs", "WerWolv", "https://github.com/WerWolv/libromfs/"); - link("microtar", "rxi", "https://github.com/rxi/microtar/"); - link("xdgpp", "danyspin97", "https://sr.ht/~danyspin97/xdgpp/"); - link("FreeType", "David Turner", "https://gitlab.freedesktop.org/freetype/freetype/"); - link("mbedTLS", "ARM", "https://github.com/ARMmbed/mbedtls/"); - link("libcurl", "Daniel Stenberg", "https://curl.se/"); - link("libfmt", "vitaut", "https://fmt.dev/"); - - ImGui::NewLine(); - - // Draw dependencies maintained by groups - link("GNU libmagic", "", "https://www.darwinsys.com/file/"); - link("GLFW3", "", "https://github.com/glfw/glfw/"); - link("LLVM", "", "https://github.com/llvm/llvm-project/"); - - ImGui::PopStyleColor(); - - ImGui::NewLine(); - } - - void ViewAbout::drawPathsPage() { - if (ImGui::BeginTable("##imhex_paths", 2, ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit)) { - ImGui::TableSetupScrollFreeze(0, 1); - ImGui::TableSetupColumn("Type"); - ImGui::TableSetupColumn("Paths"); - - // Specify the types of paths to display - constexpr static std::array, size_t(fs::ImHexPath::END) - 1U> PathTypes = { - { - { "Patterns", fs::ImHexPath::Patterns }, - { "Patterns Includes", fs::ImHexPath::PatternsInclude }, - { "Magic", fs::ImHexPath::Magic }, - { "Plugins", fs::ImHexPath::Plugins }, - { "Libraries", fs::ImHexPath::Libraries }, - { "Yara Patterns", fs::ImHexPath::Yara }, - { "Config", fs::ImHexPath::Config }, - { "Resources", fs::ImHexPath::Resources }, - { "Constants lists", fs::ImHexPath::Constants }, - { "Custom encodings", fs::ImHexPath::Encodings }, - { "Logs", fs::ImHexPath::Logs }, - { "Recent files", fs::ImHexPath::Recent }, - { "Scripts", fs::ImHexPath::Scripts }, - { "Themes", fs::ImHexPath::Themes }, - { "Data inspector scripts", fs::ImHexPath::Inspectors }, - { "Custom data processor nodes", fs::ImHexPath::Nodes }, + if (ImGui::IsItemHovered()) { + ImGui::GetForegroundDrawList()->AddShadowCircle(startPos + size / 2, size.x / 2, ImGui::GetColorU32(ImGuiCol_Button), 100.0F, ImVec2(), ImDrawFlags_ShadowCutOutShapeBackground); } - }; - // Draw the table - ImGui::TableHeadersRow(); - for (const auto &[name, type] : PathTypes) { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(name); - - ImGui::TableNextColumn(); - for (auto &path : fs::getDefaultPaths(type, true)){ - // Draw hyperlink to paths that exist or red text if they don't - if (wolv::io::fs::isDirectory(path)){ - if (ImGuiExt::Hyperlink(wolv::util::toUTF8String(path).c_str())) { - fs::openFolderExternal(path); - } - } else { - ImGuiExt::TextFormattedColored(ImGuiExt::GetCustomColorVec4(ImGuiCustomCol_ToolbarRed), wolv::util::toUTF8String(path)); - } + if (ImGui::IsItemClicked()) { + hex::openWebpage(page.link); } } @@ -224,6 +144,184 @@ namespace hex::plugin::builtin { } } + void ViewAbout::drawContributorPage() { + struct Contributor { + const char *name; + const char *description; + const char *link; + }; + + constexpr static std::array Contributors = { + Contributor { "iTrooz", "A huge amount of help maintaining ImHex and the CI", "https://github.com/iTrooz" }, + Contributor { "jumanji144", "A ton of help with the Pattern Language, API and usage stats", "https://github.com/Nowilltolife" }, + Contributor { "Mary", "Porting ImHex to macOS originally", "https://github.com/marysaka" }, + Contributor { "Roblabla", "Adding the MSI Windows installer", "https://github.com/roblabla" }, + Contributor { "jam1garner", "Adding support for Rust plugins", "https://github.com/jam1garner" }, + Contributor { "All other amazing contributors", "Being part of the community, opening issues, PRs and donating", "https://github.com/WerWolv/ImHex/graphs/contributors" } + }; + + ImGuiExt::TextFormattedWrapped("These amazing people have contributed some incredible things to ImHex in the past.\nConsider opening a PR on the Git Repository to become a part of them!"); + ImGui::NewLine(); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2()); + ImGuiExt::BeginSubWindow("Contributors", ImVec2(ImGui::GetContentRegionAvail().x, 0), ImGuiChildFlags_AutoResizeX); + { + if (ImGui::BeginTable("Contributors", 1, ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders)) { + for (const auto &contributor : Contributors) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + + if (contributor.name == nullptr) { + ImGui::Separator(); + continue; + } + + if (ImGuiExt::Hyperlink(contributor.name)) + hex::openWebpage(contributor.link); + + ImGui::Indent(); + ImGui::TextUnformatted(contributor.description); + ImGui::Unindent(); + } + + ImGui::EndTable(); + } + } + ImGuiExt::EndSubWindow(); + ImGui::PopStyleVar(); + } + + void ViewAbout::drawLibraryCreditsPage() { + + struct Library { + const char *name; + const char *author; + const char *link; + }; + + constexpr static std::array ImGuiLibraries = { + Library { "ImGui", "ocornut", "https://github.com/ocornut/imgui" }, + Library { "ImPlot", "epezent", "https://github.com/epezent/implot" }, + Library { "imnodes", "Nelarius", "https://github.com/Nelarius/imnodes" }, + Library { "ImGuiColorTextEdit", "BalazsJako", "https://github.com/BalazsJako/ImGuiColorTextEdit" }, + + }; + + constexpr static std::array ExternalLibraries = { + Library { "PatternLanguage", "WerWolv", "https://github.com/WerWolv/PatternLanguage" }, + Library { "libwolv", "WerWolv", "https://github.com/WerWolv/libwolv" }, + Library { "libromfs", "WerWolv", "https://github.com/WerWolv/libromfs" }, + }; + + constexpr static std::array ThirdPartyLibraries = { + Library { "capstone", "aquynh", "https://github.com/aquynh/capstone" }, + Library { "json", "nlohmann", "https://github.com/nlohmann/json" }, + Library { "yara", "VirusTotal", "https://github.com/VirusTotal/yara" }, + Library { "nativefiledialog-extended", "btzy", "https://github.com/btzy/nativefiledialog-extended" }, + Library { "microtar", "rxi", "https://github.com/rxi/microtar" }, + Library { "xdgpp", "danyspin97", "https://sr.ht/~danyspin97/xdgpp" }, + Library { "freetype", "freetype", "https://gitlab.freedesktop.org/freetype/freetype" }, + Library { "mbedTLS", "ARMmbed", "https://github.com/ARMmbed/mbedtls" }, + Library { "curl", "curl", "https://github.com/curl/curl" }, + Library { "fmt", "fmtlib", "https://github.com/fmtlib/fmt" }, + Library { "file", "file", "https://github.com/file/file" }, + Library { "glfw", "glfw", "https://github.com/glfw/glfw" }, + Library { "llvm", "llvm-project", "https://github.com/llvm/llvm-project" }, + }; + + constexpr static auto drawTable = [](const char *category, const auto &libraries) { + const auto width = ImGui::GetContentRegionAvail().x; + ImGuiExt::BeginSubWindow(category); + { + for (const auto &library : libraries) { + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::GetColorU32(ImGuiCol_TableHeaderBg)); + ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 50); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, scaled({ 12, 3 })); + + if (ImGui::BeginChild(library.link, ImVec2(), ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY)) { + if (ImGuiExt::Hyperlink(hex::format("{}/{}", library.author, library.name).c_str())) { + hex::openWebpage(library.link); + } + } + ImGui::EndChild(); + + ImGui::SameLine(); + if (ImGui::GetCursorPosX() > (width - 200_scaled)) + ImGui::NewLine(); + + ImGui::PopStyleColor(); + ImGui::PopStyleVar(2); + } + } + ImGuiExt::EndSubWindow(); + }; + + ImGuiExt::TextFormattedWrapped("ImHex builds on top of the amazing work of a ton of talented library developers without which this project wouldn't stand."); + ImGui::NewLine(); + + drawTable("ImGui", ImGuiLibraries); + drawTable("External", ExternalLibraries); + drawTable("Third Party", ThirdPartyLibraries); + } + + void ViewAbout::drawPathsPage() { + constexpr static std::array, size_t(fs::ImHexPath::END) - 1U> PathTypes = { + { + { "Patterns", fs::ImHexPath::Patterns }, + { "Patterns Includes", fs::ImHexPath::PatternsInclude }, + { "Magic", fs::ImHexPath::Magic }, + { "Plugins", fs::ImHexPath::Plugins }, + { "Libraries", fs::ImHexPath::Libraries }, + { "Yara Patterns", fs::ImHexPath::Yara }, + { "Config", fs::ImHexPath::Config }, + { "Resources", fs::ImHexPath::Resources }, + { "Constants lists", fs::ImHexPath::Constants }, + { "Custom encodings", fs::ImHexPath::Encodings }, + { "Logs", fs::ImHexPath::Logs }, + { "Recent files", fs::ImHexPath::Recent }, + { "Scripts", fs::ImHexPath::Scripts }, + { "Themes", fs::ImHexPath::Themes }, + { "Data inspector scripts", fs::ImHexPath::Inspectors }, + { "Custom data processor nodes", fs::ImHexPath::Nodes }, + } + }; + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2()); + ImGuiExt::BeginSubWindow("Paths", ImGui::GetContentRegionAvail()); + { + if (ImGui::BeginTable("##imhex_paths", 2, ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit)) { + ImGui::TableSetupScrollFreeze(0, 1); + ImGui::TableSetupColumn("Type"); + ImGui::TableSetupColumn("Paths"); + + // Draw the table + ImGui::TableHeadersRow(); + for (const auto &[name, type] : PathTypes) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(name); + + ImGui::TableNextColumn(); + for (auto &path : fs::getDefaultPaths(type, true)){ + // Draw hyperlink to paths that exist or red text if they don't + if (wolv::io::fs::isDirectory(path)){ + if (ImGuiExt::Hyperlink(wolv::util::toUTF8String(path).c_str())) { + fs::openFolderExternal(path); + } + } else { + ImGuiExt::TextFormattedColored(ImGuiExt::GetCustomColorVec4(ImGuiCustomCol_ToolbarRed), wolv::util::toUTF8String(path)); + } + } + } + + ImGui::EndTable(); + } + } + ImGuiExt::EndSubWindow(); + ImGui::PopStyleVar(); + + } + void ViewAbout::drawReleaseNotesPage() { static std::string releaseTitle; static std::vector releaseNotes; @@ -403,56 +501,63 @@ namespace hex::plugin::builtin { // Draw commits table if (!commits.empty()) { - if (ImGui::BeginTable("##commits", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollY)) { - // Draw commits - for (const auto &commit : commits) { - ImGui::PushID(commit.hash.c_str()); - ImGui::TableNextRow(); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2()); + ImGuiExt::BeginSubWindow("Commits", ImGui::GetContentRegionAvail()); + { - // Draw hover tooltip - ImGui::TableNextColumn(); - if (ImGui::Selectable("##commit", false, ImGuiSelectableFlags_SpanAllColumns)) { - hex::openWebpage(commit.url); - } + if (ImGui::BeginTable("##commits", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollY)) { + // Draw commits + for (const auto &commit : commits) { + ImGui::PushID(commit.hash.c_str()); + ImGui::TableNextRow(); - if (ImGui::IsItemHovered()) { - if (ImGui::BeginTooltip()) { - // Draw author and commit date - ImGuiExt::TextFormattedColored(ImGuiExt::GetCustomColorVec4(ImGuiCustomCol_Highlight), "{}", commit.author); - ImGui::SameLine(); - ImGuiExt::TextFormatted("@ {}", commit.date.c_str()); - - // Draw description if there is one - if (!commit.description.empty()) { - ImGui::Separator(); - ImGuiExt::TextFormatted("{}", commit.description); - } - - ImGui::EndTooltip(); + // Draw hover tooltip + ImGui::TableNextColumn(); + if (ImGui::Selectable("##commit", false, ImGuiSelectableFlags_SpanAllColumns)) { + hex::openWebpage(commit.url); } + if (ImGui::IsItemHovered()) { + if (ImGui::BeginTooltip()) { + // Draw author and commit date + ImGuiExt::TextFormattedColored(ImGuiExt::GetCustomColorVec4(ImGuiCustomCol_Highlight), "{}", commit.author); + ImGui::SameLine(); + ImGuiExt::TextFormatted("@ {}", commit.date.c_str()); + + // Draw description if there is one + if (!commit.description.empty()) { + ImGui::Separator(); + ImGuiExt::TextFormatted("{}", commit.description); + } + + ImGui::EndTooltip(); + } + + } + + // Draw commit hash + ImGui::SameLine(0, 0); + ImGuiExt::TextFormattedColored(ImGuiExt::GetCustomColorVec4(ImGuiCustomCol_Highlight), "{}", commit.hash.substr(0, 7)); + + // Draw the commit message + ImGui::TableNextColumn(); + + const ImColor color = [&]{ + if (commit.hash == ImHexApi::System::getCommitHash(true)) + return ImGui::GetStyleColorVec4(ImGuiCol_HeaderActive); + else + return ImGui::GetStyleColorVec4(ImGuiCol_Text); + }(); + ImGuiExt::TextFormattedColored(color, commit.message); + + ImGui::PopID(); } - // Draw commit hash - ImGui::SameLine(0, 0); - ImGuiExt::TextFormattedColored(ImGuiExt::GetCustomColorVec4(ImGuiCustomCol_Highlight), "{}", commit.hash.substr(0, 7)); - - // Draw the commit message - ImGui::TableNextColumn(); - - const ImColor color = [&]{ - if (commit.hash == ImHexApi::System::getCommitHash(true)) - return ImGui::GetStyleColorVec4(ImGuiCol_HeaderActive); - else - return ImGui::GetStyleColorVec4(ImGuiCol_Text); - }(); - ImGuiExt::TextFormattedColored(color, commit.message); - - ImGui::PopID(); + ImGui::EndTable(); } - - ImGui::EndTable(); } + ImGuiExt::EndSubWindow(); + ImGui::PopStyleVar(); } }