@ -612,7 +612,7 @@ static void ClosePopupToLevel(int remaining);
static void ClosePopup ( ImGuiID id ) ;
static bool IsPopupOpen ( ImGuiID id ) ;
static ImGuiWindow * GetFrontMostModalRootWindow ( ) ;
static ImVec2 FindBestPopupWindowPos ( const ImVec2 & base_pos , const ImVec2 & size , ImGuiWindowFlags flags , int * last_dir , const ImRect & r_inner ) ;
static ImVec2 FindBestPopupWindowPos ( const ImVec2 & base_pos , const ImVec2 & size , int * last_dir , const ImRect & rect_to_avoid ) ;
static bool InputTextFilterCharacter ( unsigned int * p_char , ImGuiInputTextFlags flags , ImGuiTextEditCallback callback , void * user_data ) ;
static int InputTextCalcTextLenAndLineCount ( const char * text_begin , const char * * out_text_end ) ;
@ -3415,7 +3415,7 @@ static void CheckStacksSize(ImGuiWindow* window, bool write)
IM_ASSERT ( p_backup = = window - > DC . StackSizesBackup + IM_ARRAYSIZE ( window - > DC . StackSizesBackup ) ) ;
}
static ImVec2 FindBestPopupWindowPos ( const ImVec2 & base_pos , const ImVec2 & size , ImGuiWindowFlags flags , int * last_dir , const ImRect & r_inner )
static ImVec2 FindBestPopupWindowPos ( const ImVec2 & base_pos , const ImVec2 & size , int * last_dir , const ImRect & r_inner )
{
const ImGuiStyle & style = GImGui - > Style ;
@ -3425,7 +3425,7 @@ static ImVec2 FindBestPopupWindowPos(const ImVec2& base_pos, const ImVec2& size,
r_outer . Reduce ( ImVec2 ( ( size . x - r_outer . GetWidth ( ) > safe_padding . x * 2 ) ? safe_padding . x : 0.0f , ( size . y - r_outer . GetHeight ( ) > safe_padding . y * 2 ) ? safe_padding . y : 0.0f ) ) ;
ImVec2 base_pos_clamped = ImClamp ( base_pos , r_outer . Min , r_outer . Max - size ) ;
for ( int n = ( * last_dir ! = - 1 ) ? - 1 : 0 ; n < 4 ; n + + ) // Right, down, up, left. Favor last used direction.
for ( int n = ( * last_dir ! = - 1 ) ? - 1 : 0 ; n < 4 ; n + + ) // Last, Right, down, up, left. ( Favor last used direction) .
{
const int dir = ( n = = - 1 ) ? * last_dir : n ;
ImRect rect ( dir = = 0 ? r_inner . Max . x : r_outer . Min . x , dir = = 1 ? r_inner . Max . y : r_outer . Min . y , dir = = 3 ? r_inner . Min . x : r_outer . Max . x , dir = = 2 ? r_inner . Min . y : r_outer . Max . y ) ;
@ -3435,12 +3435,8 @@ static ImVec2 FindBestPopupWindowPos(const ImVec2& base_pos, const ImVec2& size,
return ImVec2 ( dir = = 0 ? r_inner . Max . x : dir = = 3 ? r_inner . Min . x - size . x : base_pos_clamped . x , dir = = 1 ? r_inner . Max . y : dir = = 2 ? r_inner . Min . y - size . y : base_pos_clamped . y ) ;
}
// Fallback
// Fallback, try to keep within display
* last_dir = - 1 ;
if ( flags & ImGuiWindowFlags_Tooltip ) // For tooltip we prefer avoiding the cursor at all cost even if it means that part of the tooltip won't be visible.
return base_pos + ImVec2 ( 2 , 2 ) ;
// Otherwise try to keep within display
ImVec2 pos = base_pos ;
pos . x = ImMax ( ImMin ( pos . x + size . x , r_outer . Max . x ) - size . x , r_outer . Min . x ) ;
pos . y = ImMax ( ImMin ( pos . y + size . y , r_outer . Max . y ) - size . y , r_outer . Min . y ) ;
@ -3804,19 +3800,21 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
rect_to_avoid = ImRect ( - FLT_MAX , parent_window - > Pos . y + parent_window - > TitleBarHeight ( ) , FLT_MAX , parent_window - > Pos . y + parent_window - > TitleBarHeight ( ) + parent_window - > MenuBarHeight ( ) ) ;
else
rect_to_avoid = ImRect ( parent_window - > Pos . x + style . ItemSpacing . x , - FLT_MAX , parent_window - > Pos . x + parent_window - > Size . x - style . ItemSpacing . x - parent_window - > ScrollbarSizes . x , FLT_MAX ) ; // We want some overlap to convey the relative depth of each popup (here hard-coded to 4)
window - > PosFloat = FindBestPopupWindowPos ( window - > PosFloat , window - > Size , flags , & window - > AutoPosLastDirection , rect_to_avoid ) ;
window - > PosFloat = FindBestPopupWindowPos ( window - > PosFloat , window - > Size , & window - > AutoPosLastDirection , rect_to_avoid ) ;
}
else if ( ( flags & ImGuiWindowFlags_Popup ) ! = 0 & & ! window_pos_set_by_api & & window_appearing_after_being_hidden )
{
ImRect rect_to_avoid ( window - > PosFloat . x - 1 , window - > PosFloat . y - 1 , window - > PosFloat . x + 1 , window - > PosFloat . y + 1 ) ;
window - > PosFloat = FindBestPopupWindowPos ( window - > PosFloat , window - > Size , flags , & window - > AutoPosLastDirection , rect_to_avoid ) ;
window - > PosFloat = FindBestPopupWindowPos ( window - > PosFloat , window - > Size , & window - > AutoPosLastDirection , rect_to_avoid ) ;
}
// Position tooltip (always follows mouse)
if ( ( flags & ImGuiWindowFlags_Tooltip ) ! = 0 & & ! window_pos_set_by_api )
{
ImRect rect_to_avoid ( g . IO . MousePos . x - 16 , g . IO . MousePos . y - 8 , g . IO . MousePos . x + 24 , g . IO . MousePos . y + 24 ) ; // FIXME: Completely hard-coded. Perhaps center on cursor hit-point instead?
window - > PosFloat = FindBestPopupWindowPos ( g . IO . MousePos , window - > Size , flags , & window - > AutoPosLastDirection , rect_to_avoid ) ;
window - > PosFloat = FindBestPopupWindowPos ( g . IO . MousePos , window - > Size , & window - > AutoPosLastDirection , rect_to_avoid ) ;
if ( window - > AutoPosLastDirection = = - 1 )
window - > PosFloat = g . IO . MousePos + ImVec2 ( 2 , 2 ) ; // If there's not enough room, for tooltip we prefer avoiding the cursor at all cost even if it means that part of the tooltip won't be visible.
}
// User moving window (at the beginning of the frame to avoid input lag or sheering). Only valid for root windows.