blob: 7e04f8fadfc43ddd06f3c34dfb4069a3e8e47c8f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#include <app/Knob.hpp>
#include <app.hpp>
#include <app/Scene.hpp>
#include <random.hpp>
#include <history.hpp>
namespace rack {
namespace app {
static const float KNOB_SENSITIVITY = 0.0015f;
void Knob::initParamQuantity() {
ParamWidget::initParamQuantity();
engine::ParamQuantity* pq = getParamQuantity();
if (pq) {
if (snap)
pq->snapEnabled = true;
}
}
void Knob::onHover(const event::Hover& e) {
math::Vec c = box.size.div(2);
float dist = e.pos.minus(c).norm();
if (dist <= c.x) {
ParamWidget::onHover(e);
}
}
void Knob::onButton(const event::Button& e) {
math::Vec c = box.size.div(2);
float dist = e.pos.minus(c).norm();
if (dist <= c.x) {
ParamWidget::onButton(e);
}
}
void Knob::onDragStart(const event::DragStart& e) {
if (e.button != GLFW_MOUSE_BUTTON_LEFT)
return;
engine::ParamQuantity* pq = getParamQuantity();
if (pq) {
oldValue = pq->getSmoothValue();
snapDelta = 0.f;
}
APP->window->cursorLock();
}
void Knob::onDragEnd(const event::DragEnd& e) {
if (e.button != GLFW_MOUSE_BUTTON_LEFT)
return;
APP->window->cursorUnlock();
engine::ParamQuantity* pq = getParamQuantity();
if (pq) {
float newValue = pq->getSmoothValue();
if (oldValue != newValue) {
// Push ParamChange history action
history::ParamChange* h = new history::ParamChange;
h->name = "move knob";
h->moduleId = module->id;
h->paramId = paramId;
h->oldValue = oldValue;
h->newValue = newValue;
APP->history->push(h);
}
}
}
void Knob::onDragMove(const event::DragMove& e) {
if (e.button != GLFW_MOUSE_BUTTON_LEFT)
return;
engine::ParamQuantity* pq = getParamQuantity();
if (pq) {
float range;
if (pq->isBounded()) {
range = pq->getRange();
}
else {
// Continuous encoders scale as if their limits are +/-1
range = 2.f;
}
float delta = (horizontal ? e.mouseDelta.x : -e.mouseDelta.y);
delta *= KNOB_SENSITIVITY;
delta *= speed;
delta *= range;
// Drag slower if Mod is held
int mods = APP->window->getMods();
if ((mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
delta /= 16.f;
}
// Drag even slower if Mod-Shift is held
if ((mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) {
delta /= 256.f;
}
if (pq->snapEnabled) {
// Replace delta with an accumulated delta since the last integer knob.
snapDelta += delta;
delta = std::trunc(snapDelta);
snapDelta -= delta;
}
// Set value
if (smooth) {
pq->setSmoothValue(pq->getSmoothValue() + delta);
}
else {
pq->setValue(pq->getValue() + delta);
}
}
ParamWidget::onDragMove(e);
}
} // namespace app
} // namespace rack
|