welltags/v0.5.0
| @@ -20,7 +20,7 @@ Rack's dependencies (GLEW, glfw, etc) do not need to be installed on your system | |||||
| ### Mac | ### Mac | ||||
| Install [Xcode](https://developer.apple.com/xcode/). | Install [Xcode](https://developer.apple.com/xcode/). | ||||
| Install [CMake](https://cmake.org/) and wget, preferably from [Homebrew](https://brew.sh/). | |||||
| Install [CMake](https://cmake.org/) (for some of Rack's dependencies) and wget, preferably from [Homebrew](https://brew.sh/). | |||||
| ### Windows | ### Windows | ||||
| @@ -183,6 +183,9 @@ struct ParamWidget : OpaqueWidget, QuantityWidget { | |||||
| /** Implements vertical dragging behavior for ParamWidgets */ | /** Implements vertical dragging behavior for ParamWidgets */ | ||||
| struct Knob : ParamWidget { | struct Knob : ParamWidget { | ||||
| /** Snap to nearest integer while dragging */ | |||||
| bool snap = false; | |||||
| float snapValue; | |||||
| void onDragStart(); | void onDragStart(); | ||||
| void onDragMove(Vec mouseRel); | void onDragMove(Vec mouseRel); | ||||
| void onDragEnd(); | void onDragEnd(); | ||||
| @@ -209,14 +212,6 @@ struct SVGKnob : virtual Knob, FramebufferWidget { | |||||
| void onChange(); | void onChange(); | ||||
| }; | }; | ||||
| /** Snaps to the nearest integer value on mouse release */ | |||||
| struct SnapKnob : virtual Knob { | |||||
| void onDragEnd() { | |||||
| setValue(roundf(value)); | |||||
| Knob::onDragEnd(); | |||||
| } | |||||
| }; | |||||
| struct SVGSlider : Knob, FramebufferWidget { | struct SVGSlider : Knob, FramebufferWidget { | ||||
| /** Intermediate positions will be interpolated between these positions */ | /** Intermediate positions will be interpolated between these positions */ | ||||
| Vec minHandlePos, maxHandlePos; | Vec minHandlePos, maxHandlePos; | ||||
| @@ -57,7 +57,11 @@ struct RoundHugeBlackKnob : RoundBlackKnob { | |||||
| } | } | ||||
| }; | }; | ||||
| struct RoundSmallBlackSnapKnob : RoundSmallBlackKnob, SnapKnob {}; | |||||
| struct RoundSmallBlackSnapKnob : RoundSmallBlackKnob { | |||||
| RoundSmallBlackSnapKnob() { | |||||
| snap = true; | |||||
| } | |||||
| }; | |||||
| struct Davies1900hKnob : SVGKnob { | struct Davies1900hKnob : SVGKnob { | ||||
| @@ -109,7 +113,11 @@ struct Davies1900hSmallBlackKnob : Davies1900hKnob { | |||||
| } | } | ||||
| }; | }; | ||||
| struct Davies1900hSmallBlackSnapKnob : Davies1900hSmallBlackKnob, SnapKnob {}; | |||||
| struct Davies1900hSmallBlackSnapKnob : Davies1900hSmallBlackKnob { | |||||
| Davies1900hSmallBlackSnapKnob() { | |||||
| snap = true; | |||||
| } | |||||
| }; | |||||
| struct Rogan : SVGKnob { | struct Rogan : SVGKnob { | ||||
| @@ -366,7 +374,11 @@ struct BefacoBigKnob : SVGKnob { | |||||
| } | } | ||||
| }; | }; | ||||
| struct BefacoBigSnapKnob : BefacoBigKnob, SnapKnob {}; | |||||
| struct BefacoBigSnapKnob : BefacoBigKnob { | |||||
| BefacoBigSnapKnob() { | |||||
| snap = true; | |||||
| } | |||||
| }; | |||||
| struct BefacoTinyKnob : SVGKnob { | struct BefacoTinyKnob : SVGKnob { | ||||
| BefacoTinyKnob() { | BefacoTinyKnob() { | ||||
| @@ -12,6 +12,7 @@ namespace rack { | |||||
| void Knob::onDragStart() { | void Knob::onDragStart() { | ||||
| guiCursorLock(); | guiCursorLock(); | ||||
| snapValue = value; | |||||
| randomizable = false; | randomizable = false; | ||||
| } | } | ||||
| @@ -19,7 +20,11 @@ void Knob::onDragMove(Vec mouseRel) { | |||||
| // Drag slower if Mod | // Drag slower if Mod | ||||
| if (guiIsModPressed()) | if (guiIsModPressed()) | ||||
| mouseRel = mouseRel.mult(1/16.0); | mouseRel = mouseRel.mult(1/16.0); | ||||
| setValue(value - KNOB_SENSITIVITY * (maxValue - minValue) * mouseRel.y); | |||||
| snapValue += KNOB_SENSITIVITY * (maxValue - minValue) * -mouseRel.y; | |||||
| if (snap) | |||||
| setValue(roundf(snapValue)); | |||||
| else | |||||
| setValue(snapValue); | |||||
| } | } | ||||
| void Knob::onDragEnd() { | void Knob::onDragEnd() { | ||||