| 336 | } |
| 337 | |
| 338 | void appendContextMenu(Menu* menu) override { |
| 339 | Frames* frames = dynamic_cast<Frames*>(module); |
| 340 | assert(frames); |
| 341 | |
| 342 | struct FramesCurveItem : MenuItem { |
| 343 | Frames* frames; |
| 344 | uint8_t channel; |
| 345 | frames::EasingCurve curve; |
| 346 | void onAction(const event::Action& e) override { |
| 347 | frames->keyframer.mutable_settings(channel)->easing_curve = curve; |
| 348 | } |
| 349 | void step() override { |
| 350 | rightText = (frames->keyframer.mutable_settings(channel)->easing_curve == curve) ? "✔" : ""; |
| 351 | MenuItem::step(); |
| 352 | } |
| 353 | }; |
| 354 | |
| 355 | struct FramesResponseItem : MenuItem { |
| 356 | Frames* frames; |
| 357 | uint8_t channel; |
| 358 | uint8_t response; |
| 359 | void onAction(const event::Action& e) override { |
| 360 | frames->keyframer.mutable_settings(channel)->response = response; |
| 361 | } |
| 362 | void step() override { |
| 363 | rightText = (frames->keyframer.mutable_settings(channel)->response == response) ? "✔" : ""; |
| 364 | MenuItem::step(); |
| 365 | } |
| 366 | }; |
| 367 | |
| 368 | struct FramesChannelSettingsItem : MenuItem { |
| 369 | Frames* frames; |
| 370 | uint8_t channel; |
| 371 | Menu* createChildMenu() override { |
| 372 | Menu* menu = new Menu(); |
| 373 | |
| 374 | menu->addChild(construct<MenuLabel>(&MenuLabel::text, string::f("Channel %d", channel + 1))); |
| 375 | menu->addChild(new MenuSeparator); |
| 376 | |
| 377 | menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Interpolation Curve")); |
| 378 | menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Step", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_STEP)); |
| 379 | menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Linear", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_LINEAR)); |
| 380 | menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Accelerating", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_IN_QUARTIC)); |
| 381 | menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Decelerating", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_OUT_QUARTIC)); |
| 382 | menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Smooth Departure/Arrival", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_SINE)); |
| 383 | menu->addChild(construct<FramesCurveItem>(&MenuItem::text, "Bouncing", &FramesCurveItem::frames, frames, &FramesCurveItem::channel, channel, &FramesCurveItem::curve, frames::EASING_CURVE_BOUNCE)); |
| 384 | menu->addChild(new MenuSeparator); |
| 385 | menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Response Curve")); |
| 386 | menu->addChild(construct<FramesResponseItem>(&MenuItem::text, "Linear", &FramesResponseItem::frames, frames, &FramesResponseItem::channel, channel, &FramesResponseItem::response, 0)); |
| 387 | menu->addChild(construct<FramesResponseItem>(&MenuItem::text, "Exponential", &FramesResponseItem::frames, frames, &FramesResponseItem::channel, channel, &FramesResponseItem::response, 255)); |
| 388 | |
| 389 | return menu; |
| 390 | } |
| 391 | }; |
| 392 | |
| 393 | struct FramesClearItem : MenuItem { |
| 394 | Frames* frames; |
| 395 | void onAction(const event::Action& e) override { |
nothing calls this directly
no outgoing calls
no test coverage detected