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.

67 lines
1.4KB

  1. #include "ValleyWidgets.hpp"
  2. DynamicKnob::DynamicKnob() {
  3. shadow = new CircularShadow();
  4. addChild(shadow);
  5. shadow->box.size = Vec();
  6. tw = new TransformWidget();
  7. addChild(tw);
  8. sw = new SVGWidget();
  9. tw->addChild(sw);
  10. _visibility = nullptr;
  11. _viewMode = ACTIVE_HIGH_VIEW;
  12. }
  13. void DynamicKnob::setSVG(std::shared_ptr<SVG> svg) {
  14. sw->svg = svg;
  15. sw->wrap();
  16. tw->box.size = sw->box.size;
  17. box.size = sw->box.size;
  18. shadow->box.size = sw->box.size;
  19. shadow->box.pos = Vec(0, sw->box.size.y * 0.1);
  20. }
  21. void DynamicKnob::step() {
  22. // Re-transform TransformWidget if dirty
  23. if(_visibility != nullptr) {
  24. if(*_visibility) {
  25. visible = true;
  26. }
  27. else {
  28. visible = false;
  29. }
  30. if(_viewMode == ACTIVE_LOW_VIEW) {
  31. visible = !visible;
  32. }
  33. }
  34. else {
  35. visible = true;
  36. }
  37. if (dirty) {
  38. tw->box.size = box.size;
  39. float angle;
  40. if (isfinite(minValue) && isfinite(maxValue)) {
  41. angle = rescale(value, minValue, maxValue, minAngle, maxAngle);
  42. }
  43. else {
  44. angle = rescale(value, -1.0, 1.0, minAngle, maxAngle);
  45. angle = fmodf(angle, 2*M_PI);
  46. }
  47. tw->identity();
  48. // Scale SVG to box
  49. tw->scale(box.size.div(sw->box.size));
  50. // Rotate SVG
  51. Vec center = sw->box.getCenter();
  52. tw->translate(center);
  53. tw->rotate(angle);
  54. tw->translate(center.neg());
  55. }
  56. FramebufferWidget::step();
  57. }
  58. void DynamicKnob::onChange(EventChange &e) {
  59. dirty = true;
  60. Knob::onChange(e);
  61. }