@ -694,7 +694,6 @@ static ImRect GetVisibleRect();
static void CloseInactivePopups ( ImGuiWindow * ref_window ) ;
static void ClosePopupToLevel ( int remaining ) ;
static ImGuiWindow * GetFrontMostModalRootWindow ( ) ;
static ImVec2 FindBestWindowPosForPopup ( const ImVec2 & base_pos , const ImVec2 & size , ImGuiDir * 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 ) ;
@ -3247,9 +3246,10 @@ void ImGui::NewFrame()
}
else if ( ! g . IO . KeyCtrl & & ! ( window - > Flags & ImGuiWindowFlags_NoScrollWithMouse ) )
{
// Scroll
const int scroll_lines = ( window - > Flags & ImGuiWindowFlags_ComboBox ) ? 3 : 5 ;
SetWindowScrollY ( window , window - > Scroll . y - g . IO . MouseWheel * window - > CalcFontSize ( ) * scroll_lines ) ;
// Mouse wheel Scrolling
float scroll_amount = 5 * window - > CalcFontSize ( ) ;
scroll_amount = ( float ) ( int ) ImMin ( scroll_amount , ( window - > ContentsRegionRect . GetHeight ( ) + window - > WindowPadding . y * 2.0f ) * 0.67f ) ;
SetWindowScrollY ( window , window - > Scroll . y - g . IO . MouseWheel * scroll_amount ) ;
}
}
@ -3572,8 +3572,6 @@ static int ChildWindowComparer(const void* lhs, const void* rhs)
return d ;
if ( int d = ( a - > Flags & ImGuiWindowFlags_Tooltip ) - ( b - > Flags & ImGuiWindowFlags_Tooltip ) )
return d ;
if ( int d = ( a - > Flags & ImGuiWindowFlags_ComboBox ) - ( b - > Flags & ImGuiWindowFlags_ComboBox ) )
return d ;
return ( a - > OrderWithinParent - b - > OrderWithinParent ) ;
}
@ -4867,7 +4865,7 @@ void ImGui::EndChild()
ImGuiWindow * window = GetCurrentWindow ( ) ;
IM_ASSERT ( window - > Flags & ImGuiWindowFlags_ChildWindow ) ; // Mismatched BeginChild()/EndChild() callss
if ( ( window - > Flags & ImGuiWindowFlags_ComboBox ) | | window - > BeginCount > 1 )
if ( window - > BeginCount > 1 )
{
ImGui : : End ( ) ;
}
@ -4931,7 +4929,13 @@ static void CheckStacksSize(ImGuiWindow* window, bool write)
IM_ASSERT ( p_backup = = window - > DC . StackSizesBackup + IM_ARRAYSIZE ( window - > DC . StackSizesBackup ) ) ;
}
static ImVec2 FindBestWindowPosForPopup ( const ImVec2 & base_pos , const ImVec2 & size , ImGuiDir * last_dir , const ImRect & r_avoid , ImGuiWindowFlags flags )
enum ImGuiPopupPositionPolicy
{
ImGuiPopupPositionPolicy_Default ,
ImGuiPopupPositionPolicy_ComboBox
} ;
static ImVec2 FindBestWindowPosForPopup ( const ImVec2 & ref_pos , const ImVec2 & size , ImGuiDir * last_dir , const ImRect & r_avoid , ImGuiPopupPositionPolicy policy = ImGuiPopupPositionPolicy_Default )
{
const ImGuiStyle & style = GImGui - > Style ;
@ -4940,12 +4944,12 @@ static ImVec2 FindBestWindowPosForPopup(const ImVec2& base_pos, const ImVec2& si
ImVec2 safe_padding = style . DisplaySafeAreaPadding ;
ImRect r_outer ( GetVisibleRect ( ) ) ;
r_outer . Expand ( 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 ) ;
ImVec2 base_pos_clamped = ImClamp ( ref _pos, r_outer . Min , r_outer . Max - size ) ;
//GImGui->OverlayDrawList.AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255,0,0,255));
//GImGui->OverlayDrawList.AddRect(r_outer.Min, r_outer.Max, IM_COL32(0,255,0,255));
// Combo Box policy (we want a connecting edge)
if ( flags & ImGuiWindowFlags _ComboBox)
if ( policy = = ImGuiPopupPositionPolicy _ComboBox)
{
const ImGuiDir dir_prefered_order [ ImGuiDir_Count_ ] = { ImGuiDir_Down , ImGuiDir_Right , ImGuiDir_Left , ImGuiDir_Up } ;
for ( int n = ( * last_dir ! = ImGuiDir_None ) ? - 1 : 0 ; n < ImGuiDir_Count_ ; n + + )
@ -4985,7 +4989,7 @@ static ImVec2 FindBestWindowPosForPopup(const ImVec2& base_pos, const ImVec2& si
// Fallback, try to keep within display
* last_dir = ImGuiDir_None ;
ImVec2 pos = base _pos;
ImVec2 pos = ref _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 ) ;
return pos ;
@ -5336,7 +5340,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window - > DrawList - > Clear ( ) ;
window - > DrawList - > PushTextureID ( g . Font - > ContainerAtlas - > TexID ) ;
ImRect fullscreen_rect ( GetVisibleRect ( ) ) ;
if ( ( flags & ImGuiWindowFlags_ChildWindow ) & & ! ( flags & ( ImGuiWindowFlags_ComboBox | ImGuiWindowFlags_Popup ) ) )
if ( ( flags & ImGuiWindowFlags_ChildWindow ) & & ! ( flags & ImGuiWindowFlags_Popup ) )
PushClipRect ( parent_window - > ClipRect . Min , parent_window - > ClipRect . Max , true ) ;
else
PushClipRect ( fullscreen_rect . Min , fullscreen_rect . Max , true ) ;
@ -5392,7 +5396,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window - > WindowRounding = ( flags & ImGuiWindowFlags_ChildWindow ) ? style . ChildRounding : ( ( flags & ImGuiWindowFlags_Popup ) & & ! ( flags & ImGuiWindowFlags_Modal ) ) ? style . PopupRounding : style . WindowRounding ;
window - > WindowBorderSize = ( flags & ImGuiWindowFlags_ChildWindow ) ? style . ChildBorderSize : ( ( flags & ImGuiWindowFlags_Popup ) & & ! ( flags & ImGuiWindowFlags_Modal ) ) ? style . PopupBorderSize : style . WindowBorderSize ;
window - > WindowPadding = style . WindowPadding ;
if ( ( flags & ImGuiWindowFlags_ChildWindow ) & & ! ( flags & ( ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_ ComboBox | ImGuiWindowFlags_ Popup) ) & & window - > WindowBorderSize = = 0.0f )
if ( ( flags & ImGuiWindowFlags_ChildWindow ) & & ! ( flags & ( ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_ Popup) ) & & window - > WindowBorderSize = = 0.0f )
window - > WindowPadding = ImVec2 ( 0.0f , ( flags & ImGuiWindowFlags_MenuBar ) ? style . WindowPadding . y : 0.0f ) ;
const float window_rounding = window - > WindowRounding ;
const float window_border_size = window - > WindowBorderSize ;
@ -5472,12 +5476,12 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
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 + horizontal_overlap , - FLT_MAX , parent_window - > Pos . x + parent_window - > Size . x - horizontal_overlap - parent_window - > ScrollbarSizes . x , FLT_MAX ) ;
window - > PosFloat = FindBestWindowPosForPopup ( window - > PosFloat , window - > Size , & window - > AutoPosLastDirection , rect_to_avoid , flags );
window - > PosFloat = FindBestWindowPosForPopup ( window - > PosFloat , window - > Size , & window - > AutoPosLastDirection , rect_to_avoid );
}
else if ( ( flags & ImGuiWindowFlags_Popup ) ! = 0 & & ! window_pos_set_by_api & & window_just_appearing_after_hidden_for_resize )
{
ImRect rect_to_avoid ( window - > PosFloat . x - 1 , window - > PosFloat . y - 1 , window - > PosFloat . x + 1 , window - > PosFloat . y + 1 ) ;
window - > PosFloat = FindBestWindowPosForPopup ( window - > PosFloat , window - > Size , & window - > AutoPosLastDirection , rect_to_avoid , flags );
window - > PosFloat = FindBestWindowPosForPopup ( window - > PosFloat , window - > Size , & window - > AutoPosLastDirection , rect_to_avoid );
}
// Position tooltip (always follows mouse)
@ -5485,7 +5489,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
{
ImVec2 ref_pos = ( ! g . NavDisableHighlight & & g . NavDisableMouseHover ) ? NavCalcPreferredMousePos ( ) : g . IO . MousePos ;
ImRect rect_to_avoid ( ref_pos . x - 16 , ref_pos . y - 8 , ref_pos . x + 24 , ref_pos . y + 24 ) ; // FIXME: Completely hard-coded. Store boxes in mouse cursor data? Scale? Center on cursor hit-point?
window - > PosFloat = FindBestWindowPosForPopup ( ref_pos , window - > Size , & window - > AutoPosLastDirection , rect_to_avoid , flags );
window - > PosFloat = FindBestWindowPosForPopup ( ref_pos , window - > Size , & window - > AutoPosLastDirection , rect_to_avoid );
if ( window - > AutoPosLastDirection = = ImGuiDir_None )
window - > PosFloat = ref_pos + 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.
}
@ -10206,22 +10210,18 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
if ( ! ItemAdd ( total_bb , id , & frame_bb ) )
return false ;
const float arrow_size = SmallSquareSize ( ) ;
bool hovered , held ;
bool pressed = ButtonBehavior ( frame_bb , id , & hovered , & held ) ;
bool popup_open = IsPopupOpen ( id ) ;
const float arrow_size = SmallSquareSize ( ) ;
const ImRect value_bb ( frame_bb . Min , frame_bb . Max - ImVec2 ( arrow_size , 0.0f ) ) ;
RenderNavHighlight ( frame_bb , id ) ;
RenderFrame ( frame_bb . Min , frame_bb . Max , GetColorU32 ( ImGuiCol_FrameBg ) , true , style . FrameRounding ) ;
RenderFrame ( ImVec2 ( frame_bb . Max . x - arrow_size , frame_bb . Min . y ) , frame_bb . Max , GetColorU32 ( popup_open | | hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button ) , true , style . FrameRounding ) ; // FIXME-ROUNDING
RenderTriangle ( ImVec2 ( frame_bb . Max . x - arrow_size + style . FramePadding . y , frame_bb . Min . y + style . FramePadding . y ) , ImGuiDir_Down ) ;
if ( preview_value ! = NULL )
RenderTextClipped ( frame_bb . Min + style . FramePadding , value_bb . Max , preview_value , NULL , NULL , ImVec2 ( 0.0f , 0.0f ) ) ;
if ( label_size . x > 0 )
RenderText ( ImVec2 ( frame_bb . Max . x + style . ItemInnerSpacing . x , frame_bb . Min . y + style . FramePadding . y ) , label ) ;
@ -10263,11 +10263,11 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
ImVec2 size_expected = CalcSizeAfterConstraint ( popup_window , CalcSizeAutoFit ( popup_window , size_contents ) ) ;
if ( flags & ImGuiComboFlags_PopupAlignLeft )
popup_window - > AutoPosLastDirection = ImGuiDir_Left ;
ImVec2 pos = FindBestWindowPosForPopup ( frame_bb . GetBL ( ) , size_expected , & popup_window - > AutoPosLastDirection , frame_bb , ImGui WindowFlags _ComboBox) ;
ImVec2 pos = FindBestWindowPosForPopup ( frame_bb . GetBL ( ) , size_expected , & popup_window - > AutoPosLastDirection , frame_bb , ImGui PopupPositionPolicy _ComboBox) ;
SetNextWindowPos ( pos ) ;
}
ImGuiWindowFlags window_flags = ImGuiWindowFlags_ ComboBox | ImGuiWindowFlags_ AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings ;
ImGuiWindowFlags window_flags = ImGuiWindowFlags_ AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings ;
if ( ! Begin ( name , NULL , window_flags ) )
{
EndPopup ( ) ;