| @@ -129,6 +129,8 @@ struct Knob : ParamWidget { | |||
| void onDragStart(); | |||
| void onDragMove(Vec mouseRel); | |||
| void onDragEnd(); | |||
| /** Tell engine to smoothly vary this parameter */ | |||
| void onChange(); | |||
| }; | |||
| struct SpriteKnob : Knob, SpriteWidget { | |||
| @@ -164,7 +166,6 @@ struct SVGSlider : Knob, FramebufferWidget { | |||
| }; | |||
| struct Switch : ParamWidget { | |||
| virtual void setIndex(int index) {} | |||
| }; | |||
| struct SVGSwitch : virtual Switch, FramebufferWidget { | |||
| @@ -175,8 +176,8 @@ struct SVGSwitch : virtual Switch, FramebufferWidget { | |||
| SVGSwitch(); | |||
| /** Adds an SVG file to represent the next switch position */ | |||
| void addFrame(std::shared_ptr<SVG> svg); | |||
| void setIndex(int index); | |||
| void step(); | |||
| void onChange(); | |||
| }; | |||
| /** A switch that cycles through each mechanical position */ | |||
| @@ -184,31 +185,10 @@ struct ToggleSwitch : virtual Switch { | |||
| void onDragStart() { | |||
| // Cycle through values | |||
| // e.g. a range of [0.0, 3.0] would have modes 0, 1, 2, and 3. | |||
| float v = value + 1.0; | |||
| setValue(v <= maxValue ? v : minValue); | |||
| } | |||
| void onChange() { | |||
| int index = (int)roundf(value); | |||
| setIndex(index); | |||
| ParamWidget::onChange(); | |||
| } | |||
| }; | |||
| /** FIXME I don't think this should exist. The audio engine should read from a MomentarySwitch and increment its internal state, instead of relying on the knob to do that logic. */ | |||
| struct ModeSwitch : virtual Switch { | |||
| void onDragStart() { | |||
| setIndex(1); | |||
| } | |||
| void onDragEnd() { | |||
| setIndex(0); | |||
| } | |||
| void onDragDrop(Widget *origin) { | |||
| if (origin != this) | |||
| return; | |||
| // Cycle through values | |||
| // e.g. a range of [0.0, 3.0] would have modes 0, 1, 2, and 3. | |||
| float v = value + 1.0; | |||
| setValue(v <= maxValue ? v : minValue); | |||
| if (value >= maxValue) | |||
| setValue(minValue); | |||
| else | |||
| setValue(value + 1.0); | |||
| } | |||
| }; | |||
| @@ -216,11 +196,9 @@ struct ModeSwitch : virtual Switch { | |||
| struct MomentarySwitch : virtual Switch { | |||
| void onDragStart() { | |||
| setValue(maxValue); | |||
| setIndex(1); | |||
| } | |||
| void onDragEnd() { | |||
| setValue(minValue); | |||
| setIndex(0); | |||
| } | |||
| }; | |||
| @@ -413,7 +413,7 @@ struct SmallLight : BASE { | |||
| }; | |||
| //////////////////// | |||
| // Switches | |||
| // Switches and Buttons | |||
| //////////////////// | |||
| struct NKK : SVGSwitch, ToggleSwitch { | |||
| @@ -426,6 +426,52 @@ struct NKK : SVGSwitch, ToggleSwitch { | |||
| } | |||
| }; | |||
| struct CKSS : SVGSwitch, ToggleSwitch { | |||
| CKSS() { | |||
| addFrame(SVG::load("res/ComponentLibrary/CKSS0.svg")); | |||
| addFrame(SVG::load("res/ComponentLibrary/CKSS1.svg")); | |||
| sw->wrap(); | |||
| box.size = sw->box.size; | |||
| } | |||
| }; | |||
| struct CKD6 : SVGSwitch, MomentarySwitch { | |||
| CKD6() { | |||
| addFrame(SVG::load("res/ComponentLibrary/CKD6_0.svg")); | |||
| addFrame(SVG::load("res/ComponentLibrary/CKD6_1.svg")); | |||
| sw->wrap(); | |||
| box.size = sw->box.size; | |||
| } | |||
| }; | |||
| struct TL1105 : SVGSwitch, MomentarySwitch { | |||
| TL1105() { | |||
| addFrame(SVG::load("res/ComponentLibrary/TL1105_0.svg")); | |||
| addFrame(SVG::load("res/ComponentLibrary/TL1105_1.svg")); | |||
| sw->wrap(); | |||
| box.size = sw->box.size; | |||
| } | |||
| }; | |||
| struct BefacoSwitch : SVGSwitch, ToggleSwitch { | |||
| BefacoSwitch() { | |||
| addFrame(SVG::load("res/ComponentLibrary/BefacoSwitch_0.svg")); | |||
| addFrame(SVG::load("res/ComponentLibrary/BefacoSwitch_1.svg")); | |||
| addFrame(SVG::load("res/ComponentLibrary/BefacoSwitch_2.svg")); | |||
| sw->wrap(); | |||
| box.size = sw->box.size; | |||
| } | |||
| }; | |||
| struct BefacoPush : SVGSwitch, MomentarySwitch { | |||
| BefacoPush() { | |||
| addFrame(SVG::load("res/ComponentLibrary/BefacoPush_0.svg")); | |||
| addFrame(SVG::load("res/ComponentLibrary/BefacoPush_1.svg")); | |||
| sw->wrap(); | |||
| box.size = sw->box.size; | |||
| } | |||
| }; | |||
| //////////////////// | |||
| // Misc | |||
| @@ -1,5 +1,6 @@ | |||
| #include "app.hpp" | |||
| #include "gui.hpp" | |||
| #include "engine.hpp" | |||
| // For GLFW_KEY_LEFT_CONTROL, etc. | |||
| #include <GLFW/glfw3.h> | |||
| @@ -24,5 +25,12 @@ void Knob::onDragEnd() { | |||
| guiCursorUnlock(); | |||
| } | |||
| void Knob::onChange() { | |||
| if (!module) | |||
| return; | |||
| engineSetParamSmooth(module, paramId, value); | |||
| } | |||
| } // namespace rack | |||
| @@ -23,8 +23,7 @@ void ParamWidget::onChange() { | |||
| if (!module) | |||
| return; | |||
| // module->params[paramId] = value; | |||
| engineSetParamSmooth(module, paramId, value); | |||
| module->params[paramId] = value; | |||
| } | |||
| @@ -19,15 +19,16 @@ void SVGSwitch::addFrame(std::shared_ptr<SVG> svg) { | |||
| sw->svg = svg; | |||
| } | |||
| void SVGSwitch::setIndex(int index) { | |||
| void SVGSwitch::step() { | |||
| FramebufferWidget::step(); | |||
| } | |||
| void SVGSwitch::onChange() { | |||
| int index = roundf(mapf(value, minValue, maxValue, 0, frames.size() - 1)); | |||
| if (0 <= index && index < (int)frames.size()) | |||
| sw->svg = frames[index]; | |||
| dirty = true; | |||
| } | |||
| void SVGSwitch::step() { | |||
| FramebufferWidget::step(); | |||
| } | |||
| } // namespace rack | |||