Suppose you need to add a setting with 3 modes to your context menu. Here’s what I do, so I’m posting it here for others’ reference.
In MyModule
:
int mode = 0;
...
void onReset() override {
mode = 0;
}
void onRandomize() override {
// It's usually not a good idea to randomize modes, because
// users might not know how to switch back, but I'm including
// this for completeness.
mode = random::u32() % 3;
}
...
json_t* dataToJson() override {
json_t* rootJ = json_object();
json_object_set_new(rootJ, "mode", json_integer(mode));
return rootJ;
}
void dataFromJson(json_t* rootJ) override {
json_t* modeJ = json_object_get(rootJ, "mode");
if (modeJ)
mode = json_integer_value(modeJ);
}
In MyModuleWidget
:
void appendContextMenu(Menu* menu) override {
MyModule* module = dynamic_cast<MyModule*>(this->module);
menu->addChild(new MenuEntry);
menu->addChild(createMenuLabel("Mode"));
struct ModeItem : MenuItem {
MyModule* module;
int mode;
void onAction(const event::Action& e) override {
module->mode = mode;
}
};
std::string modeNames[3] = {"Mode 1", "Mode 2", "Mode 3"};
for (int i = 0; i < 3; i++) {
ModeItem* modeItem = createMenuItem<ModeItem>(modeNames[i]);
modeItem->rightText = CHECKMARK(module->mode == i);
modeItem->module = module;
modeItem->mode = i;
menu->addChild(modeItem);
}
}
Result: