DragFloat: Fix/workaround for backends which do not preserve a valid mouse position when dragged out of bounds. (#1559)

This commit is contained in:
omar 2018-01-19 09:16:26 +01:00
parent c2ffce3e5a
commit 74dc70c543

View File

@ -3580,6 +3580,7 @@ bool ImGui::IsMousePosValid(const ImVec2* mouse_pos)
return mouse_pos->x >= MOUSE_INVALID && mouse_pos->y >= MOUSE_INVALID; return mouse_pos->x >= MOUSE_INVALID && mouse_pos->y >= MOUSE_INVALID;
} }
// NB: This is only valid if IsMousePosValid(). Backends in theory should always keep mouse position valid when dragging even outside the client window.
ImVec2 ImGui::GetMouseDragDelta(int button, float lock_threshold) ImVec2 ImGui::GetMouseDragDelta(int button, float lock_threshold)
{ {
ImGuiContext& g = *GImGui; ImGuiContext& g = *GImGui;
@ -7622,16 +7623,19 @@ bool ImGui::DragBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_s
float v_cur = g.DragCurrentValue; float v_cur = g.DragCurrentValue;
const ImVec2 mouse_drag_delta = GetMouseDragDelta(0, 1.0f); const ImVec2 mouse_drag_delta = GetMouseDragDelta(0, 1.0f);
float adjust_delta = 0.0f; float adjust_delta = 0.0f;
//if (g.ActiveIdSource == ImGuiInputSource_Mouse) if (IsMousePosValid())
{ {
adjust_delta = mouse_drag_delta.x - g.DragLastMouseDelta.x; //if (g.ActiveIdSource == ImGuiInputSource_Mouse)
if (g.IO.KeyShift && g.DragSpeedScaleFast >= 0.0f) {
adjust_delta *= g.DragSpeedScaleFast; adjust_delta = mouse_drag_delta.x - g.DragLastMouseDelta.x;
if (g.IO.KeyAlt && g.DragSpeedScaleSlow >= 0.0f) if (g.IO.KeyShift && g.DragSpeedScaleFast >= 0.0f)
adjust_delta *= g.DragSpeedScaleSlow; adjust_delta *= g.DragSpeedScaleFast;
if (g.IO.KeyAlt && g.DragSpeedScaleSlow >= 0.0f)
adjust_delta *= g.DragSpeedScaleSlow;
}
g.DragLastMouseDelta.x = mouse_drag_delta.x;
} }
adjust_delta *= v_speed; adjust_delta *= v_speed;
g.DragLastMouseDelta.x = mouse_drag_delta.x;
if (fabsf(adjust_delta) > 0.0f) if (fabsf(adjust_delta) > 0.0f)
{ {