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) if ((state & kKnobStateDragging) == 0x0)
return false; return false;


bool doVal = false;
float d, value2 = 0.0f;
float movDiff;


switch (orientation) switch (orientation)
{ {
case Horizontal: 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; break;
case Vertical: 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; break;
case Both: 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; break;
} }


if (! doVal)
if (d_isZero(movDiff))
return false; return false;


const float divisor = (ev.mod & kModifierControl) ? accel * 10.f : accel;
valueTmp += ((maximum - minimum) / divisor * movDiff);

if (usingLog) if (usingLog)
value2 = logscale(value2);
valueTmp = logscale(valueTmp);


if (value2 < minimum)
float value2;
bool valueChanged = false;

if (valueTmp < minimum)
{ {
valueTmp = value2 = minimum; valueTmp = value2 = minimum;
valueChanged = true;
} }
else if (value2 > maximum)
else if (valueTmp > maximum)
{ {
valueTmp = value2 = maximum; valueTmp = value2 = maximum;
valueChanged = true;
} }
else else
{ {
valueTmp = value2;

if (d_isNotZero(step)) 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(); lastX = ev.pos.getX();
lastY = ev.pos.getY(); lastY = ev.pos.getY();


Loading…
Cancel
Save