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.

78 lines
2.2KB

  1. #include "gui_components.hpp"
  2. #include "rack.hpp"
  3. namespace rack_plugin_CastleRocktronics {
  4. ShadedKnob::ShadedKnob() {
  5. shadowWidget = new CircularShadow();
  6. shadowWidget->blurRadius = shadowBlur;
  7. addChild(shadowWidget);
  8. knobTransformWidget = new TransformWidget();
  9. addChild(knobTransformWidget);
  10. knobSVGWidget = new SVGWidget();
  11. knobTransformWidget->addChild(knobSVGWidget);
  12. highlightWidget = new SVGWidget();
  13. addChild(highlightWidget);
  14. markerTransformWidget = new TransformWidget();
  15. addChild(markerTransformWidget);
  16. markerSVGWidget = new SVGWidget();
  17. markerTransformWidget->addChild(markerSVGWidget);
  18. }
  19. void ShadedKnob::setKnob(std::shared_ptr<SVG> svg) {
  20. knobSVGWidget->svg = svg;
  21. knobSVGWidget->wrap();
  22. knobTransformWidget->box.size = knobSVGWidget->box.size;
  23. box.size = knobSVGWidget->box.size;
  24. shadowWidget->box.size = knobSVGWidget->box.size;
  25. shadowWidget->box.pos = (knobSVGWidget->box.pos).plus(shadowOffset);
  26. }
  27. void ShadedKnob::setHighlight(std::shared_ptr<SVG> svg) {
  28. highlightWidget->svg = svg;
  29. highlightWidget->wrap();
  30. }
  31. void ShadedKnob::setMarker(std::shared_ptr<SVG> svg) {
  32. markerSVGWidget->svg = svg;
  33. markerSVGWidget->wrap();
  34. markerTransformWidget->box.size = knobSVGWidget->box.size;
  35. }
  36. void ShadedKnob::step() {
  37. // Re-transform TransformWidget if dirty
  38. if (dirty) {
  39. knobTransformWidget->box.size = box.size;
  40. markerTransformWidget->box.size = box.size;
  41. knobTransformWidget->identity();
  42. markerTransformWidget->identity();
  43. knobTransformWidget->scale(box.size.div(knobSVGWidget->box.size));
  44. markerTransformWidget->scale(box.size.div(knobSVGWidget->box.size));
  45. float angle = rescalef(value, minValue, maxValue, minAngle, maxAngle);
  46. Vec center = knobSVGWidget->box.getCenter();
  47. knobTransformWidget->translate(center);
  48. markerTransformWidget->translate(center);
  49. knobTransformWidget->rotate(angle);
  50. markerTransformWidget->rotate(angle);
  51. knobTransformWidget->translate(center.neg());
  52. markerTransformWidget->translate(center.neg());
  53. }
  54. FramebufferWidget::step();
  55. }
  56. void ShadedKnob::onChange(EventChange &e) {
  57. dirty = true;
  58. Knob::onChange(e);
  59. }
  60. } // namespace rack_plugin_CastleRocktronics