|
@@ -1064,7 +1064,7 @@ static void NavUpdate();
|
|
|
static void NavUpdateWindowing();
|
|
|
static void NavUpdateWindowingOverlay();
|
|
|
static void NavUpdateMoveResult();
|
|
|
-static float NavUpdatePageUpPageDown(int allowed_dir_flags);
|
|
|
+static float NavUpdatePageUpPageDown();
|
|
|
static inline void NavUpdateAnyRequestFlag();
|
|
|
static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand);
|
|
|
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, ImGuiID id);
|
|
@@ -2867,8 +2867,6 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
|
|
|
}
|
|
|
}
|
|
|
g.ActiveId = id;
|
|
|
- g.ActiveIdAllowNavDirFlags = 0;
|
|
|
- g.ActiveIdBlockNavInputFlags = 0;
|
|
|
g.ActiveIdAllowOverlap = false;
|
|
|
g.ActiveIdWindow = window;
|
|
|
g.ActiveIdHasBeenEditedThisFrame = false;
|
|
@@ -2877,6 +2875,12 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
|
|
|
g.ActiveIdIsAlive = id;
|
|
|
g.ActiveIdSource = (g.NavActivateId == id || g.NavInputId == id || g.NavJustTabbedId == id || g.NavJustMovedToId == id) ? ImGuiInputSource_Nav : ImGuiInputSource_Mouse;
|
|
|
}
|
|
|
+
|
|
|
+ // Clear declaration of inputs claimed by the widget
|
|
|
+ // (Please note that this is WIP and not all keys/inputs are thoroughly declared by all widgets yet)
|
|
|
+ g.ActiveIdUsingNavDirMask = 0x00;
|
|
|
+ g.ActiveIdUsingNavInputMask = 0x00;
|
|
|
+ g.ActiveIdUsingKeyInputMask = 0x00;
|
|
|
}
|
|
|
|
|
|
// FIXME-NAV: The existence of SetNavID/SetNavIDWithRectRel/SetFocusID is incredibly messy and confusing and needs some explanation or refactoring.
|
|
@@ -3157,7 +3161,7 @@ bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id)
|
|
|
|
|
|
// Process TAB/Shift-TAB to tab *OUT* of the currently focused item.
|
|
|
// (Note that we can always TAB out of a widget that doesn't allow tabbing in)
|
|
|
- if (g.ActiveId == id && g.FocusTabPressed && !(g.ActiveIdBlockNavInputFlags & (1 << ImGuiNavInput_KeyTab_)) && g.FocusRequestNextWindow == NULL)
|
|
|
+ if (g.ActiveId == id && g.FocusTabPressed && !IsActiveIdUsingKey(ImGuiKey_Tab) && g.FocusRequestNextWindow == NULL)
|
|
|
{
|
|
|
g.FocusRequestNextWindow = window;
|
|
|
g.FocusRequestNextCounterTab = window->DC.FocusCounterTab + (g.IO.KeyShift ? (is_tab_stop ? -1 : 0) : +1); // Modulo on index will be applied at the end of frame once we've got the total counter of items.
|
|
@@ -3782,6 +3786,11 @@ void ImGui::NewFrame()
|
|
|
g.ActiveIdIsJustActivated = false;
|
|
|
if (g.TempInputTextId != 0 && g.ActiveId != g.TempInputTextId)
|
|
|
g.TempInputTextId = 0;
|
|
|
+ if (g.ActiveId == 0)
|
|
|
+ {
|
|
|
+ g.ActiveIdUsingNavDirMask = g.ActiveIdUsingNavInputMask = 0;
|
|
|
+ g.ActiveIdUsingKeyInputMask = 0;
|
|
|
+ }
|
|
|
|
|
|
// Drag and drop
|
|
|
g.DragDropAcceptIdPrev = g.DragDropAcceptIdCurr;
|
|
@@ -8271,7 +8280,6 @@ static void ImGui::NavUpdate()
|
|
|
NAV_MAP_KEY(ImGuiKey_RightArrow,ImGuiNavInput_KeyRight_);
|
|
|
NAV_MAP_KEY(ImGuiKey_UpArrow, ImGuiNavInput_KeyUp_ );
|
|
|
NAV_MAP_KEY(ImGuiKey_DownArrow, ImGuiNavInput_KeyDown_ );
|
|
|
- NAV_MAP_KEY(ImGuiKey_Tab, ImGuiNavInput_KeyTab_ );
|
|
|
if (g.IO.KeyCtrl)
|
|
|
g.IO.NavInputs[ImGuiNavInput_TweakSlow] = 1.0f;
|
|
|
if (g.IO.KeyShift)
|
|
@@ -8349,7 +8357,7 @@ static void ImGui::NavUpdate()
|
|
|
{
|
|
|
if (g.ActiveId != 0)
|
|
|
{
|
|
|
- if (!(g.ActiveIdBlockNavInputFlags & (1 << ImGuiNavInput_Cancel)))
|
|
|
+ if (!IsActiveIdUsingNavInput(ImGuiNavInput_Cancel))
|
|
|
ClearActiveID();
|
|
|
}
|
|
|
else if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow) && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow)
|
|
@@ -8411,17 +8419,16 @@ static void ImGui::NavUpdate()
|
|
|
g.NavNextActivateId = 0;
|
|
|
|
|
|
// Initiate directional inputs request
|
|
|
- const int allowed_dir_flags = (g.ActiveId == 0) ? ~0 : g.ActiveIdAllowNavDirFlags;
|
|
|
if (g.NavMoveRequestForward == ImGuiNavForward_None)
|
|
|
{
|
|
|
g.NavMoveDir = ImGuiDir_None;
|
|
|
g.NavMoveRequestFlags = ImGuiNavMoveFlags_None;
|
|
|
- if (g.NavWindow && !g.NavWindowingTarget && allowed_dir_flags && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
|
|
+ if (g.NavWindow && !g.NavWindowingTarget && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
|
|
{
|
|
|
- if ((allowed_dir_flags & (1 << ImGuiDir_Left)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadLeft, ImGuiNavInput_KeyLeft_, ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Left; }
|
|
|
- if ((allowed_dir_flags & (1 << ImGuiDir_Right)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadRight,ImGuiNavInput_KeyRight_,ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Right; }
|
|
|
- if ((allowed_dir_flags & (1 << ImGuiDir_Up)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadUp, ImGuiNavInput_KeyUp_, ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Up; }
|
|
|
- if ((allowed_dir_flags & (1 << ImGuiDir_Down)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadDown, ImGuiNavInput_KeyDown_, ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Down; }
|
|
|
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadLeft, ImGuiNavInput_KeyLeft_, ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Left; }
|
|
|
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadRight,ImGuiNavInput_KeyRight_,ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Right; }
|
|
|
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadUp, ImGuiNavInput_KeyUp_, ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Up; }
|
|
|
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadDown, ImGuiNavInput_KeyDown_, ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Down; }
|
|
|
}
|
|
|
g.NavMoveClipDir = g.NavMoveDir;
|
|
|
}
|
|
@@ -8438,7 +8445,7 @@ static void ImGui::NavUpdate()
|
|
|
// FIXME-NAV: Consider enabling those keys even without the master ImGuiConfigFlags_NavEnableKeyboard flag?
|
|
|
float nav_scoring_rect_offset_y = 0.0f;
|
|
|
if (nav_keyboard_active)
|
|
|
- nav_scoring_rect_offset_y = NavUpdatePageUpPageDown(allowed_dir_flags);
|
|
|
+ nav_scoring_rect_offset_y = NavUpdatePageUpPageDown();
|
|
|
|
|
|
// If we initiate a movement request and have no current NavId, we initiate a InitDefautRequest that will be used as a fallback if the direction fails to find a match
|
|
|
if (g.NavMoveDir != ImGuiDir_None)
|
|
@@ -8585,7 +8592,7 @@ static void ImGui::NavUpdateMoveResult()
|
|
|
}
|
|
|
|
|
|
// Handle PageUp/PageDown/Home/End keys
|
|
|
-static float ImGui::NavUpdatePageUpPageDown(int allowed_dir_flags)
|
|
|
+static float ImGui::NavUpdatePageUpPageDown()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
if (g.NavMoveDir != ImGuiDir_None || g.NavWindow == NULL)
|
|
@@ -8594,10 +8601,10 @@ static float ImGui::NavUpdatePageUpPageDown(int allowed_dir_flags)
|
|
|
return 0.0f;
|
|
|
|
|
|
ImGuiWindow* window = g.NavWindow;
|
|
|
- const bool page_up_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageUp]) && (allowed_dir_flags & (1 << ImGuiDir_Up));
|
|
|
- const bool page_down_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageDown]) && (allowed_dir_flags & (1 << ImGuiDir_Down));
|
|
|
- const bool home_pressed = IsKeyPressed(g.IO.KeyMap[ImGuiKey_Home]) && (allowed_dir_flags & (1 << ImGuiDir_Up));
|
|
|
- const bool end_pressed = IsKeyPressed(g.IO.KeyMap[ImGuiKey_End]) && (allowed_dir_flags & (1 << ImGuiDir_Down));
|
|
|
+ const bool page_up_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageUp]) && !IsActiveIdUsingKey(ImGuiKey_PageUp);
|
|
|
+ const bool page_down_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageDown]) && !IsActiveIdUsingKey(ImGuiKey_PageDown);
|
|
|
+ const bool home_pressed = IsKeyPressed(g.IO.KeyMap[ImGuiKey_Home]) && !IsActiveIdUsingKey(ImGuiKey_Home);
|
|
|
+ const bool end_pressed = IsKeyPressed(g.IO.KeyMap[ImGuiKey_End]) && !IsActiveIdUsingKey(ImGuiKey_End);
|
|
|
if (page_up_held != page_down_held || home_pressed != end_pressed) // If either (not both) are pressed
|
|
|
{
|
|
|
if (window->DC.NavLayerActiveMask == 0x00 && window->DC.NavHasScroll)
|