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:
omar 2017-10-23 12:38:39 +02:00
parent 025d4f0c97
commit 20983773f1
2 changed files with 13 additions and 3 deletions

View File

@ -2726,6 +2726,10 @@ static void ImGui::NavUpdateWindowing()
g.NavDisableMouseHover = true; g.NavDisableMouseHover = true;
if (g.NavWindowingTarget->NavLastIds[0] == 0) if (g.NavWindowingTarget->NavLastIds[0] == 0)
NavInitWindow(g.NavWindowingTarget, false); 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 // 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) static ImGuiWindow* FindHoveredWindow(ImVec2 pos, bool excluding_childs)
{ {
ImGuiContext& g = *GImGui; 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]; ImGuiWindow* window = g.Windows[i];
if (!window->Active) if (!window->Active)
@ -5818,7 +5822,7 @@ void ImGui::FocusPreviousWindow()
{ {
ImGuiContext& g = *GImGui; ImGuiContext& g = *GImGui;
for (int i = g.Windows.Size - 1; i >= 0; i--) 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]); FocusWindow(g.Windows[i]);
return; return;
@ -10293,6 +10297,12 @@ bool ImGui::BeginMainMenuBar()
void ImGui::EndMainMenuBar() void ImGui::EndMainMenuBar()
{ {
EndMenuBar(); 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(); End();
PopStyleVar(2); PopStyleVar(2);
} }

View File

@ -467,7 +467,7 @@ struct ImGuiContext
ImVector<ImGuiPopupRef> CurrentPopupStack; // Which level of BeginPopup() we are in (reset every frame) ImVector<ImGuiPopupRef> CurrentPopupStack; // Which level of BeginPopup() we are in (reset every frame)
// Navigation data (for gamepad/keyboard) // 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 NavId; // Focused item for navigation
ImGuiID NavActivateId; // ~~ IsNavInputPressed(ImGuiNavInput_PadActivate) ? NavId : 0, also set when calling ActivateItem() ImGuiID NavActivateId; // ~~ IsNavInputPressed(ImGuiNavInput_PadActivate) ? NavId : 0, also set when calling ActivateItem()
ImGuiID NavActivateDownId; // ~~ IsNavInputPressed(ImGuiNavInput_PadActivate) ? NavId : 0 ImGuiID NavActivateDownId; // ~~ IsNavInputPressed(ImGuiNavInput_PadActivate) ? NavId : 0