Browse Source

Refactor Frames context menu.

pull/114/head
Andrew Belt 3 years ago
parent
commit
5b24a3e2dc
1 changed files with 57 additions and 45 deletions
  1. +57
    -45
      src/Frames.cpp

+ 57
- 45
src/Frames.cpp View File

@@ -331,90 +331,102 @@ struct FramesWidget : ModuleWidget {
} }


void appendContextMenu(Menu* menu) override { void appendContextMenu(Menu* menu) override {
Frames* frames = dynamic_cast<Frames*>(module);
assert(frames);
Frames* module = dynamic_cast<Frames*>(this->module);
assert(module);


struct FramesCurveItem : MenuItem { struct FramesCurveItem : MenuItem {
Frames* frames;
Frames* module;
uint8_t channel; uint8_t channel;
frames::EasingCurve curve; frames::EasingCurve curve;
void onAction(const event::Action& e) override { void onAction(const event::Action& e) override {
frames->keyframer.mutable_settings(channel)->easing_curve = curve;
module->keyframer.mutable_settings(channel)->easing_curve = curve;
} }
void step() override { void step() override {
rightText = (frames->keyframer.mutable_settings(channel)->easing_curve == curve) ? "✔" : "";
rightText = (module->keyframer.mutable_settings(channel)->easing_curve == curve) ? "✔" : "";
MenuItem::step(); MenuItem::step();
} }
}; };


struct FramesResponseItem : MenuItem { struct FramesResponseItem : MenuItem {
Frames* frames;
Frames* module;
uint8_t channel; uint8_t channel;
uint8_t response; uint8_t response;
void onAction(const event::Action& e) override { void onAction(const event::Action& e) override {
frames->keyframer.mutable_settings(channel)->response = response;
module->keyframer.mutable_settings(channel)->response = response;
} }
void step() override { void step() override {
rightText = (frames->keyframer.mutable_settings(channel)->response == response) ? "✔" : "";
rightText = (module->keyframer.mutable_settings(channel)->response == response) ? "✔" : "";
MenuItem::step(); MenuItem::step();
} }
}; };


struct FramesChannelSettingsItem : MenuItem { struct FramesChannelSettingsItem : MenuItem {
Frames* frames;
Frames* module;
uint8_t channel; uint8_t channel;
Menu* createChildMenu() override { Menu* createChildMenu() override {
Menu* menu = new Menu(); Menu* menu = new Menu();


menu->addChild(construct<MenuLabel>(&MenuLabel::text, string::f("Channel %d", channel + 1)));
menu->addChild(new MenuSeparator);
menu->addChild(createMenuLabel("Interpolation curve"));

static const std::vector<std::string> curveLabels = {
"Step",
"Linear",
"Accelerating",
"Decelerating",
"Departure/arrival",
"Bouncing",
};
for (int i = 0; i < (int) curveLabels.size(); i++) {
menu->addChild(createCheckMenuItem(curveLabels[i],
[=]() {return module->keyframer.mutable_settings(channel)->easing_curve == i;},
[=]() {module->keyframer.mutable_settings(channel)->easing_curve = (frames::EasingCurve) i;}
));
}


menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Interpolation Curve"));
menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Step", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_STEP));
menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Linear", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_LINEAR));
menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Accelerating", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_IN_QUARTIC));
menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Decelerating", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_OUT_QUARTIC));
menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Smooth Departure/Arrival", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_SINE));
menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Bouncing", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_BOUNCE));
menu->addChild(new MenuSeparator); menu->addChild(new MenuSeparator);
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Response Curve"));
menu->addChild(construct<FramesResponseItem>(&MenuItem::text, "Linear", &FramesResponseItem::frames, frames, &FramesResponseItem::channel, channel, &FramesResponseItem::response, 0));
menu->addChild(construct<FramesResponseItem>(&MenuItem::text, "Exponential", &FramesResponseItem::frames, frames, &FramesResponseItem::channel, channel, &FramesResponseItem::response, 255));


return menu;
}
};
menu->addChild(createMenuLabel("Response curve"));


struct FramesClearItem : MenuItem {
Frames* frames;
void onAction(const event::Action& e) override {
frames->keyframer.Clear();
}
};
menu->addChild(createCheckMenuItem("Linear",
[=]() {return module->keyframer.mutable_settings(channel)->response == 0;},
[=]() {module->keyframer.mutable_settings(channel)->response = 0;}
));
menu->addChild(createCheckMenuItem("Exponential",
[=]() {return module->keyframer.mutable_settings(channel)->response == 255;},
[=]() {module->keyframer.mutable_settings(channel)->response = 255;}
));


struct FramesModeItem : MenuItem {
Frames* frames;
bool poly_lfo_mode;
void onAction(const event::Action& e) override {
frames->poly_lfo_mode = poly_lfo_mode;
}
void step() override {
rightText = (frames->poly_lfo_mode == poly_lfo_mode) ? "✔" : "";
MenuItem::step();
return menu;
} }
}; };


menu->addChild(new MenuSeparator); menu->addChild(new MenuSeparator);
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Channel Settings"));
menu->addChild(createMenuLabel("Channel settings"));

for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
menu->addChild(construct<FramesChannelSettingsItem>(&MenuItem::text, string::f("Channel %d", i + 1), &FramesChannelSettingsItem::frames, frames, &FramesChannelSettingsItem::channel, i));
FramesChannelSettingsItem* item = createMenuItem<FramesChannelSettingsItem>(string::f("Channel %d", i + 1));
item->module = module;
item->channel = i;
menu->addChild(item);
} }
menu->addChild(construct<FramesClearItem>(&MenuItem::text, "Clear Keyframes", &FramesClearItem::frames, frames));

menu->addChild(createMenuItem("Clear keyframes", "",
[=]() {module->keyframer.Clear();}
));


menu->addChild(new MenuSeparator); menu->addChild(new MenuSeparator);
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Mode"));
menu->addChild(construct<FramesModeItem>(&MenuItem::text, "Keyframer", &FramesModeItem::frames, frames, &FramesModeItem::poly_lfo_mode, false));
menu->addChild(construct<FramesModeItem>(&MenuItem::text, "Poly LFO", &FramesModeItem::frames, frames, &FramesModeItem::poly_lfo_mode, true));
menu->addChild(createMenuLabel("Alternate modes"));

static const std::vector<std::string> modeLabels = {
"Keyframer",
"Poly LFO",
};
for (int i = 0; i < (int) modeLabels.size(); i++) {
menu->addChild(createCheckMenuItem(modeLabels[i],
[=]() {return module->poly_lfo_mode == i;},
[=]() {module->poly_lfo_mode = i;}
));
}
} }
}; };




Loading…
Cancel
Save