@@ -1,4 +1,6 @@ | |||||
#pragma once | #pragma once | ||||
#include <widget/FramebufferWidget.hpp> | |||||
#include <widget/SvgWidget.hpp> | |||||
#include <app/SvgKnob.hpp> | #include <app/SvgKnob.hpp> | ||||
#include <app/SvgSlider.hpp> | #include <app/SvgSlider.hpp> | ||||
#include <app/SvgPort.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.) | 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>` | 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. | 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>>(...) | 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() { | 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; | typedef TGrayModuleLightWidget<> GrayModuleLightWidget; | ||||
template <typename TBase = GrayModuleLightWidget> | |||||
struct TRedLight : TBase { | |||||
template <typename Base = GrayModuleLightWidget> | |||||
struct TRedLight : Base { | |||||
TRedLight() { | TRedLight() { | ||||
this->addBaseColor(SCHEME_RED); | this->addBaseColor(SCHEME_RED); | ||||
} | } | ||||
}; | }; | ||||
typedef TRedLight<> RedLight; | typedef TRedLight<> RedLight; | ||||
template <typename TBase = GrayModuleLightWidget> | |||||
struct TGreenLight : TBase { | |||||
template <typename Base = GrayModuleLightWidget> | |||||
struct TGreenLight : Base { | |||||
TGreenLight() { | TGreenLight() { | ||||
this->addBaseColor(SCHEME_GREEN); | this->addBaseColor(SCHEME_GREEN); | ||||
} | } | ||||
}; | }; | ||||
typedef TGreenLight<> GreenLight; | typedef TGreenLight<> GreenLight; | ||||
template <typename TBase = GrayModuleLightWidget> | |||||
struct TYellowLight : TBase { | |||||
template <typename Base = GrayModuleLightWidget> | |||||
struct TYellowLight : Base { | |||||
TYellowLight() { | TYellowLight() { | ||||
this->addBaseColor(SCHEME_YELLOW); | this->addBaseColor(SCHEME_YELLOW); | ||||
} | } | ||||
}; | }; | ||||
typedef TYellowLight<> YellowLight; | typedef TYellowLight<> YellowLight; | ||||
template <typename TBase = GrayModuleLightWidget> | |||||
struct TBlueLight : TBase { | |||||
template <typename Base = GrayModuleLightWidget> | |||||
struct TBlueLight : Base { | |||||
TBlueLight() { | TBlueLight() { | ||||
this->addBaseColor(SCHEME_BLUE); | this->addBaseColor(SCHEME_BLUE); | ||||
} | } | ||||
}; | }; | ||||
typedef TBlueLight<> BlueLight; | typedef TBlueLight<> BlueLight; | ||||
template <typename TBase = GrayModuleLightWidget> | |||||
struct TWhiteLight : TBase { | |||||
template <typename Base = GrayModuleLightWidget> | |||||
struct TWhiteLight : Base { | |||||
TWhiteLight() { | TWhiteLight() { | ||||
this->addBaseColor(SCHEME_WHITE); | this->addBaseColor(SCHEME_WHITE); | ||||
} | } | ||||
@@ -110,8 +133,8 @@ struct TWhiteLight : TBase { | |||||
typedef TWhiteLight<> WhiteLight; | typedef TWhiteLight<> WhiteLight; | ||||
/** Reads two adjacent lightIds, so `lightId` and `lightId + 1` must be defined */ | /** 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() { | TGreenRedLight() { | ||||
this->addBaseColor(SCHEME_GREEN); | this->addBaseColor(SCHEME_GREEN); | ||||
this->addBaseColor(SCHEME_RED); | this->addBaseColor(SCHEME_RED); | ||||
@@ -119,8 +142,8 @@ struct TGreenRedLight : TBase { | |||||
}; | }; | ||||
typedef TGreenRedLight<> GreenRedLight; | typedef TGreenRedLight<> GreenRedLight; | ||||
template <typename TBase = GrayModuleLightWidget> | |||||
struct TRedGreenBlueLight : TBase { | |||||
template <typename Base = GrayModuleLightWidget> | |||||
struct TRedGreenBlueLight : Base { | |||||
TRedGreenBlueLight() { | TRedGreenBlueLight() { | ||||
this->addBaseColor(SCHEME_RED); | this->addBaseColor(SCHEME_RED); | ||||
this->addBaseColor(SCHEME_GREEN); | this->addBaseColor(SCHEME_GREEN); | ||||
@@ -130,39 +153,39 @@ struct TRedGreenBlueLight : TBase { | |||||
typedef TRedGreenBlueLight<> RedGreenBlueLight; | typedef TRedGreenBlueLight<> RedGreenBlueLight; | ||||
/** Based on the size of 5mm LEDs */ | /** Based on the size of 5mm LEDs */ | ||||
template <typename TBase> | |||||
struct LargeLight : TBase { | |||||
template <typename Base> | |||||
struct LargeLight : TSvgLight<Base> { | |||||
LargeLight() { | 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 */ | /** Based on the size of 3mm LEDs */ | ||||
template <typename TBase> | |||||
struct MediumLight : TBase { | |||||
template <typename Base> | |||||
struct MediumLight : TSvgLight<Base> { | |||||
MediumLight() { | 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 */ | /** Based on the size of 2mm LEDs */ | ||||
template <typename TBase> | |||||
struct SmallLight : TBase { | |||||
template <typename Base> | |||||
struct SmallLight : TSvgLight<Base> { | |||||
SmallLight() { | 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 */ | /** Based on the size of 1mm LEDs */ | ||||
template <typename TBase> | |||||
struct TinyLight : TBase { | |||||
template <typename Base> | |||||
struct TinyLight : TSvgLight<Base> { | |||||
TinyLight() { | 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 { | void drawLight(const widget::Widget::DrawArgs& args) override { | ||||
nvgBeginPath(args.vg); | nvgBeginPath(args.vg); | ||||
nvgRect(args.vg, 0, 0, this->box.size.x, this->box.size.y); | 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. */ | /** 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() { | LEDBezelLight() { | ||||
this->bgColor = color::BLACK_TRANSPARENT; | this->bgColor = color::BLACK_TRANSPARENT; | ||||
this->box.size = mm2px(math::Vec(6.0, 6.0)); | 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. | /** 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)). | 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() { | PB61303Light() { | ||||
this->bgColor = color::BLACK_TRANSPARENT; | this->bgColor = color::BLACK_TRANSPARENT; | ||||
this->box.size = mm2px(math::Vec(9.0, 9.0)); | 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; | app::ModuleLightWidget* light; | ||||
LightSlider() { | LightSlider() { | ||||
@@ -653,11 +676,11 @@ struct LightSlider : TBase { | |||||
} | } | ||||
void step() override { | void step() override { | ||||
TBase::step(); | |||||
Base::step(); | |||||
// Move center of light to center of handle | // Move center of light to center of handle | ||||
light->box.pos = this->handle->box.pos | 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) { | void LightWidget::draw(const DrawArgs& args) { | ||||
drawLight(args); | drawLight(args); | ||||
drawHalo(args); | drawHalo(args); | ||||
TransparentWidget::draw(args); | |||||
} | } | ||||
void LightWidget::drawLight(const DrawArgs& args) { | void LightWidget::drawLight(const DrawArgs& args) { | ||||
@@ -115,6 +115,8 @@ void ModuleLightWidget::step() { | |||||
} | } | ||||
setBrightnesses(brightnesses); | setBrightnesses(brightnesses); | ||||
MultiLightWidget::step(); | |||||
} | } | ||||