|
|
|
@ -6769,32 +6769,33 @@ bool ImGui::DragBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_s
|
|
|
|
|
g.DragLastMouseDelta = ImVec2(0.f, 0.f);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (v_speed == 0.0f && (v_max - v_min) != 0.0f && (v_max - v_min) < FLT_MAX)
|
|
|
|
|
v_speed = (v_max - v_min) * g.DragSpeedDefaultRatio;
|
|
|
|
|
|
|
|
|
|
float v_cur = g.DragCurrentValue;
|
|
|
|
|
const ImVec2 mouse_drag_delta = GetMouseDragDelta(0, 1.0f);
|
|
|
|
|
if (fabsf(mouse_drag_delta.x - g.DragLastMouseDelta.x) > 0.0f)
|
|
|
|
|
float adjust_delta = mouse_drag_delta.x - g.DragLastMouseDelta.x;
|
|
|
|
|
if (g.IO.KeyShift && g.DragSpeedScaleFast >= 0.0f)
|
|
|
|
|
adjust_delta *= g.DragSpeedScaleFast;
|
|
|
|
|
if (g.IO.KeyAlt && g.DragSpeedScaleSlow >= 0.0f)
|
|
|
|
|
adjust_delta *= g.DragSpeedScaleSlow;
|
|
|
|
|
adjust_delta *= v_speed;
|
|
|
|
|
|
|
|
|
|
if (fabsf(adjust_delta) > 0.0f)
|
|
|
|
|
{
|
|
|
|
|
float speed = v_speed;
|
|
|
|
|
if (speed == 0.0f && (v_max - v_min) != 0.0f && (v_max - v_min) < FLT_MAX)
|
|
|
|
|
speed = (v_max - v_min) * g.DragSpeedDefaultRatio;
|
|
|
|
|
if (g.IO.KeyShift && g.DragSpeedScaleFast >= 0.0f)
|
|
|
|
|
speed = speed * g.DragSpeedScaleFast;
|
|
|
|
|
if (g.IO.KeyAlt && g.DragSpeedScaleSlow >= 0.0f)
|
|
|
|
|
speed = speed * g.DragSpeedScaleSlow;
|
|
|
|
|
|
|
|
|
|
float delta = (mouse_drag_delta.x - g.DragLastMouseDelta.x) * speed;
|
|
|
|
|
if (fabsf(power - 1.0f) > 0.001f)
|
|
|
|
|
{
|
|
|
|
|
// Logarithmic curve on both side of 0.0
|
|
|
|
|
float v0_abs = v_cur >= 0.0f ? v_cur : -v_cur;
|
|
|
|
|
float v0_sign = v_cur >= 0.0f ? 1.0f : -1.0f;
|
|
|
|
|
float v1 = powf(v0_abs, 1.0f / power) + (delta * v0_sign);
|
|
|
|
|
float v1 = powf(v0_abs, 1.0f / power) + (adjust_delta * v0_sign);
|
|
|
|
|
float v1_abs = v1 >= 0.0f ? v1 : -v1;
|
|
|
|
|
float v1_sign = v1 >= 0.0f ? 1.0f : -1.0f; // Crossed sign line
|
|
|
|
|
v_cur = powf(v1_abs, power) * v0_sign * v1_sign; // Reapply sign
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
v_cur += delta;
|
|
|
|
|
v_cur += adjust_delta;
|
|
|
|
|
}
|
|
|
|
|
g.DragLastMouseDelta.x = mouse_drag_delta.x;
|
|
|
|
|
|
|
|
|
|