From 698b8eb0b007fe909976e9fefe3e14a4e0103ee6 Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Thu, 3 Jun 2021 19:29:52 -0400 Subject: [PATCH] Use menu item helpers for Streams. --- src/Branches.cpp | 27 ++++++-------- src/Marbles.cpp | 28 +++++++-------- src/Streams.cpp | 92 +++++++++++++++++------------------------------- 3 files changed, 56 insertions(+), 91 deletions(-) diff --git a/src/Branches.cpp b/src/Branches.cpp index eaca6d1..55e6138 100644 --- a/src/Branches.cpp +++ b/src/Branches.cpp @@ -158,26 +158,19 @@ struct BranchesWidget : ModuleWidget { } void appendContextMenu(Menu* menu) override { - Branches* branches = dynamic_cast(module); - assert(branches); - - struct BranchesModeItem : MenuItem { - Branches* branches; - int i; - void onAction(const event::Action& e) override { - branches->modes[i] ^= 1; - } - void step() override { - rightText = branches->modes[i] ? "Latch" : "Toggle"; - MenuItem::step(); - } - }; + Branches* module = dynamic_cast(this->module); menu->addChild(new MenuSeparator); - menu->addChild(construct(&MenuLabel::text, "Channels")); - menu->addChild(construct(&MenuItem::text, "Channel 1 mode", &BranchesModeItem::branches, branches, &BranchesModeItem::i, 0)); - menu->addChild(construct(&MenuItem::text, "Channel 2 mode", &BranchesModeItem::branches, branches, &BranchesModeItem::i, 1)); + menu->addChild(createIndexPtrSubmenuItem("Channel 1 mode", { + "Latch", + "Toggle", + }, &module->modes[0])); + + menu->addChild(createIndexPtrSubmenuItem("Channel 2 mode", { + "Latch", + "Toggle", + }, &module->modes[1])); } }; diff --git a/src/Marbles.cpp b/src/Marbles.cpp index e953ad4..d759c71 100644 --- a/src/Marbles.cpp +++ b/src/Marbles.cpp @@ -591,7 +591,7 @@ struct MarblesWidget : ModuleWidget { menu->addChild(new MenuSeparator); - menu->addChild(createIndexMenuItem(&module->t_mode, "t mode", { + menu->addChild(createIndexPtrSubmenuItem("t mode", { "Complementary Bernoulli", "Clusters", "Drums", @@ -599,43 +599,43 @@ struct MarblesWidget : ModuleWidget { "Divider", "Three states", "Markov", - })); + }, &module->t_mode)); - menu->addChild(createIndexMenuItem(&module->t_range, "t range", { + menu->addChild(createIndexPtrSubmenuItem("t range", { "1/4x", "1x", "4x", - })); + }, &module->t_range)); - menu->addChild(createIndexMenuItem(&module->x_mode, "X mode", { + menu->addChild(createIndexPtrSubmenuItem("X mode", { "Identical", "Bump", "Tilt", - })); + }, &module->x_mode)); - menu->addChild(createIndexMenuItem(&module->x_range, "X range", { + menu->addChild(createIndexPtrSubmenuItem("X range", { "Narrow", "Positive", "Full", - })); + }, &module->x_range)); - menu->addChild(createIndexMenuItem(&module->x_scale, "Scales", { + menu->addChild(createIndexPtrSubmenuItem("Scales", { "Major", "Minor", "Pentatonic", "Pelog", "Raag Bhairav That", "Raag Shri", - })); + }, &module->x_scale)); - menu->addChild(createIndexMenuItem(&module->x_clock_source_internal, "Internal X clock source", { + menu->addChild(createIndexPtrSubmenuItem("Internal X clock source", { "T₁ → X₁, T₂ → X₂, T₃ → X₃", "T₁ → X₁, X₂, X₃", "T₂ → X₁, X₂, X₃", "T₃ → X₁, X₂, X₃", - })); + }, &module->x_clock_source_internal)); - menu->addChild(createIndexMenuItem(&module->y_divider_index, "Y divider ratio", { + menu->addChild(createIndexPtrSubmenuItem("Y divider ratio", { "1/64", "1/48", "1/32", @@ -648,7 +648,7 @@ struct MarblesWidget : ModuleWidget { "1/3", "1/2", "1", - })); + }, &module->y_divider_index)); } }; diff --git a/src/Streams.cpp b/src/Streams.cpp index acbed49..728e5d3 100644 --- a/src/Streams.cpp +++ b/src/Streams.cpp @@ -193,15 +193,26 @@ struct Streams : Module { } } - void toggleLink() { + void setLinked(bool linked) { streams::UiSettings settings = engines[0].ui_settings(); - settings.linked ^= 1; + settings.linked = linked; for (int c = 0; c < PORT_MAX_CHANNELS; c++) { engines[c].ApplySettings(settings); } } + int getChannelMode(int channel) { + streams::UiSettings settings = engines[0].ui_settings(); + // Search channel mode index in table + for (int i = 0; i < streams::kNumChannelModes; i++) { + if (settings.function[channel] == streams::kChannelModeTable[i].function + && settings.alternate[channel] == streams::kChannelModeTable[i].alternate) + return i; + } + return -1; + } + void setChannelMode(int channel, int mode_id) { streams::UiSettings settings = engines[0].ui_settings(); settings.function[channel] = streams::kChannelModeTable[mode_id].function; @@ -326,6 +337,7 @@ struct Streams : Module { } }; + struct StreamsWidget : ModuleWidget { StreamsWidget(Streams* module) { setModule(module); @@ -373,72 +385,32 @@ struct StreamsWidget : ModuleWidget { void appendContextMenu(Menu* menu) override { Streams* module = dynamic_cast(this->module); - struct LinkItem : MenuItem { - Streams* module; - void onAction(const event::Action& e) override { - module->toggleLink(); - } - }; - - struct ChannelModeItem : MenuItem { - Streams* module; - int channel; - int mode; - void onAction(const event::Action& e) override { - module->setChannelMode(channel, mode); - } - }; - - struct MonitorModeItem : MenuItem { - Streams* module; - int mode; - void onAction(const event::Action& e) override { - module->setMonitorMode(mode); - } - }; - menu->addChild(new MenuSeparator); - LinkItem* linkItem = createMenuItem( - "Link channels", CHECKMARK(module->linked())); - linkItem->module = module; - menu->addChild(linkItem); - menu->addChild(new MenuSeparator); - menu->addChild(createMenuLabel("Channel 1")); - for (int i = 0; i < streams::kNumChannelModes; i++) { - auto modeItem = createMenuItem( - streams::kChannelModeTable[i].label, CHECKMARK( - module->function(0) == streams::kChannelModeTable[i].function && - module->alternate(0) == streams::kChannelModeTable[i].alternate)); - modeItem->module = module; - modeItem->channel = 0; - modeItem->mode = i; - menu->addChild(modeItem); - } + menu->addChild(createBoolMenuItem("Link channels", + [=]() {return module->linked();}, + [=](bool val) {module->setLinked(val);} + )); - menu->addChild(new MenuSeparator); - menu->addChild(createMenuLabel("Channel 2")); + std::vector modeLabels; for (int i = 0; i < streams::kNumChannelModes; i++) { - auto modeItem = createMenuItem( - streams::kChannelModeTable[i].label, CHECKMARK( - module->function(1) == streams::kChannelModeTable[i].function && - module->alternate(1) == streams::kChannelModeTable[i].alternate)); - modeItem->module = module; - modeItem->channel = 1; - modeItem->mode = i; - menu->addChild(modeItem); + modeLabels.push_back(streams::kChannelModeTable[i].label); + } + for (int c = 0; c < 2; c++) { + menu->addChild(createIndexSubmenuItem(string::f("Channel %d mode", c + 1), modeLabels, + [=]() {return module->getChannelMode(c);}, + [=](int index) {module->setChannelMode(c, index);} + )); } - menu->addChild(new MenuSeparator); - menu->addChild(createMenuLabel("Meter")); + std::vector meterLabels; for (int i = 0; i < streams::kNumMonitorModes; i++) { - auto modeItem = createMenuItem( - streams::kMonitorModeTable[i].label, CHECKMARK( - module->monitorMode() == streams::kMonitorModeTable[i].mode)); - modeItem->module = module; - modeItem->mode = i; - menu->addChild(modeItem); + meterLabels.push_back(streams::kMonitorModeTable[i].label); } + menu->addChild(createIndexSubmenuItem("Meter", meterLabels, + [=]() {return module->monitorMode();}, + [=](int index) {module->setMonitorMode(index);} + )); } };