@ -710,6 +710,7 @@ static inline bool IsWindowContentHoverable(ImGuiWindow* window);
static void ClearSetNextWindowData ( ) ;
static void CheckStacksSize ( ImGuiWindow * window , bool write ) ;
static void Scrollbar ( ImGuiWindow * window , bool horizontal ) ;
static ImVec2 CalcNextScrollFromScrollTargetAndClamp ( ImGuiWindow * window ) ;
static void AddDrawListToRenderList ( ImVector < ImDrawList * > & out_render_list , ImDrawList * draw_list ) ;
static void AddWindowToRenderList ( ImVector < ImDrawList * > & out_render_list , ImGuiWindow * window ) ;
@ -4539,6 +4540,19 @@ static void ApplySizeFullWithConstraint(ImGuiWindow* window, ImVec2 new_size)
window - > SizeFull = new_size ;
}
static ImVec2 CalcNextScrollFromScrollTargetAndClamp ( ImGuiWindow * window )
{
ImVec2 scroll = window - > Scroll ;
if ( window - > ScrollTarget . x < FLT_MAX )
scroll . x = window - > ScrollTarget . x - ( window - > ScrollTargetCenterRatio . x * window - > SizeFull . x ) ;
if ( window - > ScrollTarget . y < FLT_MAX )
scroll . y = window - > ScrollTarget . y - ( ( 1.0f - window - > ScrollTargetCenterRatio . y ) * ( window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ) ) - ( window - > ScrollTargetCenterRatio . y * window - > SizeFull . y ) ;
scroll = ImMax ( scroll , ImVec2 ( 0.0f , 0.0f ) ) ;
if ( ! window - > Collapsed & & ! window - > SkipItems )
scroll = ImMin ( scroll , ImMax ( ImVec2 ( 0.0f , 0.0f ) , window - > SizeContents - window - > SizeFull + window - > ScrollbarSizes ) ) ;
return scroll ;
}
// Push a new ImGui window to add widgets to.
// - A default window called "Debug" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair.
// - Begin/End can be called multiple times during the frame with the same window name to append content.
@ -4858,21 +4872,8 @@ bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_us
window - > FocusIdxAllRequestNext = window - > FocusIdxTabRequestNext = INT_MAX ;
// Apply scrolling
if ( window - > ScrollTarget . x < FLT_MAX )
{
float center_ratio = window - > ScrollTargetCenterRatio . x ;
window - > Scroll . x = window - > ScrollTarget . x - ( center_ratio * window - > SizeFull . x ) ;
window - > ScrollTarget . x = FLT_MAX ;
}
if ( window - > ScrollTarget . y < FLT_MAX )
{
float center_ratio = window - > ScrollTargetCenterRatio . y ;
window - > Scroll . y = window - > ScrollTarget . y - ( ( 1.0f - center_ratio ) * ( window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ) ) - ( center_ratio * window - > SizeFull . y ) ;
window - > ScrollTarget . y = FLT_MAX ;
}
window - > Scroll = ImMax ( window - > Scroll , ImVec2 ( 0.0f , 0.0f ) ) ;
if ( ! window - > Collapsed & & ! window - > SkipItems )
window - > Scroll = ImMin ( window - > Scroll , ImMax ( ImVec2 ( 0.0f , 0.0f ) , window - > SizeContents - window - > SizeFull + window - > ScrollbarSizes ) ) ;
window - > Scroll = CalcNextScrollFromScrollTargetAndClamp ( window ) ;
window - > ScrollTarget = ImVec2 ( FLT_MAX , FLT_MAX ) ;
// Modal window darkens what is behind them
if ( ( flags & ImGuiWindowFlags_Modal ) ! = 0 & & window = = GetFrontMostModalRootWindow ( ) )