@@ -1,4 +1,6 @@ | |||
#pragma once | |||
#include <widget/FramebufferWidget.hpp> | |||
#include <widget/SvgWidget.hpp> | |||
#include <app/SvgKnob.hpp> | |||
#include <app/SvgSlider.hpp> | |||
#include <app/SvgPort.hpp> | |||
@@ -51,7 +53,7 @@ Many of these classes use CRTP (https://en.wikipedia.org/wiki/Curiously_recurrin | |||
To use a red light with its default base class for example, use `RedLight` or `TRedLight<>`. (They are synonymous.) | |||
Use the `TBase` template argument if you want a different base class. | |||
Use the `Base` template argument if you want a different base class. | |||
E.g. `RectangleLight<RedLight>` | |||
Although this paradigm might seem confusing at first, it ends up being extremely simple in your plugin code and perfect for "decorating" your classes with appearance traits and behavioral properties. | |||
@@ -60,49 +62,70 @@ For example, need a slider with a green LED? Just use | |||
createLightParamCentered<LEDLightSlider<GreenLight>>(...) | |||
*/ | |||
template <typename TBase = app::ModuleLightWidget> | |||
struct TGrayModuleLightWidget : TBase { | |||
template <typename Base = app::ModuleLightWidget> | |||
struct TSvgLight : Base { | |||
widget::FramebufferWidget* fb; | |||
widget::SvgWidget* sw; | |||
TSvgLight() { | |||
fb = new widget::FramebufferWidget; | |||
this->addChild(fb); | |||
sw = new widget::SvgWidget; | |||
fb->addChild(sw); | |||
} | |||
void setSvg(std::shared_ptr<Svg> svg) { | |||
sw->setSvg(svg); | |||
fb->box.size = sw->box.size; | |||
this->box.size = sw->box.size; | |||
} | |||
}; | |||
typedef TSvgLight<> SvgLight; | |||
template <typename Base = app::ModuleLightWidget> | |||
struct TGrayModuleLightWidget : Base { | |||
TGrayModuleLightWidget() { | |||
this->bgColor = nvgRGB(0x5a, 0x5a, 0x5a); | |||
this->borderColor = nvgRGBA(0, 0, 0, 0x60); | |||
this->bgColor = nvgRGBA(0xaf, 0xaf, 0xaf, 0xff); | |||
this->borderColor = nvgRGBA(0, 0, 0, 53); | |||
} | |||
}; | |||
typedef TGrayModuleLightWidget<> GrayModuleLightWidget; | |||
template <typename TBase = GrayModuleLightWidget> | |||
struct TRedLight : TBase { | |||
template <typename Base = GrayModuleLightWidget> | |||
struct TRedLight : Base { | |||
TRedLight() { | |||
this->addBaseColor(SCHEME_RED); | |||
} | |||
}; | |||
typedef TRedLight<> RedLight; | |||
template <typename TBase = GrayModuleLightWidget> | |||
struct TGreenLight : TBase { | |||
template <typename Base = GrayModuleLightWidget> | |||
struct TGreenLight : Base { | |||
TGreenLight() { | |||
this->addBaseColor(SCHEME_GREEN); | |||
} | |||
}; | |||
typedef TGreenLight<> GreenLight; | |||
template <typename TBase = GrayModuleLightWidget> | |||
struct TYellowLight : TBase { | |||
template <typename Base = GrayModuleLightWidget> | |||
struct TYellowLight : Base { | |||
TYellowLight() { | |||
this->addBaseColor(SCHEME_YELLOW); | |||
} | |||
}; | |||
typedef TYellowLight<> YellowLight; | |||
template <typename TBase = GrayModuleLightWidget> | |||
struct TBlueLight : TBase { | |||
template <typename Base = GrayModuleLightWidget> | |||
struct TBlueLight : Base { | |||
TBlueLight() { | |||
this->addBaseColor(SCHEME_BLUE); | |||
} | |||
}; | |||
typedef TBlueLight<> BlueLight; | |||
template <typename TBase = GrayModuleLightWidget> | |||
struct TWhiteLight : TBase { | |||
template <typename Base = GrayModuleLightWidget> | |||
struct TWhiteLight : Base { | |||
TWhiteLight() { | |||
this->addBaseColor(SCHEME_WHITE); | |||
} | |||
@@ -110,8 +133,8 @@ struct TWhiteLight : TBase { | |||
typedef TWhiteLight<> WhiteLight; | |||
/** Reads two adjacent lightIds, so `lightId` and `lightId + 1` must be defined */ | |||
template <typename TBase = GrayModuleLightWidget> | |||
struct TGreenRedLight : TBase { | |||
template <typename Base = GrayModuleLightWidget> | |||
struct TGreenRedLight : Base { | |||
TGreenRedLight() { | |||
this->addBaseColor(SCHEME_GREEN); | |||
this->addBaseColor(SCHEME_RED); | |||
@@ -119,8 +142,8 @@ struct TGreenRedLight : TBase { | |||
}; | |||
typedef TGreenRedLight<> GreenRedLight; | |||
template <typename TBase = GrayModuleLightWidget> | |||
struct TRedGreenBlueLight : TBase { | |||
template <typename Base = GrayModuleLightWidget> | |||
struct TRedGreenBlueLight : Base { | |||
TRedGreenBlueLight() { | |||
this->addBaseColor(SCHEME_RED); | |||
this->addBaseColor(SCHEME_GREEN); | |||
@@ -130,39 +153,39 @@ struct TRedGreenBlueLight : TBase { | |||
typedef TRedGreenBlueLight<> RedGreenBlueLight; | |||
/** Based on the size of 5mm LEDs */ | |||
template <typename TBase> | |||
struct LargeLight : TBase { | |||
template <typename Base> | |||
struct LargeLight : TSvgLight<Base> { | |||
LargeLight() { | |||
this->box.size = mm2px(math::Vec(5.179, 5.179)); | |||
this->setSvg(Svg::load(asset::system("res/ComponentLibrary/LargeLight.svg"))); | |||
} | |||
}; | |||
/** Based on the size of 3mm LEDs */ | |||
template <typename TBase> | |||
struct MediumLight : TBase { | |||
template <typename Base> | |||
struct MediumLight : TSvgLight<Base> { | |||
MediumLight() { | |||
this->box.size = mm2px(math::Vec(3.176, 3.176)); | |||
this->setSvg(Svg::load(asset::system("res/ComponentLibrary/MediumLight.svg"))); | |||
} | |||
}; | |||
/** Based on the size of 2mm LEDs */ | |||
template <typename TBase> | |||
struct SmallLight : TBase { | |||
template <typename Base> | |||
struct SmallLight : TSvgLight<Base> { | |||
SmallLight() { | |||
this->box.size = mm2px(math::Vec(2.176, 2.176)); | |||
this->setSvg(Svg::load(asset::system("res/ComponentLibrary/SmallLight.svg"))); | |||
} | |||
}; | |||
/** Based on the size of 1mm LEDs */ | |||
template <typename TBase> | |||
struct TinyLight : TBase { | |||
template <typename Base> | |||
struct TinyLight : TSvgLight<Base> { | |||
TinyLight() { | |||
this->box.size = mm2px(math::Vec(1.088, 1.088)); | |||
this->setSvg(Svg::load(asset::system("res/ComponentLibrary/TinyLight.svg"))); | |||
} | |||
}; | |||
template <typename TBase> | |||
struct RectangleLight : TBase { | |||
template <typename Base> | |||
struct RectangleLight : Base { | |||
void drawLight(const widget::Widget::DrawArgs& args) override { | |||
nvgBeginPath(args.vg); | |||
nvgRect(args.vg, 0, 0, this->box.size.x, this->box.size.y); | |||
@@ -189,8 +212,8 @@ struct RectangleLight : TBase { | |||
}; | |||
/** A light for displaying on top of PB61303. Must add a color by subclassing or templating. */ | |||
template <typename TBase> | |||
struct LEDBezelLight : TBase { | |||
template <typename Base> | |||
struct LEDBezelLight : Base { | |||
LEDBezelLight() { | |||
this->bgColor = color::BLACK_TRANSPARENT; | |||
this->box.size = mm2px(math::Vec(6.0, 6.0)); | |||
@@ -200,8 +223,8 @@ struct LEDBezelLight : TBase { | |||
/** A light to displayed over PB61303. Must add a color by subclassing or templating. | |||
Don't add this as a child of the PB61303 itself. Instead, just place it over it as a sibling in the scene graph, offset by mm2px(math::Vec(0.5, 0.5)). | |||
*/ | |||
template <typename TBase> | |||
struct PB61303Light : TBase { | |||
template <typename Base> | |||
struct PB61303Light : Base { | |||
PB61303Light() { | |||
this->bgColor = color::BLACK_TRANSPARENT; | |||
this->box.size = mm2px(math::Vec(9.0, 9.0)); | |||
@@ -638,8 +661,8 @@ struct LEDSliderHorizontal : app::SvgSlider { | |||
} | |||
}; | |||
template <typename TBase, typename TLightBase = RedLight> | |||
struct LightSlider : TBase { | |||
template <typename Base, typename TLightBase = RedLight> | |||
struct LightSlider : Base { | |||
app::ModuleLightWidget* light; | |||
LightSlider() { | |||
@@ -653,11 +676,11 @@ struct LightSlider : TBase { | |||
} | |||
void step() override { | |||
TBase::step(); | |||
Base::step(); | |||
// Move center of light to center of handle | |||
light->box.pos = this->handle->box.pos | |||
.plus(this->handle->box.size.div(2)) | |||
.minus(light->box.size.div(2)); | |||
.plus(this->handle->box.size.div(2)) | |||
.minus(light->box.size.div(2)); | |||
} | |||
}; | |||
@@ -0,0 +1,98 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<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" | |||
version="1.0" | |||
id="svg164153" | |||
x="0mm" | |||
y="0mm" | |||
width="5mm" | |||
height="5mm" | |||
viewBox="0 0 5 5" | |||
enable-background="new 0 0 5 5" | |||
xml:space="preserve" | |||
sodipodi:docname="LargeLed.svg" | |||
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"><metadata | |||
id="metadata22"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs | |||
id="defs20" /> | |||
<sodipodi:namedview | |||
bordercolor="#666666" | |||
borderopacity="1.0" | |||
fit-margin-bottom="0" | |||
fit-margin-left="0" | |||
fit-margin-right="0" | |||
fit-margin-top="0" | |||
id="base" | |||
inkscape:current-layer="svg164153" | |||
inkscape:cx="-50.865388" | |||
inkscape:cy="-9.1133715" | |||
inkscape:document-units="mm" | |||
inkscape:pageopacity="0.0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-height="882" | |||
inkscape:window-maximized="0" | |||
inkscape:window-width="1600" | |||
inkscape:window-x="0" | |||
inkscape:window-y="18" | |||
inkscape:zoom="7.9195959" | |||
pagecolor="#ffffff" | |||
showgrid="false" | |||
inkscape:document-rotation="0"> | |||
</sodipodi:namedview> | |||
<linearGradient | |||
id="SVGID_1_" | |||
gradientUnits="userSpaceOnUse" | |||
x1="2.5" | |||
y1="0.45675" | |||
x2="2.5" | |||
y2="2.29732"> | |||
<stop | |||
offset="0" | |||
style="stop-color:#FDFDFF" | |||
id="stop5" /> | |||
<stop | |||
offset="1" | |||
style="stop-color:#FCFEFF;stop-opacity:0" | |||
id="stop7" /> | |||
</linearGradient> | |||
<ellipse | |||
fill="url(#SVGID_1_)" | |||
cx="2.5" | |||
cy="1.37704" | |||
rx="1.51927" | |||
ry="0.92029" | |||
id="ellipse10" /> | |||
<linearGradient | |||
id="SVGID_2_" | |||
gradientUnits="userSpaceOnUse" | |||
x1="-1250.25732" | |||
y1="-1002.16425" | |||
x2="-1250.25732" | |||
y2="-1000.32367" | |||
gradientTransform="matrix(-1 0 0 -1 -1247.75732 -997.58325)"> | |||
<stop | |||
offset="0" | |||
style="stop-color:#FDFDFF" | |||
id="stop12" /> | |||
<stop | |||
offset="1" | |||
style="stop-color:#FCFEFF;stop-opacity:0" | |||
id="stop14" /> | |||
</linearGradient> | |||
<ellipse | |||
opacity="0.3" | |||
fill="url(#SVGID_2_)" | |||
cx="2.5" | |||
cy="3.66071" | |||
rx="1.51927" | |||
ry="0.92029" | |||
id="ellipse17" /> | |||
</svg> |
@@ -0,0 +1,98 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<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" | |||
version="1.0" | |||
id="svg164153" | |||
x="0mm" | |||
y="0mm" | |||
width="3mm" | |||
height="3mm" | |||
viewBox="0 0 3 3" | |||
enable-background="new 0 0 3 3" | |||
xml:space="preserve" | |||
sodipodi:docname="MediumLight.svg" | |||
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"><metadata | |||
id="metadata22"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs | |||
id="defs20" /> | |||
<sodipodi:namedview | |||
bordercolor="#666666" | |||
borderopacity="1.0" | |||
fit-margin-bottom="0" | |||
fit-margin-left="0" | |||
fit-margin-right="0" | |||
fit-margin-top="0" | |||
id="base" | |||
inkscape:current-layer="svg164153" | |||
inkscape:cx="10.136396" | |||
inkscape:cy="10.750772" | |||
inkscape:document-units="mm" | |||
inkscape:pageopacity="0.0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-height="882" | |||
inkscape:window-maximized="0" | |||
inkscape:window-width="1600" | |||
inkscape:window-x="0" | |||
inkscape:window-y="18" | |||
inkscape:zoom="28.975876" | |||
pagecolor="#ffffff" | |||
showgrid="false" | |||
inkscape:document-rotation="0"> | |||
</sodipodi:namedview> | |||
<linearGradient | |||
id="SVGID_1_" | |||
gradientUnits="userSpaceOnUse" | |||
x1="1.5" | |||
y1="0.27405" | |||
x2="1.5" | |||
y2="1.37839"> | |||
<stop | |||
offset="0" | |||
style="stop-color:#FDFDFF" | |||
id="stop5" /> | |||
<stop | |||
offset="1" | |||
style="stop-color:#FCFEFF;stop-opacity:0" | |||
id="stop7" /> | |||
</linearGradient> | |||
<ellipse | |||
fill="url(#SVGID_1_)" | |||
cx="1.5" | |||
cy="0.82622" | |||
rx="0.91156" | |||
ry="0.55217" | |||
id="ellipse10" /> | |||
<linearGradient | |||
id="SVGID_2_" | |||
gradientUnits="userSpaceOnUse" | |||
x1="-1249.25732" | |||
y1="-1000.33185" | |||
x2="-1249.25732" | |||
y2="-999.22754" | |||
gradientTransform="matrix(-1 0 0 -1 -1247.75732 -997.58325)"> | |||
<stop | |||
offset="0" | |||
style="stop-color:#FDFDFF" | |||
id="stop12" /> | |||
<stop | |||
offset="1" | |||
style="stop-color:#FCFEFF;stop-opacity:0" | |||
id="stop14" /> | |||
</linearGradient> | |||
<ellipse | |||
opacity="0.3" | |||
fill="url(#SVGID_2_)" | |||
cx="1.5" | |||
cy="2.19643" | |||
rx="0.91156" | |||
ry="0.55217" | |||
id="ellipse17" /> | |||
</svg> |
@@ -0,0 +1,98 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<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" | |||
version="1.0" | |||
id="svg164153" | |||
x="0mm" | |||
y="0mm" | |||
width="2mm" | |||
height="2mm" | |||
viewBox="0 0 2 2" | |||
enable-background="new 0 0 2 2" | |||
xml:space="preserve" | |||
sodipodi:docname="SmallLed.svg" | |||
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"><metadata | |||
id="metadata22"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs | |||
id="defs20" /> | |||
<sodipodi:namedview | |||
bordercolor="#666666" | |||
borderopacity="1.0" | |||
fit-margin-bottom="0" | |||
fit-margin-left="0" | |||
fit-margin-right="0" | |||
fit-margin-top="0" | |||
id="base" | |||
inkscape:current-layer="svg164153" | |||
inkscape:cx="4.0653199" | |||
inkscape:cy="4.1789873" | |||
inkscape:document-units="mm" | |||
inkscape:pageopacity="0.0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-height="882" | |||
inkscape:window-maximized="0" | |||
inkscape:window-width="1600" | |||
inkscape:window-x="0" | |||
inkscape:window-y="18" | |||
inkscape:zoom="61.023759" | |||
pagecolor="#ffffff" | |||
showgrid="false" | |||
inkscape:document-rotation="0"> | |||
</sodipodi:namedview> | |||
<linearGradient | |||
id="SVGID_1_" | |||
gradientUnits="userSpaceOnUse" | |||
x1="1" | |||
y1="0.1827" | |||
x2="1" | |||
y2="0.91893"> | |||
<stop | |||
offset="0" | |||
style="stop-color:#FDFDFF" | |||
id="stop5" /> | |||
<stop | |||
offset="1" | |||
style="stop-color:#FCFEFF;stop-opacity:0" | |||
id="stop7" /> | |||
</linearGradient> | |||
<ellipse | |||
fill="url(#SVGID_1_)" | |||
cx="1" | |||
cy="0.55081" | |||
rx="0.60771" | |||
ry="0.36811" | |||
id="ellipse10" /> | |||
<linearGradient | |||
id="SVGID_2_" | |||
gradientUnits="userSpaceOnUse" | |||
x1="-1248.75732" | |||
y1="-999.41565" | |||
x2="-1248.75732" | |||
y2="-998.67944" | |||
gradientTransform="matrix(-1 0 0 -1 -1247.75732 -997.58325)"> | |||
<stop | |||
offset="0" | |||
style="stop-color:#FDFDFF" | |||
id="stop12" /> | |||
<stop | |||
offset="1" | |||
style="stop-color:#FCFEFF;stop-opacity:0" | |||
id="stop14" /> | |||
</linearGradient> | |||
<ellipse | |||
opacity="0.3" | |||
fill="url(#SVGID_2_)" | |||
cx="1" | |||
cy="1.46428" | |||
rx="0.60771" | |||
ry="0.36811" | |||
id="ellipse17" /> | |||
</svg> |
@@ -0,0 +1,98 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<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" | |||
version="1.0" | |||
id="svg164153" | |||
x="0mm" | |||
y="0mm" | |||
width="1mm" | |||
height="1mm" | |||
viewBox="0 0 1 1" | |||
enable-background="new 0 0 1 1" | |||
xml:space="preserve" | |||
sodipodi:docname="TinyLed.svg" | |||
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"><metadata | |||
id="metadata22"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs | |||
id="defs20" /> | |||
<sodipodi:namedview | |||
bordercolor="#666666" | |||
borderopacity="1.0" | |||
fit-margin-bottom="0" | |||
fit-margin-left="0" | |||
fit-margin-right="0" | |||
fit-margin-top="0" | |||
id="base" | |||
inkscape:current-layer="svg164153" | |||
inkscape:cx="-15.084364" | |||
inkscape:cy="-0.73704599" | |||
inkscape:document-units="mm" | |||
inkscape:pageopacity="0.0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-height="882" | |||
inkscape:window-maximized="0" | |||
inkscape:window-width="1600" | |||
inkscape:window-x="0" | |||
inkscape:window-y="18" | |||
inkscape:zoom="22.165173" | |||
pagecolor="#ffffff" | |||
showgrid="false" | |||
inkscape:document-rotation="0"> | |||
</sodipodi:namedview> | |||
<linearGradient | |||
id="SVGID_1_" | |||
gradientUnits="userSpaceOnUse" | |||
x1="0.5" | |||
y1="0.09135" | |||
x2="0.5" | |||
y2="0.45946"> | |||
<stop | |||
offset="0" | |||
style="stop-color:#FDFDFF" | |||
id="stop5" /> | |||
<stop | |||
offset="1" | |||
style="stop-color:#FCFEFF;stop-opacity:0" | |||
id="stop7" /> | |||
</linearGradient> | |||
<ellipse | |||
fill="url(#SVGID_1_)" | |||
cx="0.5" | |||
cy="0.27541" | |||
rx="0.30385" | |||
ry="0.18406" | |||
id="ellipse10" /> | |||
<linearGradient | |||
id="SVGID_2_" | |||
gradientUnits="userSpaceOnUse" | |||
x1="-1248.25732" | |||
y1="-998.49945" | |||
x2="-1248.25732" | |||
y2="-998.13135" | |||
gradientTransform="matrix(-1 0 0 -1 -1247.75732 -997.58325)"> | |||
<stop | |||
offset="0" | |||
style="stop-color:#FDFDFF" | |||
id="stop12" /> | |||
<stop | |||
offset="1" | |||
style="stop-color:#FCFEFF;stop-opacity:0" | |||
id="stop14" /> | |||
</linearGradient> | |||
<ellipse | |||
opacity="0.3" | |||
fill="url(#SVGID_2_)" | |||
cx="0.5" | |||
cy="0.73214" | |||
rx="0.30385" | |||
ry="0.18406" | |||
id="ellipse17" /> | |||
</svg> |
@@ -9,6 +9,7 @@ namespace app { | |||
void LightWidget::draw(const DrawArgs& args) { | |||
drawLight(args); | |||
drawHalo(args); | |||
TransparentWidget::draw(args); | |||
} | |||
void LightWidget::drawLight(const DrawArgs& args) { | |||
@@ -115,6 +115,8 @@ void ModuleLightWidget::step() { | |||
} | |||
setBrightnesses(brightnesses); | |||
MultiLightWidget::step(); | |||
} | |||