#include namespace rack { namespace app { SvgSlider::SvgSlider() { fb = new widget::FramebufferWidget; addChild(fb); background = new widget::SvgWidget; fb->addChild(background); handle = new widget::SvgWidget; fb->addChild(handle); speed = 2.0; } void SvgSlider::setBackgroundSvg(std::shared_ptr svg) { if (svg == background->svg) return; background->setSvg(svg); box.size = background->box.size; fb->box.size = background->box.size; fb->setDirty(); } void SvgSlider::setHandleSvg(std::shared_ptr svg) { if (svg == handle->svg) return; handle->setSvg(svg); handle->box.pos = maxHandlePos; fb->setDirty(); } void SvgSlider::setHandlePos(math::Vec minHandlePos, math::Vec maxHandlePos) { this->minHandlePos = minHandlePos; this->maxHandlePos = maxHandlePos; // Set handle pos to maximum by default handle->box.pos = maxHandlePos; } void SvgSlider::setHandlePosCentered(math::Vec minHandlePosCentered, math::Vec maxHandlePosCentered) { setHandlePos( minHandlePosCentered.minus(handle->box.size.div(2)), maxHandlePosCentered.minus(handle->box.size.div(2)) ); } void SvgSlider::onChange(const ChangeEvent& e) { // Default position is max value float v = 1.f; engine::ParamQuantity* pq = getParamQuantity(); if (pq) { v = pq->getScaledValue(); } // Interpolate handle position handle->box.pos = minHandlePos.crossfade(maxHandlePos, v); fb->setDirty(); ParamWidget::onChange(e); } } // namespace app } // namespace rack