You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
1.6KB

  1. #include <app/SvgSwitch.hpp>
  2. namespace rack {
  3. namespace app {
  4. SvgSwitch::SvgSwitch() {
  5. fb = new widget::FramebufferWidget;
  6. addChild(fb);
  7. shadow = new CircularShadow;
  8. fb->addChild(shadow);
  9. shadow->box.size = math::Vec();
  10. sw = new widget::SvgWidget;
  11. fb->addChild(sw);
  12. }
  13. SvgSwitch::~SvgSwitch() {
  14. }
  15. void SvgSwitch::addFrame(std::shared_ptr<window::Svg> svg) {
  16. frames.push_back(svg);
  17. // If this is our first frame, automatically set SVG and size
  18. if (!sw->svg) {
  19. sw->setSvg(svg);
  20. box.size = sw->box.size;
  21. fb->box.size = sw->box.size;
  22. // Move shadow downward by 10%
  23. shadow->box.size = sw->box.size;
  24. shadow->box.pos = math::Vec(0, sw->box.size.y * 0.10);
  25. }
  26. }
  27. void SvgSwitch::onDragStart(const DragStartEvent& e) {
  28. Switch::onDragStart(e);
  29. if (e.button != GLFW_MOUSE_BUTTON_LEFT)
  30. return;
  31. // Set down frame if latch
  32. if (latch) {
  33. if (frames.size() >= 2) {
  34. sw->setSvg(frames[1]);
  35. fb->setDirty();
  36. }
  37. }
  38. }
  39. void SvgSwitch::onDragEnd(const DragEndEvent& e) {
  40. Switch::onDragEnd(e);
  41. if (e.button != GLFW_MOUSE_BUTTON_LEFT)
  42. return;
  43. // Set up frame if latch
  44. if (latch) {
  45. if (frames.size() >= 1) {
  46. sw->setSvg(frames[0]);
  47. fb->setDirty();
  48. }
  49. }
  50. }
  51. void SvgSwitch::onChange(const ChangeEvent& e) {
  52. if (!latch) {
  53. engine::ParamQuantity* pq = getParamQuantity();
  54. if (!frames.empty() && pq) {
  55. int index = (int) std::round(pq->getValue() - pq->getMinValue());
  56. index = math::clamp(index, 0, (int) frames.size() - 1);
  57. sw->setSvg(frames[index]);
  58. fb->setDirty();
  59. }
  60. }
  61. ParamWidget::onChange(e);
  62. }
  63. } // namespace app
  64. } // namespace rack