Nav: Caching into g.NavAnyRequest to minimize hot path cost (and so we can add many more request sources)
This commit is contained in:
parent
d91b093be6
commit
d2975115cd
26
imgui.cpp
26
imgui.cpp
@ -2171,6 +2171,19 @@ static bool NavScoreItem(ImRect cand)
|
||||
return new_best;
|
||||
}
|
||||
|
||||
static inline void NavUpdateAnyRequestFlag()
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
g.NavAnyRequest = g.NavMoveRequest || g.NavInitDefaultRequest || IMGUI_DEBUG_NAV;
|
||||
}
|
||||
|
||||
static void NavMoveRequestCancel()
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
g.NavMoveRequest = false;
|
||||
NavUpdateAnyRequestFlag();
|
||||
}
|
||||
|
||||
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id)
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
@ -2182,7 +2195,10 @@ static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGu
|
||||
{
|
||||
// Even if 'ImGuiItemFlags_NoNavDefaultFocus' is on (typically collapse/close button) we record the first ResultId so they can be used as a fallback
|
||||
if (!(item_flags & ImGuiItemFlags_NoNavDefaultFocus))
|
||||
{
|
||||
g.NavInitDefaultRequest = g.NavInitDefaultResultExplicit = false; // Found a match, clear request
|
||||
NavUpdateAnyRequestFlag();
|
||||
}
|
||||
if (g.NavInitDefaultResultId == 0 || !(item_flags & ImGuiItemFlags_NoNavDefaultFocus))
|
||||
{
|
||||
g.NavInitDefaultResultId = id;
|
||||
@ -2235,7 +2251,7 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg)
|
||||
// We could early out with `if (is_clipped && !g.NavInitDefaultRequest) return false;` but when we wouldn't be able to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick)
|
||||
window->DC.NavLayerActiveMaskNext |= window->DC.NavLayerCurrentMask;
|
||||
if (g.NavWindow == window->RootNavWindow)
|
||||
if (g.NavId == id || g.NavMoveRequest || g.NavInitDefaultRequest || IMGUI_DEBUG_NAV)
|
||||
if (g.NavId == id || g.NavAnyRequest)
|
||||
NavProcessItem(window, nav_bb_arg ? *nav_bb_arg : bb, id);
|
||||
}
|
||||
|
||||
@ -2499,6 +2515,7 @@ static void NavInitWindow(ImGuiWindow* window, bool force_reinit)
|
||||
g.NavInitDefaultResultId = 0;
|
||||
g.NavInitDefaultResultExplicit = false;
|
||||
g.NavInitDefaultResultRectRel = ImRect();
|
||||
NavUpdateAnyRequestFlag();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2860,6 +2877,8 @@ static void NavUpdate()
|
||||
g.NavDisableHighlight = false;
|
||||
}
|
||||
|
||||
NavUpdateAnyRequestFlag();
|
||||
|
||||
// Scrolling
|
||||
if (g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.NavWindowingTarget)
|
||||
{
|
||||
@ -4237,6 +4256,7 @@ void ImGui::SetItemDefaultFocus()
|
||||
g.NavInitDefaultResultExplicit = true;
|
||||
g.NavInitDefaultResultId = g.NavWindow->DC.LastItemId;
|
||||
g.NavInitDefaultResultRectRel = ImRect(g.NavWindow->DC.LastItemRect.Min - g.NavWindow->Pos, g.NavWindow->DC.LastItemRect.Max - g.NavWindow->Pos);
|
||||
NavUpdateAnyRequestFlag();
|
||||
if (!IsItemVisible())
|
||||
SetScrollHere();
|
||||
}
|
||||
@ -4511,8 +4531,8 @@ static void NavProcessMoveRequestWrapAround(ImGuiWindow* window)
|
||||
if (g.NavMoveRequest && g.NavWindow == window && g.NavMoveResultId == 0)
|
||||
if ((g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down) && g.NavMoveRequestForwardStep == 0 && g.NavLayer == 0)
|
||||
{
|
||||
g.NavMoveRequest = false;
|
||||
g.NavMoveRequestForwardStep = 1;
|
||||
NavMoveRequestCancel();
|
||||
g.NavWindow->NavRectRel[0].Min.y = g.NavWindow->NavRectRel[0].Max.y = (g.NavMoveDir == ImGuiDir_Up) ? window->SizeFull.y : 0.0f;
|
||||
}
|
||||
}
|
||||
@ -10123,8 +10143,8 @@ void ImGui::EndMenuBar()
|
||||
SetNavIdAndMoveMouse(window->NavLastIds[1], 1, window->NavRectRel[1]);
|
||||
g.NavLayer = 1;
|
||||
g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection.
|
||||
g.NavMoveRequest = false;
|
||||
g.NavMoveRequestForwardStep = 1;
|
||||
NavMoveRequestCancel();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -480,6 +480,7 @@ struct ImGuiContext
|
||||
bool NavMousePosDirty;
|
||||
bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (nb: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover)
|
||||
bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
|
||||
bool NavAnyRequest; // ~~ NavMoveRequest || NavInitDefaultRequest
|
||||
bool NavInitDefaultRequest; // Init request for appearing window to select first item
|
||||
ImGuiID NavInitDefaultResultId;
|
||||
ImRect NavInitDefaultResultRectRel;
|
||||
@ -596,6 +597,7 @@ struct ImGuiContext
|
||||
NavMousePosDirty = false;
|
||||
NavDisableHighlight = true;
|
||||
NavDisableMouseHover = false;
|
||||
NavAnyRequest = false;
|
||||
NavInitDefaultRequest = false;
|
||||
NavInitDefaultResultId = 0;
|
||||
NavInitDefaultResultExplicit = false;
|
||||
|
Loading…
Reference in New Issue
Block a user