mirror of
https://github.com/Drezil/imgui.git
synced 2025-03-14 00:32:44 +00:00
Nav: extracted code out of NavUpdate() into NavUpdateCancelRequest()
This commit is contained in:
parent
80ed4eba87
commit
4c31c98d22
85
imgui.cpp
85
imgui.cpp
@ -909,6 +909,7 @@ static void NavUpdateWindowing();
|
|||||||
static void NavUpdateWindowingOverlay();
|
static void NavUpdateWindowingOverlay();
|
||||||
static void NavUpdateMoveResult();
|
static void NavUpdateMoveResult();
|
||||||
static void NavUpdateInitResult();
|
static void NavUpdateInitResult();
|
||||||
|
static void NavUpdateCancelRequest();
|
||||||
static float NavUpdatePageUpPageDown();
|
static float NavUpdatePageUpPageDown();
|
||||||
static inline void NavUpdateAnyRequestFlag();
|
static inline void NavUpdateAnyRequestFlag();
|
||||||
static void NavEndFrame();
|
static void NavEndFrame();
|
||||||
@ -9193,43 +9194,7 @@ static void ImGui::NavUpdate()
|
|||||||
io.NavVisible = (io.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL);
|
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)
|
// Process NavCancel input (to close a popup, get back to parent, clear focus)
|
||||||
if (IsNavInputTest(ImGuiNavInput_Cancel, ImGuiInputReadMode_Pressed))
|
NavUpdateCancelRequest();
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process manual activation request
|
// Process manual activation request
|
||||||
g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavInputId = 0;
|
g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavInputId = 0;
|
||||||
@ -9452,6 +9417,52 @@ static void ImGui::NavUpdateMoveResult()
|
|||||||
g.NavDisableMouseHover = g.NavMousePosDirty = true;
|
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
|
// Handle PageUp/PageDown/Home/End keys
|
||||||
static float ImGui::NavUpdatePageUpPageDown()
|
static float ImGui::NavUpdatePageUpPageDown()
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user