From 74da533c939cdc367b3af98a7a6594b67fd51451 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 3 Oct 2017 11:22:38 -0700 Subject: [PATCH] Nav: Added NavJustNavigatedId internal info to record when we land on a given item after a navigation request, useful for various algorithms (currently looking at range selection stuff) (#787) --- imgui.cpp | 8 +++++--- imgui_internal.h | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 68f1e76c4..711b9ab59 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -1928,7 +1928,7 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) if (id) { g.ActiveIdIsAlive = true; - g.ActiveIdSource = (g.NavActivateId == id || g.NavInputId == id || g.NavTabbedId == id) ? ImGuiInputSource_Nav : ImGuiInputSource_Mouse; + g.ActiveIdSource = (g.NavActivateId == id || g.NavInputId == id || g.NavJustTabbedId == id || g.NavJustNavigatedId == id) ? ImGuiInputSource_Nav : ImGuiInputSource_Mouse; if (g.ActiveIdSource == ImGuiInputSource_Nav) g.NavDisableMouseHover = true; else @@ -2318,7 +2318,7 @@ bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop return true; if (allow_keyboard_focus && window->FocusIdxTabCounter == window->FocusIdxTabRequestCurrent) { - g.NavTabbedId = id; + g.NavJustTabbedId = id; return true; } @@ -2592,6 +2592,7 @@ static void NavUpdate() g.NavInitDefaultRequest = false; g.NavInitDefaultResultExplicit = false; g.NavInitDefaultResultId = 0; + g.NavJustNavigatedId = 0; // Process navigation move request if (g.NavMoveRequest && g.NavMoveResultId != 0) @@ -2633,6 +2634,7 @@ static void NavUpdate() // Apply result from previous frame navigation directional move request ImGui::ClearActiveID(); SetNavIdAndMoveMouse(g.NavMoveResultId, g.NavLayer, g.NavMoveResultRectRel); + g.NavJustNavigatedId = g.NavMoveResultId; g.NavMoveFromClampedRefRect = false; } @@ -2657,7 +2659,7 @@ static void NavUpdate() g.NavMousePosDirty = false; } g.NavIdIsAlive = false; - g.NavTabbedId = 0; + g.NavJustTabbedId = 0; // Navigation windowing mode (change focus, move/resize window) if (!g.NavWindowingTarget && IsNavInputPressed(ImGuiNavInput_PadMenu, ImGuiNavReadMode_Pressed)) diff --git a/imgui_internal.h b/imgui_internal.h index bf0876c30..8c3a1764e 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -458,7 +458,8 @@ struct ImGuiContext ImGuiWindow* NavWindow; // Nav/focused window for navigation ImGuiID NavId; // Nav/focused item for navigation ImGuiID NavActivateId, NavInputId; // ~~ IsKeyPressedMap(ImGuiKey_NavActive) ? NavId : 0, etc. (to make widget code terser) - ImGuiID NavTabbedId; // + ImGuiID NavJustTabbedId; // Just tabbed to this id. + ImGuiID NavJustNavigatedId; // Just navigated to this id (result of a successfully MoveRequest) ImRect NavScoringRectScreen; // Rectangle used for scoring, in screen space. Based of window->DC.NavRefRectRel[], modified for directional navigation scoring. ImGuiWindow* NavWindowingTarget; float NavWindowingDisplayAlpha; @@ -571,7 +572,7 @@ struct ImGuiContext SettingsDirtyTimer = 0.0f; NavWindow = NULL; - NavId = NavActivateId = NavInputId = NavTabbedId = 0; + NavId = NavActivateId = NavInputId = NavJustTabbedId = 0; NavScoringRectScreen = ImRect(); NavWindowingTarget = NULL; NavWindowingDisplayAlpha = 0.0f;