|
@@ -3257,7 +3257,11 @@ bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id)
|
|
|
const bool is_tab_stop = (g.CurrentItemFlags & (ImGuiItemFlags_NoTabStop | ImGuiItemFlags_Disabled)) == 0;
|
|
|
window->DC.FocusCounterRegular++;
|
|
|
if (is_tab_stop)
|
|
|
+ {
|
|
|
window->DC.FocusCounterTabStop++;
|
|
|
+ if (g.NavId == id)
|
|
|
+ g.NavIdTabCounter = window->DC.FocusCounterTabStop;
|
|
|
+ }
|
|
|
|
|
|
// Process TAB/Shift-TAB to tab *OUT* of the currently focused item.
|
|
|
// (Note that we can always TAB out of a widget that doesn't allow tabbing in)
|
|
@@ -3787,12 +3791,14 @@ void ImGui::UpdateTabFocus()
|
|
|
g.TabFocusPressed = (g.NavWindow && g.NavWindow->Active && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab));
|
|
|
if (g.ActiveId == 0 && g.TabFocusPressed)
|
|
|
{
|
|
|
- // Note that SetKeyboardFocusHere() sets the Next fields mid-frame. To be consistent we also
|
|
|
- // manipulate the Next fields even, even though they will be turned into Curr fields by the code below.
|
|
|
+ // - This path is only taken when no widget are active/tabbed-into yet.
|
|
|
+ // Subsequent tabbing will be processed by FocusableItemRegister()
|
|
|
+ // - Note that SetKeyboardFocusHere() sets the Next fields mid-frame. To be consistent we also
|
|
|
+ // manipulate the Next fields here even though they will be turned into Curr fields below.
|
|
|
g.TabFocusRequestNextWindow = g.NavWindow;
|
|
|
g.TabFocusRequestNextCounterRegular = INT_MAX;
|
|
|
if (g.NavId != 0 && g.NavIdTabCounter != INT_MAX)
|
|
|
- g.TabFocusRequestNextCounterTabStop = g.NavIdTabCounter + 1 + (g.IO.KeyShift ? -1 : 1);
|
|
|
+ g.TabFocusRequestNextCounterTabStop = g.NavIdTabCounter + (g.IO.KeyShift ? -1 : 0);
|
|
|
else
|
|
|
g.TabFocusRequestNextCounterTabStop = g.IO.KeyShift ? -1 : 0;
|
|
|
}
|
|
@@ -8828,7 +8834,6 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con
|
|
|
g.NavLayer = window->DC.NavLayerCurrent;
|
|
|
g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent;
|
|
|
g.NavIdIsAlive = true;
|
|
|
- g.NavIdTabCounter = window->DC.FocusCounterTabStop;
|
|
|
window->NavRectRel[window->DC.NavLayerCurrent] = nav_bb_rel; // Store item bounding box (relative to window position)
|
|
|
}
|
|
|
}
|