#include "gui_components.hpp" #include "rack.hpp" namespace rack_plugin_CastleRocktronics { ShadedKnob::ShadedKnob() { shadowWidget = new CircularShadow(); shadowWidget->blurRadius = shadowBlur; addChild(shadowWidget); knobTransformWidget = new TransformWidget(); addChild(knobTransformWidget); knobSVGWidget = new SVGWidget(); knobTransformWidget->addChild(knobSVGWidget); highlightWidget = new SVGWidget(); addChild(highlightWidget); markerTransformWidget = new TransformWidget(); addChild(markerTransformWidget); markerSVGWidget = new SVGWidget(); markerTransformWidget->addChild(markerSVGWidget); } void ShadedKnob::setKnob(std::shared_ptr svg) { knobSVGWidget->svg = svg; knobSVGWidget->wrap(); knobTransformWidget->box.size = knobSVGWidget->box.size; box.size = knobSVGWidget->box.size; shadowWidget->box.size = knobSVGWidget->box.size; shadowWidget->box.pos = (knobSVGWidget->box.pos).plus(shadowOffset); } void ShadedKnob::setHighlight(std::shared_ptr svg) { highlightWidget->svg = svg; highlightWidget->wrap(); } void ShadedKnob::setMarker(std::shared_ptr svg) { markerSVGWidget->svg = svg; markerSVGWidget->wrap(); markerTransformWidget->box.size = knobSVGWidget->box.size; } void ShadedKnob::step() { // Re-transform TransformWidget if dirty if (dirty) { knobTransformWidget->box.size = box.size; markerTransformWidget->box.size = box.size; knobTransformWidget->identity(); markerTransformWidget->identity(); knobTransformWidget->scale(box.size.div(knobSVGWidget->box.size)); markerTransformWidget->scale(box.size.div(knobSVGWidget->box.size)); float angle = rescalef(value, minValue, maxValue, minAngle, maxAngle); Vec center = knobSVGWidget->box.getCenter(); knobTransformWidget->translate(center); markerTransformWidget->translate(center); knobTransformWidget->rotate(angle); markerTransformWidget->rotate(angle); knobTransformWidget->translate(center.neg()); markerTransformWidget->translate(center.neg()); } FramebufferWidget::step(); } void ShadedKnob::onChange(EventChange &e) { dirty = true; Knob::onChange(e); } } // namespace rack_plugin_CastleRocktronics