@@ -74,14 +74,11 @@ struct ModuleWidget : OpaqueWidget { | |||
void onDragMove(EventDragMove &e) override; | |||
}; | |||
struct ValueLight; | |||
struct WireWidget : OpaqueWidget { | |||
Port *outputPort = NULL; | |||
Port *inputPort = NULL; | |||
Port *hoveredOutputPort = NULL; | |||
Port *hoveredInputPort = NULL; | |||
ValueLight *inputLight; | |||
ValueLight *outputLight; | |||
Wire *wire = NULL; | |||
NVGcolor color; | |||
@@ -227,14 +224,14 @@ struct SVGKnob : virtual Knob, FramebufferWidget { | |||
void onChange(EventChange &e) override; | |||
}; | |||
struct SVGSlider : Knob, FramebufferWidget { | |||
struct SVGFader : Knob, FramebufferWidget { | |||
/** Intermediate positions will be interpolated between these positions */ | |||
Vec minHandlePos, maxHandlePos; | |||
/** Not owned */ | |||
SVGWidget *background; | |||
SVGWidget *handle; | |||
SVGSlider(); | |||
SVGFader(); | |||
void step() override; | |||
void onChange(EventChange &e) override; | |||
}; | |||
@@ -271,6 +268,8 @@ struct MomentarySwitch : virtual Switch { | |||
void randomize() override {} | |||
void onDragStart(EventDragStart &e) override { | |||
setValue(maxValue); | |||
EventAction eAction; | |||
onAction(eAction); | |||
} | |||
void onDragEnd(EventDragEnd &e) override { | |||
setValue(minValue); | |||
@@ -285,6 +284,8 @@ struct LightWidget : TransparentWidget { | |||
NVGcolor bgColor = nvgRGBf(0, 0, 0); | |||
NVGcolor color = nvgRGBf(1, 1, 1); | |||
void draw(NVGcontext *vg) override; | |||
virtual void drawLight(NVGcontext *vg); | |||
virtual void drawHalo(NVGcontext *vg); | |||
}; | |||
/** Mixes a list of colors based on a list of brightness values */ | |||
@@ -322,7 +322,7 @@ struct BefacoTinyKnob : SVGKnob { | |||
} | |||
}; | |||
struct BefacoSlidePot : SVGSlider { | |||
struct BefacoSlidePot : SVGFader { | |||
BefacoSlidePot() { | |||
Vec margin = Vec(3.5, 3.5); | |||
maxHandlePos = Vec(-1, -2).plus(margin); | |||
@@ -5,35 +5,46 @@ namespace rack { | |||
void LightWidget::draw(NVGcontext *vg) { | |||
float radius = box.size.x / 2.0; | |||
float oradius = radius + 15.0; | |||
color.r = clampf(color.r, 0.0, 1.0); | |||
color.g = clampf(color.g, 0.0, 1.0); | |||
color.b = clampf(color.b, 0.0, 1.0); | |||
color.a = clampf(color.a, 0.0, 1.0); | |||
// Solid | |||
drawLight(vg); | |||
drawHalo(vg); | |||
} | |||
void LightWidget::drawLight(NVGcontext *vg) { | |||
float radius = box.size.x / 2.0; | |||
nvgBeginPath(vg); | |||
nvgCircle(vg, radius, radius, radius); | |||
// Background | |||
nvgFillColor(vg, bgColor); | |||
nvgFill(vg); | |||
// Border | |||
nvgStrokeWidth(vg, 1.0); | |||
NVGcolor borderColor = bgColor; | |||
borderColor.a *= 0.5; | |||
nvgStrokeColor(vg, borderColor); | |||
nvgStroke(vg); | |||
// // Border | |||
// nvgStrokeWidth(vg, 1.0); | |||
// NVGcolor borderColor = bgColor; | |||
// borderColor.a *= 0.5; | |||
// nvgStrokeColor(vg, borderColor); | |||
// nvgStroke(vg); | |||
// Inner glow | |||
nvgGlobalCompositeOperation(vg, NVG_LIGHTER); | |||
nvgFillColor(vg, color); | |||
nvgFill(vg); | |||
} | |||
void LightWidget::drawHalo(NVGcontext *vg) { | |||
float radius = box.size.x / 2.0; | |||
float oradius = radius + 15.0; | |||
// Outer glow | |||
nvgBeginPath(vg); | |||
nvgRect(vg, radius - oradius, radius - oradius, 2*oradius, 2*oradius); | |||
NVGpaint paint; | |||
NVGcolor icol = color; | |||
icol.a *= 0.10; | |||
@@ -41,8 +52,11 @@ void LightWidget::draw(NVGcontext *vg) { | |||
ocol.a = 0.0; | |||
paint = nvgRadialGradient(vg, radius, radius, radius, oradius, icol, ocol); | |||
nvgFillPaint(vg, paint); | |||
nvgGlobalCompositeOperation(vg, NVG_LIGHTER); | |||
nvgFill(vg); | |||
} | |||
} // namespace rack |
@@ -4,7 +4,7 @@ | |||
namespace rack { | |||
SVGSlider::SVGSlider() { | |||
SVGFader::SVGFader() { | |||
background = new SVGWidget(); | |||
addChild(background); | |||
@@ -12,7 +12,7 @@ SVGSlider::SVGSlider() { | |||
addChild(handle); | |||
} | |||
void SVGSlider::step() { | |||
void SVGFader::step() { | |||
if (dirty) { | |||
// Update handle position | |||
Vec handlePos = Vec(rescalef(value, minValue, maxValue, minHandlePos.x, maxHandlePos.x), rescalef(value, minValue, maxValue, minHandlePos.y, maxHandlePos.y)); | |||
@@ -21,7 +21,7 @@ void SVGSlider::step() { | |||
FramebufferWidget::step(); | |||
} | |||
void SVGSlider::onChange(EventChange &e) { | |||
void SVGFader::onChange(EventChange &e) { | |||
dirty = true; | |||
Knob::onChange(e); | |||
} |
@@ -86,11 +86,6 @@ static int lastWireColorId = -1; | |||
WireWidget::WireWidget() { | |||
lastWireColorId = (lastWireColorId + 1) % LENGTHOF(wireColors); | |||
color = wireColors[lastWireColorId]; | |||
// inputLight = construct<PolarityLight>(&PolarityLight::posColor, COLOR_GREEN, &PolarityLight::negColor, COLOR_RED); | |||
// outputLight = construct<PolarityLight>(&PolarityLight::posColor, COLOR_GREEN, &PolarityLight::negColor, COLOR_RED); | |||
// addChild(inputLight); | |||
// addChild(outputLight); | |||
} | |||
WireWidget::~WireWidget() { | |||