@ -916,9 +916,9 @@ static void NavUpdateCreateMoveRequest();
static float NavUpdatePageUpPageDown ( ) ;
static inline void NavUpdateAnyRequestFlag ( ) ;
static void NavEndFrame ( ) ;
static bool NavScoreItem ( ImGuiNavItemData * result , ImRect cand );
static void NavApplyItemToResult ( ImGuiNavItemData * result , ImGuiWindow * window , ImGuiID id , const ImRect & nav_bb );
static void NavProcessItem ( ImGuiWindow * window , ImGuiID id , const ImRect & nav_bb ) ;
static bool NavScoreItem ( ImGuiNavItemData * result );
static void NavApplyItemToResult ( ImGuiNavItemData * result );
static void NavProcessItem ( ) ;
static ImVec2 NavCalcPreferredRefPos ( ) ;
static void NavSaveLastChildNavWindowIntoParent ( ImGuiWindow * nav_window ) ;
static ImGuiWindow * NavRestoreLastChildNavWindow ( ImGuiWindow * window ) ;
@ -7518,7 +7518,7 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
if ( g . NavId = = id | | g . NavAnyRequest )
if ( g . NavWindow - > RootWindowForNav = = window - > RootWindowForNav )
if ( window = = g . NavWindow | | ( ( window - > Flags | g . NavWindow - > Flags ) & ImGuiWindowFlags_NavFlattened ) )
NavProcessItem ( window , id , g . LastItemData . NavRect ) ;
NavProcessItem ( ) ;
// [DEBUG] Item Picker tool, when enabling the "extended" version we perform the check in ItemAdd()
# ifdef IMGUI_DEBUG_TOOL_ITEM_PICKER_EX
@ -8742,7 +8742,7 @@ static void inline NavClampRectToVisibleAreaForMoveDir(ImGuiDir move_dir, ImRect
r . Min . y = ImClamp ( r . Min . y , clip_rect . Min . y , clip_rect . Max . y ) ;
r . Max . y = ImClamp ( r . Max . y , clip_rect . Min . y , clip_rect . Max . y ) ;
}
else
else // FIXME: PageUp/PageDown are leaving move_dir == None
{
r . Min . x = ImClamp ( r . Min . x , clip_rect . Min . x , clip_rect . Max . x ) ;
r . Max . x = ImClamp ( r . Max . x , clip_rect . Min . x , clip_rect . Max . x ) ;
@ -8750,14 +8750,16 @@ static void inline NavClampRectToVisibleAreaForMoveDir(ImGuiDir move_dir, ImRect
}
// Scoring function for gamepad/keyboard directional navigation. Based on https://gist.github.com/rygorous/6981057
static bool ImGui : : NavScoreItem ( ImGuiNavItemData * result , ImRect cand )
static bool ImGui : : NavScoreItem ( ImGuiNavItemData * result )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
if ( g . NavLayer ! = window - > DC . NavLayerCurrent )
return false ;
const ImRect curr = g . NavScoringRect ; // Current modified source rect (NB: we've applied Max.x = Min.x in NavUpdate() to inhibit the effect of having varied item width)
// FIXME: Those are not good variables names
ImRect cand = g . LastItemData . NavRect ; // Current item nav rectangle
const ImRect curr = g . NavScoringRect ; // Current modified source rect (NB: we've applied Max.x = Min.x in NavUpdate() to inhibit the effect of having varied item width)
g . NavScoringCount + + ;
// When entering through a NavFlattened border, we consider child window items as fully clipped for scoring
@ -8820,7 +8822,7 @@ static bool ImGui::NavScoreItem(ImGuiNavItemData* result, ImRect cand)
draw_list - > AddRect ( curr . Min , curr . Max , IM_COL32 ( 255 , 200 , 0 , 100 ) ) ;
draw_list - > AddRect ( cand . Min , cand . Max , IM_COL32 ( 255 , 255 , 0 , 200 ) ) ;
draw_list - > AddRectFilled ( cand . Max - ImVec2 ( 4 , 4 ) , cand . Max + CalcTextSize ( buf ) + ImVec2 ( 4 , 4 ) , IM_COL32 ( 40 , 0 , 0 , 150 ) ) ;
draw_list - > AddText ( g. IO . FontDefault , 13.0f , cand. Max , ~ 0U , buf ) ;
draw_list - > AddText ( cand. Max , ~ 0U , buf ) ;
}
else if ( g . IO . KeyCtrl ) // Hold to preview score in matching quadrant. Press C to rotate.
{
@ -8829,7 +8831,7 @@ static bool ImGui::NavScoreItem(ImGuiNavItemData* result, ImRect cand)
ImFormatString ( buf , IM_ARRAYSIZE ( buf ) , " %.0f/%.0f " , dist_box , dist_center ) ;
ImDrawList * draw_list = GetForegroundDrawList ( window ) ;
draw_list - > AddRectFilled ( cand . Min , cand . Max , IM_COL32 ( 255 , 0 , 0 , 200 ) ) ;
draw_list - > AddText ( g. IO . FontDefault , 13.0f , cand. Min , IM_COL32 ( 255 , 255 , 255 , 255 ) , buf ) ;
draw_list - > AddText ( cand. Min , IM_COL32 ( 255 , 255 , 255 , 255 ) , buf ) ;
}
}
# endif
@ -8881,21 +8883,24 @@ static bool ImGui::NavScoreItem(ImGuiNavItemData* result, ImRect cand)
return new_best ;
}
static void ImGui : : NavApplyItemToResult ( ImGuiNavItemData * result , ImGuiWindow * window , ImGuiID id , const ImRect & nav_bb )
static void ImGui : : NavApplyItemToResult ( ImGuiNavItemData * result )
{
ImGuiContext & g = * GImGui ;
I M_ASSERT( g . LastItemData . ID = = id ) ; // Otherwise pulling from window->DC wouldn't be right
I mGuiWindow* window = g . CurrentWindow ;
result - > Window = window ;
result - > ID = id ;
result - > ID = g. LastItemData . ID ;
result - > FocusScopeId = window - > DC . NavFocusScopeIdCurrent ;
result - > RectRel = ImRect ( nav_bb. Min - window - > Pos , nav_bb . Max - window - > Pos ) ;
result - > RectRel = ImRect ( g. LastItemData . NavRect . Min - window - > Pos , g . LastItemData . NavRect . Max - window - > Pos ) ;
}
// We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above)
// This is called after LastItemData is set.
static void ImGui : : NavProcessItem ( ImGuiWindow * window , ImGuiID id , const ImRect & nav_bb )
static void ImGui : : NavProcessItem ( )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
const ImGuiID id = g . LastItemData . ID ;
const ImRect nav_bb = g . LastItemData . NavRect ;
const ImGuiItemFlags item_flags = g . LastItemData . InFlags ;
// Process Init Request
@ -8922,7 +8927,7 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, ImGuiID id, const ImRect&
if ( ( g . NavId ! = id | | ( g . NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId ) ) & & ! ( item_flags & ( ImGuiItemFlags_Disabled | ImGuiItemFlags_NoNav ) ) )
{
ImGuiNavItemData * result = ( window = = g . NavWindow ) ? & g . NavMoveResultLocal : & g . NavMoveResultOther ;
bool new_best = NavScoreItem ( result , nav_bb );
bool new_best = NavScoreItem ( result );
# if IMGUI_DEBUG_NAV_SCORING
// [DEBUG] Scoring all items in NavWindow at all times
@ -8930,14 +8935,14 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, ImGuiID id, const ImRect&
new_best = false ;
# endif
if ( new_best )
NavApplyItemToResult ( result , window , id , nav_bb );
NavApplyItemToResult ( result );
// Features like PageUp/PageDown need to maintain a separate score for the visible set of items.
const float VISIBLE_RATIO = 0.70f ;
if ( ( g . NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet ) & & window - > ClipRect . Overlaps ( nav_bb ) )
if ( ImClamp ( nav_bb . Max . y , window - > ClipRect . Min . y , window - > ClipRect . Max . y ) - ImClamp ( nav_bb . Min . y , window - > ClipRect . Min . y , window - > ClipRect . Max . y ) > = ( nav_bb . Max . y - nav_bb . Min . y ) * VISIBLE_RATIO )
if ( NavScoreItem ( & g . NavMoveResultLocalVisible , nav_bb ))
NavApplyItemToResult ( & g . NavMoveResultLocalVisible , window , id , nav_bb );
if ( NavScoreItem ( & g . NavMoveResultLocalVisible ))
NavApplyItemToResult ( & g . NavMoveResultLocalVisible );
}
}