| @@ -274,11 +274,11 @@ struct SpriteKnob : Knob, SpriteWidget { | |||
| /** A knob which rotates an SVG and caches it in a framebuffer */ | |||
| struct SVGKnob : Knob, FramebufferWidget { | |||
| /** Angles in radians */ | |||
| float minAngle, maxAngle; | |||
| TransformWidget *tw; | |||
| SVGWidget *sw; | |||
| CircularShadow *shadow; | |||
| /** Angles in radians */ | |||
| float minAngle, maxAngle; | |||
| SVGKnob(); | |||
| void setSVG(std::shared_ptr<SVG> svg); | |||
| @@ -289,18 +289,22 @@ struct SVGKnob : Knob, FramebufferWidget { | |||
| /** Behaves like a knob but linearly moves an SVGWidget between two points. | |||
| Can be used for horizontal or vertical linear faders. | |||
| */ | |||
| struct SVGFader : Knob, FramebufferWidget { | |||
| /** Intermediate positions will be interpolated between these positions */ | |||
| Vec minHandlePos, maxHandlePos; | |||
| /** Not owned */ | |||
| struct SVGSlider : Knob, FramebufferWidget { | |||
| SVGWidget *background; | |||
| SVGWidget *handle; | |||
| /** Intermediate positions will be interpolated between these positions */ | |||
| Vec minHandlePos, maxHandlePos; | |||
| SVGFader(); | |||
| SVGSlider(); | |||
| void setSVGs(std::shared_ptr<SVG> backgroundSVG, std::shared_ptr<SVG> handleSVG); | |||
| void step() override; | |||
| void onChange(EventChange &e) override; | |||
| }; | |||
| /** Deprecated name for SVGSlider */ | |||
| typedef SVGSlider SVGFader; | |||
| /** A Parameter with multiple frames corresponding to its value */ | |||
| struct SVGSwitch : virtual Parameter, FramebufferWidget { | |||
| std::vector<std::shared_ptr<SVG>> frames; | |||
| SVGWidget *sw; | |||
| @@ -446,13 +450,11 @@ struct ModuleLightWidget : MultiLightWidget { | |||
| // ports | |||
| //////////////////// | |||
| struct Port : OpaqueWidget { | |||
| struct Port : Component { | |||
| enum PortType { | |||
| INPUT, | |||
| OUTPUT | |||
| }; | |||
| Module *module = NULL; | |||
| PortType type = INPUT; | |||
| int portId; | |||
| MultiLightWidget *plugLight; | |||
| @@ -470,9 +472,8 @@ struct Port : OpaqueWidget { | |||
| template <typename T = Port> | |||
| static T *create(Vec pos, PortType type, Module *module, int portId) { | |||
| T *o = Widget::create<T>(pos); | |||
| T *o = Component::create<T>(pos, module); | |||
| o->type = type; | |||
| o->module = module; | |||
| o->portId = portId; | |||
| return o; | |||
| } | |||
| @@ -480,8 +481,10 @@ struct Port : OpaqueWidget { | |||
| struct SVGPort : Port, FramebufferWidget { | |||
| SVGWidget *background; | |||
| CircularShadow *shadow; | |||
| SVGPort(); | |||
| void setSVG(std::shared_ptr<SVG> svg); | |||
| void draw(NVGcontext *vg) override; | |||
| }; | |||
| @@ -322,45 +322,75 @@ struct BefacoTinyKnob : SVGKnob { | |||
| } | |||
| }; | |||
| struct BefacoSlidePot : SVGFader { | |||
| struct BefacoSlidePot : SVGSlider { | |||
| BefacoSlidePot() { | |||
| Vec margin = Vec(3.5, 3.5); | |||
| maxHandlePos = Vec(-1, -2).plus(margin); | |||
| minHandlePos = Vec(-1, 87).plus(margin); | |||
| background->svg = SVG::load(assetGlobal("res/ComponentLibrary/BefacoSlidePot.svg")); | |||
| background->wrap(); | |||
| setSVGs(SVG::load(assetGlobal("res/ComponentLibrary/BefacoSlidePot.svg")), SVG::load(assetGlobal("res/ComponentLibrary/BefacoSlidePotHandle.svg"))); | |||
| background->box.pos = margin; | |||
| box.size = background->box.size.plus(margin.mult(2)); | |||
| handle->svg = SVG::load(assetGlobal("res/ComponentLibrary/BefacoSlidePotHandle.svg")); | |||
| handle->wrap(); | |||
| } | |||
| }; | |||
| struct LEDSlider : SVGSlider { | |||
| LEDSlider() { | |||
| maxHandlePos = mm2px(Vec(0.738, 0.738).plus(Vec(2, 0))); | |||
| minHandlePos = mm2px(Vec(0.738, 22.078).plus(Vec(2, 0))); | |||
| setSVGs(SVG::load(assetGlobal("res/ComponentLibrary/LEDSlider.svg")), NULL); | |||
| } | |||
| }; | |||
| /** API is unstable for LEDSlider. Will add a LightWidget later. */ | |||
| struct LEDSliderGreen : LEDSlider { | |||
| LEDSliderGreen() { | |||
| handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderGreenHandle.svg"))); | |||
| } | |||
| }; | |||
| struct LEDSliderRed : LEDSlider { | |||
| LEDSliderRed() { | |||
| handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderRedHandle.svg"))); | |||
| } | |||
| }; | |||
| struct LEDSliderYellow : LEDSlider { | |||
| LEDSliderYellow() { | |||
| handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderYellowHandle.svg"))); | |||
| } | |||
| }; | |||
| struct LEDSliderBlue : LEDSlider { | |||
| LEDSliderBlue() { | |||
| handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderBlueHandle.svg"))); | |||
| } | |||
| }; | |||
| struct LEDSliderWhite : LEDSlider { | |||
| LEDSliderWhite() { | |||
| handle->setSVG(SVG::load(assetGlobal("res/ComponentLibrary/LEDSliderWhiteHandle.svg"))); | |||
| } | |||
| }; | |||
| //////////////////// | |||
| // Jacks | |||
| // Ports | |||
| //////////////////// | |||
| struct PJ301MPort : SVGPort { | |||
| PJ301MPort() { | |||
| background->svg = SVG::load(assetGlobal("res/ComponentLibrary/PJ301M.svg")); | |||
| background->wrap(); | |||
| box.size = background->box.size; | |||
| setSVG(SVG::load(assetGlobal("res/ComponentLibrary/PJ301M.svg"))); | |||
| } | |||
| }; | |||
| struct PJ3410Port : SVGPort { | |||
| PJ3410Port() { | |||
| background->svg = SVG::load(assetGlobal("res/ComponentLibrary/PJ3410.svg")); | |||
| background->wrap(); | |||
| box.size = background->box.size; | |||
| setSVG(SVG::load(assetGlobal("res/ComponentLibrary/PJ3410.svg"))); | |||
| } | |||
| }; | |||
| struct CL1362Port : SVGPort { | |||
| CL1362Port() { | |||
| background->svg = SVG::load(assetGlobal("res/ComponentLibrary/CL1362.svg")); | |||
| background->wrap(); | |||
| box.size = background->box.size; | |||
| setSVG(SVG::load(assetGlobal("res/ComponentLibrary/CL1362.svg"))); | |||
| } | |||
| }; | |||
| @@ -0,0 +1,66 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
| <svg | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| width="7.00002mm" | |||
| height="26.999905mm" | |||
| viewBox="0 0 7.00002 26.999905" | |||
| version="1.1" | |||
| id="svg163547" | |||
| sodipodi:docname="LEDSlider.svg" | |||
| inkscape:version="0.92.2 5c3e80d, 2017-08-06"> | |||
| <defs | |||
| id="defs163541" /> | |||
| <sodipodi:namedview | |||
| id="base" | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1.0" | |||
| inkscape:pageopacity="0.0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:zoom="1.979899" | |||
| inkscape:cx="-33.18202" | |||
| inkscape:cy="22.493378" | |||
| inkscape:document-units="mm" | |||
| inkscape:current-layer="layer1" | |||
| showgrid="false" | |||
| fit-margin-top="0" | |||
| fit-margin-left="2" | |||
| fit-margin-right="2" | |||
| fit-margin-bottom="0" | |||
| inkscape:window-width="2560" | |||
| inkscape:window-height="1422" | |||
| inkscape:window-x="0" | |||
| inkscape:window-y="18" | |||
| inkscape:window-maximized="0" /> | |||
| <metadata | |||
| id="metadata163544"> | |||
| <rdf:RDF> | |||
| <cc:Work | |||
| rdf:about=""> | |||
| <dc:format>image/svg+xml</dc:format> | |||
| <dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
| <dc:title></dc:title> | |||
| </cc:Work> | |||
| </rdf:RDF> | |||
| </metadata> | |||
| <g | |||
| inkscape:label="Layer 1" | |||
| inkscape:groupmode="layer" | |||
| id="layer1" | |||
| transform="translate(-105.35713,-95.267905)"> | |||
| <path | |||
| style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 110.35715,95.267905 v 26.999905 h -3.00002 V 95.267905 Z m 0,0" | |||
| id="path159840" | |||
| inkscape:connector-curvature="0" /> | |||
| </g> | |||
| </svg> | |||
| @@ -0,0 +1,71 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
| <svg | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| width="1.52411mm" | |||
| height="4.1437631mm" | |||
| viewBox="0 0 1.52411 4.143763" | |||
| version="1.1" | |||
| id="svg164153" | |||
| inkscape:version="0.92.2 5c3e80d, 2017-08-06" | |||
| sodipodi:docname="LEDSliderBlueHandle.svg"> | |||
| <defs | |||
| id="defs164147" /> | |||
| <sodipodi:namedview | |||
| id="base" | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1.0" | |||
| inkscape:pageopacity="0.0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:zoom="7.9195959" | |||
| inkscape:cx="-27.821283" | |||
| inkscape:cy="-9.1133715" | |||
| inkscape:document-units="mm" | |||
| inkscape:current-layer="layer1" | |||
| showgrid="false" | |||
| fit-margin-top="0" | |||
| fit-margin-left="0" | |||
| fit-margin-right="0" | |||
| fit-margin-bottom="0" | |||
| inkscape:window-width="2560" | |||
| inkscape:window-height="1422" | |||
| inkscape:window-x="0" | |||
| inkscape:window-y="18" | |||
| inkscape:window-maximized="0" /> | |||
| <metadata | |||
| id="metadata164150"> | |||
| <rdf:RDF> | |||
| <cc:Work | |||
| rdf:about=""> | |||
| <dc:format>image/svg+xml</dc:format> | |||
| <dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
| <dc:title></dc:title> | |||
| </cc:Work> | |||
| </rdf:RDF> | |||
| </metadata> | |||
| <g | |||
| inkscape:label="Layer 1" | |||
| inkscape:groupmode="layer" | |||
| id="layer1" | |||
| transform="translate(-120.21393,-92.817187)"> | |||
| <path | |||
| style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 121.73804,92.817187 v 4.143763 h -1.52411 v -4.143763 z m 0,0" | |||
| id="path162658" | |||
| inkscape:connector-curvature="0" /> | |||
| <path | |||
| style="fill:#4cc7f3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 121.73804,93.251269 v 3.275599 h -1.52411 v -3.275599 z m 0,0" | |||
| id="path162660" | |||
| inkscape:connector-curvature="0" /> | |||
| </g> | |||
| </svg> | |||
| @@ -0,0 +1,71 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
| <svg | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| width="1.52411mm" | |||
| height="4.1423831mm" | |||
| viewBox="0 0 1.52411 4.1423831" | |||
| version="1.1" | |||
| id="svg164153" | |||
| inkscape:version="0.92.2 5c3e80d, 2017-08-06" | |||
| sodipodi:docname="LEDSliderGreenHandle.svg"> | |||
| <defs | |||
| id="defs164147" /> | |||
| <sodipodi:namedview | |||
| id="base" | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1.0" | |||
| inkscape:pageopacity="0.0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:zoom="7.9195959" | |||
| inkscape:cx="-42.017793" | |||
| inkscape:cy="0.48214362" | |||
| inkscape:document-units="mm" | |||
| inkscape:current-layer="layer1" | |||
| showgrid="false" | |||
| fit-margin-top="0" | |||
| fit-margin-left="0" | |||
| fit-margin-right="0" | |||
| fit-margin-bottom="0" | |||
| inkscape:window-width="2560" | |||
| inkscape:window-height="1422" | |||
| inkscape:window-x="0" | |||
| inkscape:window-y="18" | |||
| inkscape:window-maximized="0" /> | |||
| <metadata | |||
| id="metadata164150"> | |||
| <rdf:RDF> | |||
| <cc:Work | |||
| rdf:about=""> | |||
| <dc:format>image/svg+xml</dc:format> | |||
| <dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
| <dc:title></dc:title> | |||
| </cc:Work> | |||
| </rdf:RDF> | |||
| </metadata> | |||
| <g | |||
| inkscape:label="Layer 1" | |||
| inkscape:groupmode="layer" | |||
| id="layer1" | |||
| transform="translate(-123.97009,-95.35738)"> | |||
| <path | |||
| style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 125.4942,95.35738 v 4.142383 h -1.52411 V 95.35738 Z m 0,0" | |||
| id="path162646" | |||
| inkscape:connector-curvature="0" /> | |||
| <path | |||
| style="fill:#8fc53d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 125.4942,95.790083 v 3.276977 h -1.52411 v -3.276977 z m 0,0" | |||
| id="path162648" | |||
| inkscape:connector-curvature="0" /> | |||
| </g> | |||
| </svg> | |||
| @@ -0,0 +1,71 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
| <svg | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| width="1.52414mm" | |||
| height="4.1423802mm" | |||
| viewBox="0 0 1.52414 4.1423802" | |||
| version="1.1" | |||
| id="svg164153" | |||
| inkscape:version="0.92.2 5c3e80d, 2017-08-06" | |||
| sodipodi:docname="LEDSliderRedHandle.svg"> | |||
| <defs | |||
| id="defs164147" /> | |||
| <sodipodi:namedview | |||
| id="base" | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1.0" | |||
| inkscape:pageopacity="0.0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:zoom="7.9195959" | |||
| inkscape:cx="-23.101371" | |||
| inkscape:cy="2.1230781" | |||
| inkscape:document-units="mm" | |||
| inkscape:current-layer="layer1" | |||
| showgrid="false" | |||
| fit-margin-top="0" | |||
| fit-margin-left="0" | |||
| fit-margin-right="0" | |||
| fit-margin-bottom="0" | |||
| inkscape:window-width="2560" | |||
| inkscape:window-height="1422" | |||
| inkscape:window-x="0" | |||
| inkscape:window-y="18" | |||
| inkscape:window-maximized="0" /> | |||
| <metadata | |||
| id="metadata164150"> | |||
| <rdf:RDF> | |||
| <cc:Work | |||
| rdf:about=""> | |||
| <dc:format>image/svg+xml</dc:format> | |||
| <dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
| <dc:title></dc:title> | |||
| </cc:Work> | |||
| </rdf:RDF> | |||
| </metadata> | |||
| <g | |||
| inkscape:label="Layer 1" | |||
| inkscape:groupmode="layer" | |||
| id="layer1" | |||
| transform="translate(-118.96512,-95.791547)"> | |||
| <path | |||
| style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 120.48926,95.791547 v 4.14238 h -1.52414 v -4.14238 z m 0,0" | |||
| id="path162650" | |||
| inkscape:connector-curvature="0" /> | |||
| <path | |||
| style="fill:#f82b1c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 120.48926,96.225629 v 3.275595 h -1.52414 v -3.275595 z m 0,0" | |||
| id="path162652" | |||
| inkscape:connector-curvature="0" /> | |||
| </g> | |||
| </svg> | |||
| @@ -0,0 +1,71 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
| <svg | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| width="1.52411mm" | |||
| height="4.1423841mm" | |||
| viewBox="0 0 1.52411 4.142384" | |||
| version="1.1" | |||
| id="svg164153" | |||
| inkscape:version="0.92.2 5c3e80d, 2017-08-06" | |||
| sodipodi:docname="LEDSliderWhiteHandle.svg"> | |||
| <defs | |||
| id="defs164147" /> | |||
| <sodipodi:namedview | |||
| id="base" | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1.0" | |||
| inkscape:pageopacity="0.0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:zoom="7.9195959" | |||
| inkscape:cx="-27.719009" | |||
| inkscape:cy="-12.144383" | |||
| inkscape:document-units="mm" | |||
| inkscape:current-layer="layer1" | |||
| showgrid="false" | |||
| fit-margin-top="0" | |||
| fit-margin-left="0" | |||
| fit-margin-right="0" | |||
| fit-margin-bottom="0" | |||
| inkscape:window-width="2560" | |||
| inkscape:window-height="1422" | |||
| inkscape:window-x="0" | |||
| inkscape:window-y="18" | |||
| inkscape:window-maximized="0" /> | |||
| <metadata | |||
| id="metadata164150"> | |||
| <rdf:RDF> | |||
| <cc:Work | |||
| rdf:about=""> | |||
| <dc:format>image/svg+xml</dc:format> | |||
| <dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
| <dc:title></dc:title> | |||
| </cc:Work> | |||
| </rdf:RDF> | |||
| </metadata> | |||
| <g | |||
| inkscape:label="Layer 1" | |||
| inkscape:groupmode="layer" | |||
| id="layer1" | |||
| transform="translate(-120.18687,-92.016611)"> | |||
| <path | |||
| style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 121.71098,92.016611 v 4.142384 h -1.52411 v -4.142384 z m 0,0" | |||
| id="path162662" | |||
| inkscape:connector-curvature="0" /> | |||
| <path | |||
| style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 121.71098,92.449314 v 3.276974 h -1.52411 v -3.276974 z m 0,0" | |||
| id="path162664" | |||
| inkscape:connector-curvature="0" /> | |||
| </g> | |||
| </svg> | |||
| @@ -0,0 +1,71 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
| <svg | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| width="1.52411mm" | |||
| height="4.1423841mm" | |||
| viewBox="0 0 1.52411 4.142384" | |||
| version="1.1" | |||
| id="svg164153" | |||
| inkscape:version="0.92.2 5c3e80d, 2017-08-06" | |||
| sodipodi:docname="LEDSliderYellowHandle.svg"> | |||
| <defs | |||
| id="defs164147" /> | |||
| <sodipodi:namedview | |||
| id="base" | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1.0" | |||
| inkscape:pageopacity="0.0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:zoom="7.9195959" | |||
| inkscape:cx="-37.393768" | |||
| inkscape:cy="-10.378115" | |||
| inkscape:document-units="mm" | |||
| inkscape:current-layer="layer1" | |||
| showgrid="false" | |||
| fit-margin-top="0" | |||
| fit-margin-left="0" | |||
| fit-margin-right="0" | |||
| fit-margin-bottom="0" | |||
| inkscape:window-width="2560" | |||
| inkscape:window-height="1422" | |||
| inkscape:window-x="0" | |||
| inkscape:window-y="18" | |||
| inkscape:window-maximized="0" /> | |||
| <metadata | |||
| id="metadata164150"> | |||
| <rdf:RDF> | |||
| <cc:Work | |||
| rdf:about=""> | |||
| <dc:format>image/svg+xml</dc:format> | |||
| <dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
| <dc:title></dc:title> | |||
| </cc:Work> | |||
| </rdf:RDF> | |||
| </metadata> | |||
| <g | |||
| inkscape:label="Layer 1" | |||
| inkscape:groupmode="layer" | |||
| id="layer1" | |||
| transform="translate(-122.74665,-92.483936)"> | |||
| <path | |||
| style="fill:#5c5c5c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 124.27076,92.483936 v 4.142384 h -1.52411 v -4.142384 z m 0,0" | |||
| id="path162654" | |||
| inkscape:connector-curvature="0" /> | |||
| <path | |||
| style="fill:#ffd714;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" | |||
| d="m 124.27076,92.918018 v 3.275599 h -1.52411 v -3.275599 z m 0,0" | |||
| id="path162656" | |||
| inkscape:connector-curvature="0" /> | |||
| </g> | |||
| </svg> | |||
| @@ -7,8 +7,6 @@ namespace rack { | |||
| CircularShadow::CircularShadow() { | |||
| blurRadius = 0; | |||
| opacity = 0.15; | |||
| // blurRadius = 0; | |||
| // opacity = 0.15; | |||
| } | |||
| void CircularShadow::draw(NVGcontext *vg) { | |||
| @@ -30,6 +30,7 @@ void Knob::onDragMove(EventDragMove &e) { | |||
| if (windowIsModPressed()) | |||
| delta /= 16.0; | |||
| dragValue += delta; | |||
| dragValue = clamp(dragValue, minValue, maxValue); | |||
| if (snap) | |||
| setValue(roundf(dragValue)); | |||
| else | |||
| @@ -1,30 +0,0 @@ | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| SVGFader::SVGFader() { | |||
| background = new SVGWidget(); | |||
| addChild(background); | |||
| handle = new SVGWidget(); | |||
| addChild(handle); | |||
| } | |||
| void SVGFader::step() { | |||
| if (dirty) { | |||
| // Update handle position | |||
| Vec handlePos = Vec(rescale(value, minValue, maxValue, minHandlePos.x, maxHandlePos.x), rescale(value, minValue, maxValue, minHandlePos.y, maxHandlePos.y)); | |||
| handle->box.pos = handlePos; | |||
| } | |||
| FramebufferWidget::step(); | |||
| } | |||
| void SVGFader::onChange(EventChange &e) { | |||
| dirty = true; | |||
| Knob::onChange(e); | |||
| } | |||
| } // namespace rack | |||
| @@ -5,10 +5,24 @@ namespace rack { | |||
| SVGPort::SVGPort() { | |||
| shadow = new CircularShadow(); | |||
| addChild(shadow); | |||
| // Avoid breakage if plugins fail to call setSVG() | |||
| // In that case, just disable the shadow. | |||
| shadow->box.size = Vec(); | |||
| background = new SVGWidget(); | |||
| addChild(background); | |||
| } | |||
| void SVGPort::setSVG(std::shared_ptr<SVG> svg) { | |||
| background->setSVG(svg); | |||
| box.size = background->box.size; | |||
| shadow->box.size = background->box.size; | |||
| shadow->box.pos = Vec(0, background->box.size.y * 0.1); | |||
| // shadow->box = shadow->box.grow(Vec(2, 2)); | |||
| } | |||
| void SVGPort::draw(NVGcontext *vg) { | |||
| Port::draw(vg); | |||
| FramebufferWidget::draw(vg); | |||
| @@ -0,0 +1,37 @@ | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| SVGSlider::SVGSlider() { | |||
| background = new SVGWidget(); | |||
| addChild(background); | |||
| handle = new SVGWidget(); | |||
| addChild(handle); | |||
| } | |||
| void SVGSlider::setSVGs(std::shared_ptr<SVG> backgroundSVG, std::shared_ptr<SVG> handleSVG) { | |||
| background->setSVG(backgroundSVG); | |||
| box.size = background->box.size; | |||
| if (handleSVG) { | |||
| handle->setSVG(handleSVG); | |||
| } | |||
| } | |||
| void SVGSlider::step() { | |||
| if (dirty) { | |||
| // Interpolate handle position | |||
| handle->box.pos = Vec(rescale(value, minValue, maxValue, minHandlePos.x, maxHandlePos.x), rescale(value, minValue, maxValue, minHandlePos.y, maxHandlePos.y)); | |||
| } | |||
| FramebufferWidget::step(); | |||
| } | |||
| void SVGSlider::onChange(EventChange &e) { | |||
| dirty = true; | |||
| Knob::onChange(e); | |||
| } | |||
| } // namespace rack | |||