diff --git a/src/Elements.cpp b/src/Elements.cpp index 9a694b0..879bdc5 100644 --- a/src/Elements.cpp +++ b/src/Elements.cpp @@ -288,19 +288,6 @@ struct Elements : Module { }; -struct ElementsModalItem : MenuItem { - Elements* elements; - int model; - void onAction(const event::Action& e) override { - elements->setModel(model); - } - void step() override { - rightText = CHECKMARK(elements->getModel() == model); - MenuItem::step(); - } -}; - - struct ElementsWidget : ModuleWidget { ElementsWidget(Elements* module) { setModule(module); @@ -380,15 +367,25 @@ struct ElementsWidget : ModuleWidget { } void appendContextMenu(Menu* menu) override { - Elements* elements = dynamic_cast(module); - assert(elements); + Elements* module = dynamic_cast(this->module); + assert(module); menu->addChild(new MenuSeparator); - menu->addChild(construct(&MenuLabel::text, "Alternative models")); - menu->addChild(construct(&MenuItem::text, "Original", &ElementsModalItem::elements, elements, &ElementsModalItem::model, 0)); - menu->addChild(construct(&MenuItem::text, "Non-linear string", &ElementsModalItem::elements, elements, &ElementsModalItem::model, 1)); - menu->addChild(construct(&MenuItem::text, "Chords", &ElementsModalItem::elements, elements, &ElementsModalItem::model, 2)); - menu->addChild(construct(&MenuItem::text, "Ominous voice", &ElementsModalItem::elements, elements, &ElementsModalItem::model, -1)); + + menu->addChild(createMenuLabel("Models")); + + static const std::vector modelLabels = { + "Original", + "Non-linear string", + "Chords", + "Ominous voice", + }; + for (int i = 0; i < 4; i++) { + menu->addChild(createCheckMenuItem(modelLabels[i], + [=]() {return module->getModel() == i;}, + [=]() {module->setModel(i);} + )); + } } }; diff --git a/src/Rings.cpp b/src/Rings.cpp index bb6fc86..4a3522a 100644 --- a/src/Rings.cpp +++ b/src/Rings.cpp @@ -290,43 +290,34 @@ struct RingsWidget : ModuleWidget { } void appendContextMenu(Menu* menu) override { - Rings* rings = dynamic_cast(module); - assert(rings); - - struct RingsModelItem : MenuItem { - Rings* rings; - rings::ResonatorModel model; - void onAction(const event::Action& e) override { - rings->resonatorModel = model; - } - void step() override { - rightText = (rings->resonatorModel == model) ? "✔" : ""; - MenuItem::step(); - } - }; + Rings* module = dynamic_cast(this->module); + assert(module); - struct RingsEasterEggItem : MenuItem { - Rings* rings; - void onAction(const event::Action& e) override { - rings->easterEgg = !rings->easterEgg; - } - void step() override { - rightText = (rings->easterEgg) ? "✔" : ""; - MenuItem::step(); - } + menu->addChild(new MenuSeparator); + + menu->addChild(createMenuLabel("Resonator")); + + static const std::vector modelLabels = { + "Modal resonator", + "Sympathetic strings", + "Modulated/inharmonic string", + "FM voice", + "Quantized sympathetic strings", + "Reverb string", }; + for (int i = 0; i < 6; i++) { + menu->addChild(createCheckMenuItem(modelLabels[i], + [=]() {return module->resonatorModel == i;}, + [=]() {module->resonatorModel = (rings::ResonatorModel) i;} + )); + } menu->addChild(new MenuSeparator); - menu->addChild(construct(&MenuLabel::text, "Resonator")); - menu->addChild(construct(&MenuItem::text, "Modal resonator", &RingsModelItem::rings, rings, &RingsModelItem::model, rings::RESONATOR_MODEL_MODAL)); - menu->addChild(construct(&MenuItem::text, "Sympathetic strings", &RingsModelItem::rings, rings, &RingsModelItem::model, rings::RESONATOR_MODEL_SYMPATHETIC_STRING)); - menu->addChild(construct(&MenuItem::text, "Modulated/inharmonic string", &RingsModelItem::rings, rings, &RingsModelItem::model, rings::RESONATOR_MODEL_STRING)); - menu->addChild(construct(&MenuItem::text, "FM voice", &RingsModelItem::rings, rings, &RingsModelItem::model, rings::RESONATOR_MODEL_FM_VOICE)); - menu->addChild(construct(&MenuItem::text, "Quantized sympathetic strings", &RingsModelItem::rings, rings, &RingsModelItem::model, rings::RESONATOR_MODEL_SYMPATHETIC_STRING_QUANTIZED)); - menu->addChild(construct(&MenuItem::text, "Reverb string", &RingsModelItem::rings, rings, &RingsModelItem::model, rings::RESONATOR_MODEL_STRING_AND_REVERB)); - menu->addChild(new MenuSeparator); - menu->addChild(construct(&MenuItem::text, "Disastrous Peace", &RingsEasterEggItem::rings, rings)); + menu->addChild(createBoolMenuItem("Disastrous Peace", + [=]() {return module->easterEgg;}, + [=](bool val) {module->easterEgg = val;} + )); } };