#pragma once #include #include #include #include // Generic helper for constructing separator rows in menu item vectors. // The item type must have an `action`, an `isSeparator`, and either a `labelId` or `nameId` member. template inline ItemType makeSeparatorMenuItem(StrId labelId) { ItemType item{}; if constexpr (std::is_member_object_pointer_v) { item.action = static_cast(0); } if constexpr (std::is_member_object_pointer_v) { item.labelId = labelId; } else if constexpr (std::is_member_object_pointer_v) { item.nameId = labelId; } else { static_assert(sizeof(ItemType) == 0, "makeSeparatorMenuItem requires ItemType with labelId or nameId member"); } item.isSeparator = true; return item; } // Generic helper for creating a selectable predicate for menu lists. // The item type must have an `isSeparator` member. template inline std::function makeSelectablePredicate(const std::vector& items) { return [&items](int index) { return index >= 0 && index < static_cast(items.size()) && !items[index].isSeparator; }; } template inline std::function makeSelectablePredicate(const std::vector& items, int indexOffset, bool firstIndexSelectable) { return [&items, indexOffset, firstIndexSelectable](int index) { if (firstIndexSelectable && index == 0) { return true; } const int itemIndex = index - indexOffset; return itemIndex >= 0 && itemIndex < static_cast(items.size()) && !items[itemIndex].isSeparator; }; }