diff --git a/dgl/src/EventHandlers.cpp b/dgl/src/EventHandlers.cpp index 49efee6b..db361241 100644 --- 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();