|
@@ -909,6 +909,7 @@ static void NavUpdateWindowing();
|
|
|
static void NavUpdateWindowingOverlay();
|
|
|
static void NavUpdateMoveResult();
|
|
|
static void NavUpdateInitResult();
|
|
|
+static void NavUpdateCancelRequest();
|
|
|
static float NavUpdatePageUpPageDown();
|
|
|
static inline void NavUpdateAnyRequestFlag();
|
|
|
static void NavEndFrame();
|
|
@@ -9193,43 +9194,7 @@ static void ImGui::NavUpdate()
|
|
|
io.NavVisible = (io.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL);
|
|
|
|
|
|
// Process NavCancel input (to close a popup, get back to parent, clear focus)
|
|
|
- if (IsNavInputTest(ImGuiNavInput_Cancel, ImGuiInputReadMode_Pressed))
|
|
|
- {
|
|
|
- IMGUI_DEBUG_LOG_NAV("[nav] ImGuiNavInput_Cancel\n");
|
|
|
- if (g.ActiveId != 0)
|
|
|
- {
|
|
|
- if (!IsActiveIdUsingNavInput(ImGuiNavInput_Cancel))
|
|
|
- ClearActiveID();
|
|
|
- }
|
|
|
- else if (g.NavLayer != ImGuiNavLayer_Main)
|
|
|
- {
|
|
|
- // Leave the "menu" layer
|
|
|
- NavRestoreLayer(ImGuiNavLayer_Main);
|
|
|
- }
|
|
|
- else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow)
|
|
|
- {
|
|
|
- // Exit child window
|
|
|
- ImGuiWindow* child_window = g.NavWindow;
|
|
|
- ImGuiWindow* parent_window = g.NavWindow->ParentWindow;
|
|
|
- IM_ASSERT(child_window->ChildId != 0);
|
|
|
- ImRect child_rect = child_window->Rect();
|
|
|
- FocusWindow(parent_window);
|
|
|
- SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, ImRect(child_rect.Min - parent_window->Pos, child_rect.Max - parent_window->Pos));
|
|
|
- }
|
|
|
- else if (g.OpenPopupStack.Size > 0)
|
|
|
- {
|
|
|
- // Close open popup/menu
|
|
|
- if (!(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal))
|
|
|
- ClosePopupToLevel(g.OpenPopupStack.Size - 1, true);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // Clear NavLastId for popups but keep it for regular child window so we can leave one and come back where we were
|
|
|
- if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup) || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow)))
|
|
|
- g.NavWindow->NavLastIds[0] = 0;
|
|
|
- g.NavId = g.NavFocusScopeId = 0;
|
|
|
- }
|
|
|
- }
|
|
|
+ NavUpdateCancelRequest();
|
|
|
|
|
|
// Process manual activation request
|
|
|
g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavInputId = 0;
|
|
@@ -9452,6 +9417,52 @@ static void ImGui::NavUpdateMoveResult()
|
|
|
g.NavDisableMouseHover = g.NavMousePosDirty = true;
|
|
|
}
|
|
|
|
|
|
+// Process NavCancel input (to close a popup, get back to parent, clear focus)
|
|
|
+// FIXME: In order to support e.g. Escape to clear a selection we'll need:
|
|
|
+// - either to store the equivalent of ActiveIdUsingKeyInputMask for a FocusScope and test for it.
|
|
|
+// - either to move most/all of those tests to the epilogue/end functions of the scope they are dealing with (e.g. exit child window in EndChild()) or in EndFrame(), to allow an earlier intercept
|
|
|
+static void ImGui::NavUpdateCancelRequest()
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ if (!IsNavInputTest(ImGuiNavInput_Cancel, ImGuiInputReadMode_Pressed))
|
|
|
+ return;
|
|
|
+
|
|
|
+ IMGUI_DEBUG_LOG_NAV("[nav] ImGuiNavInput_Cancel\n");
|
|
|
+ if (g.ActiveId != 0)
|
|
|
+ {
|
|
|
+ if (!IsActiveIdUsingNavInput(ImGuiNavInput_Cancel))
|
|
|
+ ClearActiveID();
|
|
|
+ }
|
|
|
+ else if (g.NavLayer != ImGuiNavLayer_Main)
|
|
|
+ {
|
|
|
+ // Leave the "menu" layer
|
|
|
+ NavRestoreLayer(ImGuiNavLayer_Main);
|
|
|
+ }
|
|
|
+ else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow)
|
|
|
+ {
|
|
|
+ // Exit child window
|
|
|
+ ImGuiWindow* child_window = g.NavWindow;
|
|
|
+ ImGuiWindow* parent_window = g.NavWindow->ParentWindow;
|
|
|
+ IM_ASSERT(child_window->ChildId != 0);
|
|
|
+ ImRect child_rect = child_window->Rect();
|
|
|
+ FocusWindow(parent_window);
|
|
|
+ SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, ImRect(child_rect.Min - parent_window->Pos, child_rect.Max - parent_window->Pos));
|
|
|
+ }
|
|
|
+ else if (g.OpenPopupStack.Size > 0)
|
|
|
+ {
|
|
|
+ // Close open popup/menu
|
|
|
+ if (!(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal))
|
|
|
+ ClosePopupToLevel(g.OpenPopupStack.Size - 1, true);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Clear NavLastId for popups but keep it for regular child window so we can leave one and come back where we were
|
|
|
+ if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup) || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow)))
|
|
|
+ g.NavWindow->NavLastIds[0] = 0;
|
|
|
+ g.NavId = g.NavFocusScopeId = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// Handle PageUp/PageDown/Home/End keys
|
|
|
static float ImGui::NavUpdatePageUpPageDown()
|
|
|
{
|