From 56c4f2aa478458e42fedd4d23fc36778a83a12e8 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 17 Jan 2025 23:12:09 +0100 Subject: [PATCH] fix: ID collision with multiple banners on screen --- main/gui/source/window/window.cpp | 52 ++++++++++++++----------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/main/gui/source/window/window.cpp b/main/gui/source/window/window.cpp index aab7c20dc..ea89d4061 100644 --- a/main/gui/source/window/window.cpp +++ b/main/gui/source/window/window.cpp @@ -571,36 +571,32 @@ namespace hex { #endif for (const auto &banner : impl::BannerBase::getOpenBanners() | std::views::take(5)) { - ImGui::PushID(banner.get()); - { - auto &style = ImGui::GetStyle(); - ImGui::SetNextWindowPos(ImVec2(windowPos.x + 1_scaled, startY)); - ImGui::SetNextWindowSize(ImVec2(ImHexApi::System::getMainWindowSize().x - 2_scaled, height)); - ImGui::PushStyleColor(ImGuiCol_WindowBg, banner->getColor().Value); - auto prevShadowOffset = style.WindowShadowOffsetDist; - auto prevShadowAngle = style.WindowShadowOffsetAngle; - style.WindowShadowOffsetDist = 12_scaled; - style.WindowShadowOffsetAngle = 0.5 * std::numbers::pi; - ON_SCOPE_EXIT { - style.WindowShadowOffsetDist = prevShadowOffset; - style.WindowShadowOffsetAngle = prevShadowAngle; - }; - if (ImGui::Begin("##Banner", nullptr, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing)) { - if (ImGui::BeginChild("##Content", ImGui::GetContentRegionAvail() - ImVec2(20_scaled, 0))) { - banner->draw(); - } - ImGui::EndChild(); - - ImGui::SameLine(); - - if (ImGui::CloseButton(ImGui::GetID("BannerCloseButton"), ImGui::GetCursorScreenPos())) { - banner->close(); - } + auto &style = ImGui::GetStyle(); + ImGui::SetNextWindowPos(ImVec2(windowPos.x + 1_scaled, startY)); + ImGui::SetNextWindowSize(ImVec2(ImHexApi::System::getMainWindowSize().x - 2_scaled, height)); + ImGui::PushStyleColor(ImGuiCol_WindowBg, banner->getColor().Value); + auto prevShadowOffset = style.WindowShadowOffsetDist; + auto prevShadowAngle = style.WindowShadowOffsetAngle; + style.WindowShadowOffsetDist = 12_scaled; + style.WindowShadowOffsetAngle = 0.5 * std::numbers::pi; + ON_SCOPE_EXIT { + style.WindowShadowOffsetDist = prevShadowOffset; + style.WindowShadowOffsetAngle = prevShadowAngle; + }; + if (ImGui::Begin(fmt::format("##Banner{}", static_cast(banner.get())).c_str(), nullptr, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing)) { + if (ImGui::BeginChild("##Content", ImGui::GetContentRegionAvail() - ImVec2(20_scaled, 0))) { + banner->draw(); + } + ImGui::EndChild(); + + ImGui::SameLine(); + + if (ImGui::CloseButton(ImGui::GetID("BannerCloseButton"), ImGui::GetCursorScreenPos())) { + banner->close(); } - ImGui::End(); - ImGui::PopStyleColor(); } - ImGui::PopID(); + ImGui::End(); + ImGui::PopStyleColor(); startY += height; }