diff --git a/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h b/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h index 3cf92abad..b57ea0653 100644 --- a/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h +++ b/lib/libimhex/include/hex/ui/imgui_imhex_extensions.h @@ -269,6 +269,9 @@ namespace ImGui { bool BeginBox(); void EndBox(); + void BeginSubWindow(const char *label, ImVec2 size = ImVec2(0, 0)); + void EndSubWindow(); + template constexpr ImGuiDataType getImGuiDataType() { if constexpr (std::same_as) return ImGuiDataType_U8; diff --git a/lib/libimhex/source/ui/imgui_imhex_extensions.cpp b/lib/libimhex/source/ui/imgui_imhex_extensions.cpp index 19f68da1c..9b1ddda04 100644 --- a/lib/libimhex/source/ui/imgui_imhex_extensions.cpp +++ b/lib/libimhex/source/ui/imgui_imhex_extensions.cpp @@ -834,4 +834,21 @@ namespace ImGui { ImGui::PopStyleVar(); } + void BeginSubWindow(const char *label, ImVec2 size) { + 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 (hasMenuBar && ImGui::BeginMenuBar()) { + ImGui::TextUnformatted(label); + ImGui::EndMenuBar(); + } + } + } + + void EndSubWindow() { + ImGui::EndChild(); + ImGui::PopStyleVar(); + } + } \ No newline at end of file diff --git a/plugins/builtin/source/content/settings_entries.cpp b/plugins/builtin/source/content/settings_entries.cpp index d40215fa0..6fe533936 100644 --- a/plugins/builtin/source/content/settings_entries.cpp +++ b/plugins/builtin/source/content/settings_entries.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -86,7 +87,7 @@ namespace hex::plugin::builtin { bool draw(const std::string &) override { bool result = false; - if (!ImGui::BeginListBox("", ImVec2(-38, -10))) { + if (!ImGui::BeginListBox("", ImVec2(-40_scaled, 280_scaled))) { return false; } else { for (size_t n = 0; n < this->m_paths.size(); n++) { diff --git a/plugins/builtin/source/content/views/view_settings.cpp b/plugins/builtin/source/content/views/view_settings.cpp index a91abdcd9..6d72c8eaa 100644 --- a/plugins/builtin/source/content/views/view_settings.cpp +++ b/plugins/builtin/source/content/views/view_settings.cpp @@ -53,8 +53,6 @@ namespace hex::plugin::builtin { ImGui::NewLine(); } - bool firstSubCategory = true; - // Draw all settings of that category for (auto &subCategory : category.subCategories) { @@ -62,15 +60,13 @@ namespace hex::plugin::builtin { if (subCategory.entries.empty()) continue; - if (!subCategory.unlocalizedName.empty()) - ImGui::Header(LangEntry(subCategory.unlocalizedName), firstSubCategory); - - firstSubCategory = false; - - if (ImGui::BeginBox()) { + ImGui::BeginSubWindow(LangEntry(subCategory.unlocalizedName)); + { for (auto &setting : subCategory.entries) { ImGui::BeginDisabled(!setting.widget->isEnabled()); + ImGui::PushItemWidth(-200_scaled); bool settingChanged = setting.widget->draw(LangEntry(setting.unlocalizedName)); + ImGui::PopItemWidth(); ImGui::EndDisabled(); if (auto tooltip = setting.widget->getTooltip(); tooltip.has_value() && ImGui::IsItemHovered()) @@ -98,8 +94,8 @@ namespace hex::plugin::builtin { } } - ImGui::EndBox(); } + ImGui::EndSubWindow(); }