#include "ValleyWidgets.hpp" DynamicKnob::DynamicKnob() { shadow = new CircularShadow(); addChild(shadow); shadow->box.size = Vec(); tw = new TransformWidget(); addChild(tw); sw = new SVGWidget(); tw->addChild(sw); _visibility = nullptr; _viewMode = ACTIVE_HIGH_VIEW; } void DynamicKnob::setSVG(std::shared_ptr svg) { sw->svg = svg; sw->wrap(); tw->box.size = sw->box.size; box.size = sw->box.size; shadow->box.size = sw->box.size; shadow->box.pos = Vec(0, sw->box.size.y * 0.1); } void DynamicKnob::step() { // Re-transform TransformWidget if dirty if(_visibility != nullptr) { if(*_visibility) { visible = true; } else { visible = false; } if(_viewMode == ACTIVE_LOW_VIEW) { visible = !visible; } } else { visible = true; } if (dirty) { tw->box.size = box.size; float angle; if (isfinite(minValue) && isfinite(maxValue)) { angle = rescale(value, minValue, maxValue, minAngle, maxAngle); } else { angle = rescale(value, -1.0, 1.0, minAngle, maxAngle); angle = fmodf(angle, 2*M_PI); } tw->identity(); // Scale SVG to box tw->scale(box.size.div(sw->box.size)); // Rotate SVG Vec center = sw->box.getCenter(); tw->translate(center); tw->rotate(angle); tw->translate(center.neg()); } FramebufferWidget::step(); } void DynamicKnob::onChange(EventChange &e) { dirty = true; Knob::onChange(e); }