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