Browse Source

Improve KnobEventHandler::motionEvent for stepped controls

pull/321/merge
falkTX 2 years ago
parent
commit
fd9ca173df
1 changed files with 36 additions and 37 deletions
  1. +36
    -37
      dgl/src/EventHandlers.cpp

+ 36
- 37
dgl/src/EventHandlers.cpp View File

@@ -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();


Loading…
Cancel
Save