|
|
@@ -419,71 +419,70 @@ struct KnobEventHandler::PrivateData { |
|
|
|
if ((state & kKnobStateDragging) == 0x0) |
|
|
|
return false; |
|
|
|
|
|
|
|
bool doVal = false; |
|
|
|
float d, value2 = 0.0f; |
|
|
|
float movDiff; |
|
|
|
|
|
|
|
switch (orientation) |
|
|
|
{ |
|
|
|
case Horizontal: |
|
|
|
if (const double movX = ev.pos.getX() - lastX) |
|
|
|
{ |
|
|
|
d = (ev.mod & kModifierControl) ? accel * 10.f : accel; |
|
|
|
value2 = (usingLog ? invlogscale(valueTmp) : valueTmp) + (float(maximum - minimum) / d * float(movX)); |
|
|
|
doVal = true; |
|
|
|
} |
|
|
|
movDiff = ev.pos.getX() - lastX; |
|
|
|
break; |
|
|
|
case Vertical: |
|
|
|
if (const double movY = lastY - ev.pos.getY()) |
|
|
|
{ |
|
|
|
d = (ev.mod & kModifierControl) ? accel * 10.f : accel; |
|
|
|
value2 = (usingLog ? invlogscale(valueTmp) : valueTmp) + (float(maximum - minimum) / d * float(movY)); |
|
|
|
doVal = true; |
|
|
|
} |
|
|
|
movDiff = lastY - ev.pos.getY(); |
|
|
|
break; |
|
|
|
case Both: |
|
|
|
const double movX = ev.pos.getX() - lastX; |
|
|
|
const double movY = lastY - ev.pos.getY(); |
|
|
|
|
|
|
|
if (const double mov = movX + movY) |
|
|
|
{ |
|
|
|
d = (ev.mod & kModifierControl) ? accel * 10.f : accel; |
|
|
|
value2 = (usingLog ? invlogscale(valueTmp) : valueTmp) + (float(maximum - minimum) / d * float(mov)); |
|
|
|
doVal = true; |
|
|
|
} |
|
|
|
movDiff = (ev.pos.getX() - lastX) + (lastY - ev.pos.getY()); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if (! doVal) |
|
|
|
if (d_isZero(movDiff)) |
|
|
|
return false; |
|
|
|
|
|
|
|
const float divisor = (ev.mod & kModifierControl) ? accel * 10.f : accel; |
|
|
|
valueTmp += ((maximum - minimum) / divisor * movDiff); |
|
|
|
|
|
|
|
if (usingLog) |
|
|
|
value2 = logscale(value2); |
|
|
|
valueTmp = logscale(valueTmp); |
|
|
|
|
|
|
|
if (value2 < minimum) |
|
|
|
float value2; |
|
|
|
bool valueChanged = false; |
|
|
|
|
|
|
|
if (valueTmp < minimum) |
|
|
|
{ |
|
|
|
valueTmp = value2 = minimum; |
|
|
|
valueChanged = true; |
|
|
|
} |
|
|
|
else if (value2 > maximum) |
|
|
|
else if (valueTmp > maximum) |
|
|
|
{ |
|
|
|
valueTmp = value2 = maximum; |
|
|
|
valueChanged = true; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
valueTmp = value2; |
|
|
|
|
|
|
|
if (d_isNotZero(step)) |
|
|
|
{ |
|
|
|
const float rest = std::fmod(value2, step); |
|
|
|
value2 -= rest + (rest > step/2.0f ? step : 0.0f); |
|
|
|
|
|
|
|
if (value2 < minimum) |
|
|
|
valueTmp = value2 = minimum; |
|
|
|
else if (value2 > maximum) |
|
|
|
valueTmp = value2 = maximum; |
|
|
|
if (std::abs(valueTmp - value) >= step) |
|
|
|
{ |
|
|
|
valueChanged = true; |
|
|
|
value2 = valueTmp + std::fmod(valueTmp, step); |
|
|
|
|
|
|
|
if (movDiff < 0.0) |
|
|
|
value2 += step; |
|
|
|
|
|
|
|
if (value2 < minimum) |
|
|
|
value2 = minimum; |
|
|
|
else if (value2 > maximum) |
|
|
|
value2 = maximum; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
value2 = valueTmp; |
|
|
|
valueChanged = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
setValue(value2, true); |
|
|
|
if (valueChanged) |
|
|
|
setValue(value2, true); |
|
|
|
|
|
|
|
lastX = ev.pos.getX(); |
|
|
|
lastY = ev.pos.getY(); |
|
|
|