@@ -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 |