mirror of
https://github.com/Drezil/imgui.git
synced 2024-12-18 14:16:36 +00:00
Nav: MainMenuBar now releases focus when user gets out of the menu layer. WindowingTarget when applying focus to a window with only menus automatically sets the layer. (#787)
This is enough for basic mouse/gamepad usage, but 1- previous window gets an unfocused title bar color temporarily, 2- generaly for gamepad and especially keyboard we need much more to get this done right
This commit is contained in:
parent
025d4f0c97
commit
20983773f1
14
imgui.cpp
14
imgui.cpp
@ -2726,6 +2726,10 @@ static void ImGui::NavUpdateWindowing()
|
||||
g.NavDisableMouseHover = true;
|
||||
if (g.NavWindowingTarget->NavLastIds[0] == 0)
|
||||
NavInitWindow(g.NavWindowingTarget, false);
|
||||
|
||||
// If the window only has a menu layer, select it directly
|
||||
if (g.NavWindowingTarget->DC.NavLayerActiveMask == 0x02)
|
||||
g.NavLayer = 1;
|
||||
}
|
||||
|
||||
// Single press toggles NavLayer
|
||||
@ -4077,7 +4081,7 @@ void ImGui::CalcListClipping(int items_count, float items_height, int* out_items
|
||||
static ImGuiWindow* FindHoveredWindow(ImVec2 pos, bool excluding_childs)
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
for (int i = g.Windows.Size-1; i >= 0; i--)
|
||||
for (int i = g.Windows.Size - 1; i >= 0; i--)
|
||||
{
|
||||
ImGuiWindow* window = g.Windows[i];
|
||||
if (!window->Active)
|
||||
@ -5818,7 +5822,7 @@ void ImGui::FocusPreviousWindow()
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
for (int i = g.Windows.Size - 1; i >= 0; i--)
|
||||
if (g.Windows[i]->WasActive && !(g.Windows[i]->Flags & ImGuiWindowFlags_ChildWindow))
|
||||
if (g.Windows[i] != g.NavWindow && g.Windows[i]->WasActive && !(g.Windows[i]->Flags & ImGuiWindowFlags_ChildWindow))
|
||||
{
|
||||
FocusWindow(g.Windows[i]);
|
||||
return;
|
||||
@ -10293,6 +10297,12 @@ bool ImGui::BeginMainMenuBar()
|
||||
void ImGui::EndMainMenuBar()
|
||||
{
|
||||
EndMenuBar();
|
||||
|
||||
// When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window
|
||||
ImGuiContext& g = *GImGui;
|
||||
if (g.CurrentWindow == g.NavWindow && g.NavLayer == 0)
|
||||
FocusPreviousWindow();
|
||||
|
||||
End();
|
||||
PopStyleVar(2);
|
||||
}
|
||||
|
@ -467,7 +467,7 @@ struct ImGuiContext
|
||||
ImVector<ImGuiPopupRef> CurrentPopupStack; // Which level of BeginPopup() we are in (reset every frame)
|
||||
|
||||
// Navigation data (for gamepad/keyboard)
|
||||
ImGuiWindow* NavWindow; // Focused window for navigation
|
||||
ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow'
|
||||
ImGuiID NavId; // Focused item for navigation
|
||||
ImGuiID NavActivateId; // ~~ IsNavInputPressed(ImGuiNavInput_PadActivate) ? NavId : 0, also set when calling ActivateItem()
|
||||
ImGuiID NavActivateDownId; // ~~ IsNavInputPressed(ImGuiNavInput_PadActivate) ? NavId : 0
|
||||
|
Loading…
Reference in New Issue
Block a user