menu.hpp (1202B)
1 #pragma once 2 3 #include <functional> 4 #include "rack.hpp" 5 6 using namespace rack; 7 8 namespace bogaudio { 9 10 struct OptionMenuItem : MenuItem { 11 std::function<bool()> _check; 12 std::function<void()> _set; 13 14 OptionMenuItem(const char* label, std::function<bool()> check, std::function<void()> set) 15 : _check(check) 16 , _set(set) 17 { 18 this->text = label; 19 } 20 21 void onAction(const event::Action& e) override { 22 _set(); 23 } 24 25 void step() override { 26 MenuItem::step(); 27 rightText = _check() ? "✔" : ""; 28 } 29 }; 30 31 struct BoolOptionMenuItem : OptionMenuItem { 32 BoolOptionMenuItem(const char* label, std::function<bool*()> get) 33 : OptionMenuItem(label, [=]() { return *(get()); }, [=]() { bool* b = get(); *b = !*b; }) 34 {} 35 }; 36 37 struct SpacerOptionMenuItem : OptionMenuItem { 38 SpacerOptionMenuItem() 39 : OptionMenuItem("<spacer>", []() { return false; }, []() {}) 40 {} 41 }; 42 43 struct OptionsMenuItem : MenuItem { 44 std::vector<OptionMenuItem> _items; 45 46 OptionsMenuItem(const char* label) { 47 this->text = label; 48 this->rightText = "▸"; 49 } 50 51 void addItem(const OptionMenuItem& item); 52 void addSpacer(); 53 Menu* createChildMenu() override; 54 static void addToMenu(OptionsMenuItem* item, Menu* menu); 55 }; 56 57 } // namespace bogaudio