commit fd9ca173df64714e05ced7b322366b4307a99806
parent 4edfa52a045dbec6e7660aff5bff5cc025bfbaa8
Author: falkTX <falktx@falktx.com>
Date: Sun, 28 Aug 2022 02:34:33 +0100
Improve KnobEventHandler::motionEvent for stepped controls
Diffstat:
1 file changed, 36 insertions(+), 37 deletions(-)
diff --git a/dgl/src/EventHandlers.cpp b/dgl/src/EventHandlers.cpp
@@ -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();