diff --git a/src/olympic/studio/modlib/include/studio/imguiutil.hpp b/src/olympic/studio/modlib/include/studio/imguiutil.hpp index 0f71da88..32855a63 100644 --- a/src/olympic/studio/modlib/include/studio/imguiutil.hpp +++ b/src/olympic/studio/modlib/include/studio/imguiutil.hpp @@ -225,6 +225,18 @@ PopupResponse PopupControlsOkCancel( [[nodiscard]] bool BeginPopup(turbine::Context &ctx, ox::CStringViewCR popupName, bool &show, ImVec2 const&sz = {285, 0}); +/** + * + * @param lbl + * @param list + * @param selectedIdx + * @return true if new value selected, false otherwise + */ +bool ComboBox( + ox::CStringView lbl, + ox::SpanView list, + size_t &selectedIdx) noexcept; + /** * * @param lbl diff --git a/src/olympic/studio/modlib/src/imguiutil.cpp b/src/olympic/studio/modlib/src/imguiutil.cpp index 12549785..4935dc8e 100644 --- a/src/olympic/studio/modlib/src/imguiutil.cpp +++ b/src/olympic/studio/modlib/src/imguiutil.cpp @@ -90,6 +90,25 @@ bool BeginPopup(turbine::Context &ctx, ox::CStringViewCR popupName, bool &show, return ImGui::BeginPopupModal(popupName.c_str(), &show, modalFlags); } +bool ComboBox( + ox::CStringView lbl, + ox::SpanView list, + size_t &selectedIdx) noexcept { + bool out{}; + auto const first = selectedIdx < list.size() ? list[selectedIdx].c_str() : ""; + if (ImGui::BeginCombo(lbl.c_str(), first, 0)) { + for (auto i = 0u; i < list.size(); ++i) { + const auto selected = (selectedIdx == i); + if (ImGui::Selectable(list[i].c_str(), selected) && selectedIdx != i) { + selectedIdx = i; + out = true; + } + } + ImGui::EndCombo(); + } + return out; +} + bool ComboBox( ox::CStringView lbl, ox::Span list,