Nav: Process and apply mouse move request immediately after move request result comes (#323)

This commit is contained in:
ocornut 2016-08-21 14:53:26 +02:00
parent f71cdd13b7
commit 78b7e2dfb3

View File

@ -2475,20 +2475,6 @@ static void NavUpdate()
g.NavInitDefaultResultExplicit = false; g.NavInitDefaultResultExplicit = false;
g.NavInitDefaultResultId = 0; g.NavInitDefaultResultId = 0;
// Apply application mouse position movement
if (g.NavMousePosDirty && g.NavIdIsAlive)
{
// Set mouse position given our knowledge of the nav widget position from last frame
if (g.IO.NavMovesMouse)
{
g.IO.MousePos = g.IO.MousePosPrev = NavCalcPreferredMousePos();
g.IO.WantMoveMouse = true;
}
g.NavMousePosDirty = false;
}
g.NavIdIsAlive = false;
g.NavTabbedId = 0;
// Process navigation move request // Process navigation move request
if (g.NavMoveRequest && g.NavMoveResultId != 0) if (g.NavMoveRequest && g.NavMoveResultId != 0)
{ {
@ -2519,6 +2505,10 @@ static void NavUpdate()
g.NavWindow->ScrollTarget.y = g.NavMoveResultRectRel.Max.y + g.NavWindow->Scroll.y + g.Style.ItemSpacing.y; g.NavWindow->ScrollTarget.y = g.NavMoveResultRectRel.Max.y + g.NavWindow->Scroll.y + g.Style.ItemSpacing.y;
g.NavWindow->ScrollTargetCenterRatio.y = 1.0f; g.NavWindow->ScrollTargetCenterRatio.y = 1.0f;
} }
// Estimate upcoming scroll so we can offset our relative mouse position so mouse position can be applied immediately (under this block)
ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(g.NavWindow);
g.NavMoveResultRectRel.Translate(g.NavWindow->Scroll - next_scroll);
} }
// Apply result from previous frame navigation directional move request // Apply result from previous frame navigation directional move request
@ -2527,6 +2517,20 @@ static void NavUpdate()
g.NavMoveFromClampedRefRect = false; g.NavMoveFromClampedRefRect = false;
} }
// Apply application mouse position movement, after we had a chance to process move request result.
if (g.NavMousePosDirty && g.NavIdIsAlive)
{
// Set mouse position given our knowledge of the nav widget position from last frame
if (g.IO.NavMovesMouse)
{
g.IO.MousePos = g.IO.MousePosPrev = NavCalcPreferredMousePos();
g.IO.WantMoveMouse = true;
}
g.NavMousePosDirty = false;
}
g.NavIdIsAlive = false;
g.NavTabbedId = 0;
// Navigation windowing mode (change focus, move/resize window) // Navigation windowing mode (change focus, move/resize window)
if (!g.NavWindowingTarget && IsNavInputPressed(ImGuiNavInput_PadMenu, ImGuiNavReadMode_Pressed)) if (!g.NavWindowingTarget && IsNavInputPressed(ImGuiNavInput_PadMenu, ImGuiNavReadMode_Pressed))
{ {