@ -5172,8 +5172,9 @@ static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& s
if ( ! ( window - > Flags & ( ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize ) ) )
if ( ! ( window - > Flags & ( ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize ) ) )
{
{
ImGuiWindow * window_for_height = window ;
ImGuiWindow * window_for_height = window ;
const float decoration_up_height = window_for_height - > TitleBarHeight ( ) + window_for_height - > MenuBarHeight ( ) ;
new_size = ImMax ( new_size , g . Style . WindowMinSize ) ;
new_size = ImMax ( new_size , g . Style . WindowMinSize ) ;
new_size . y = ImMax ( new_size . y , window_for_height- > TitleBarHeight ( ) + window_for_height - > MenuBarHeight ( ) + ImMax ( 0.0f , g . Style . WindowRounding - 1.0f ) ) ; // Reduce artifacts with very small windows
new_size . y = ImMax ( new_size . y , decoration_up_height + ImMax ( 0.0f , g . Style . WindowRounding - 1.0f ) ) ; // Reduce artifacts with very small windows
}
}
return new_size ;
return new_size ;
}
}
@ -5202,9 +5203,9 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
ImGuiStyle & style = g . Style ;
ImGuiStyle & style = g . Style ;
ImVec2 size_decorations = ImVec2 ( 0.0f , window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ) ;
const float decoration_up_height = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ;
ImVec2 size_pad = window - > WindowPadding * 2.0f ;
ImVec2 size_pad = window - > WindowPadding * 2.0f ;
ImVec2 size_desired = size_contents + size_pad + size_decorations ;
ImVec2 size_desired = size_contents + size_pad + ImVec2( 0.0f , decoration_up_height ) ;
if ( window - > Flags & ImGuiWindowFlags_Tooltip )
if ( window - > Flags & ImGuiWindowFlags_Tooltip )
{
{
// Tooltip always resize
// Tooltip always resize
@ -5226,8 +5227,8 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont
// When the window cannot fit all contents (either because of constraints, either because screen is too small),
// When the window cannot fit all contents (either because of constraints, either because screen is too small),
// we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding.
// we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding.
ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint ( window , size_auto_fit ) ;
ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint ( window , size_auto_fit ) ;
bool will_have_scrollbar_x = ( size_auto_fit_after_constraint . x - size_pad . x - size_decorations . x < size_contents . x & & ! ( window - > Flags & ImGuiWindowFlags_NoScrollbar ) & & ( window - > Flags & ImGuiWindowFlags_HorizontalScrollbar ) ) | | ( window - > Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar ) ;
bool will_have_scrollbar_x = ( size_auto_fit_after_constraint . x - size_pad . x - 0.0f < size_contents . x & & ! ( window - > Flags & ImGuiWindowFlags_NoScrollbar ) & & ( window - > Flags & ImGuiWindowFlags_HorizontalScrollbar ) ) | | ( window - > Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar ) ;
bool will_have_scrollbar_y = ( size_auto_fit_after_constraint . y - size_pad . y - size_decorations. y < size_contents . y & & ! ( window - > Flags & ImGuiWindowFlags_NoScrollbar ) ) | | ( window - > Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar ) ;
bool will_have_scrollbar_y = ( size_auto_fit_after_constraint . y - size_pad . y - decoration_up_height < size_contents . y & & ! ( window - > Flags & ImGuiWindowFlags_NoScrollbar ) ) | | ( window - > Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar ) ;
if ( will_have_scrollbar_x )
if ( will_have_scrollbar_x )
size_auto_fit . y + = style . ScrollbarSize ;
size_auto_fit . y + = style . ScrollbarSize ;
if ( will_have_scrollbar_y )
if ( will_have_scrollbar_y )
@ -7774,24 +7775,29 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
ImVec2 scroll = window - > Scroll ;
ImVec2 scroll = window - > Scroll ;
if ( window - > ScrollTarget . x < FLT_MAX )
if ( window - > ScrollTarget . x < FLT_MAX )
{
{
float decoration_total_width = window - > ScrollbarSizes . x ;
float center_x_ratio = window - > ScrollTargetCenterRatio . x ;
float center_x_ratio = window - > ScrollTargetCenterRatio . x ;
float scroll_target_x = window - > ScrollTarget . x ;
float scroll_target_x = window - > ScrollTarget . x ;
float snap_x_min = 0.0f ;
float snap_x_max = window - > ScrollMax . x + window - > Size . x ;
if ( window - > ScrollTargetEdgeSnapDist . x > 0.0f )
if ( window - > ScrollTargetEdgeSnapDist . x > 0.0f )
{
float snap_x_min = 0.0f ;
float snap_x_max = window - > ScrollMax . x + window - > SizeFull . x - decoration_total_width ;
scroll_target_x = CalcScrollEdgeSnap ( scroll_target_x , snap_x_min , snap_x_max , window - > ScrollTargetEdgeSnapDist . x , center_x_ratio ) ;
scroll_target_x = CalcScrollEdgeSnap ( scroll_target_x , snap_x_min , snap_x_max , window - > ScrollTargetEdgeSnapDist . x , center_x_ratio ) ;
scroll . x = scroll_target_x - center_x_ratio * ( window - > SizeFull . x - window - > ScrollbarSizes . x ) ;
}
scroll . x = scroll_target_x - center_x_ratio * ( window - > SizeFull . x - decoration_total_width ) ;
}
}
if ( window - > ScrollTarget . y < FLT_MAX )
if ( window - > ScrollTarget . y < FLT_MAX )
{
{
float decoration_ up _height = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ;
float decoration_ total _height = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) + window - > ScrollbarSizes . y ;
float center_y_ratio = window - > ScrollTargetCenterRatio . y ;
float center_y_ratio = window - > ScrollTargetCenterRatio . y ;
float scroll_target_y = window - > ScrollTarget . y ;
float scroll_target_y = window - > ScrollTarget . y ;
float snap_y_min = 0.0f ;
float snap_y_max = window - > ScrollMax . y + window - > Size . y - decoration_up_height ;
if ( window - > ScrollTargetEdgeSnapDist . y > 0.0f )
if ( window - > ScrollTargetEdgeSnapDist . y > 0.0f )
{
float snap_y_min = 0.0f ;
float snap_y_max = window - > ScrollMax . y + window - > SizeFull . y - decoration_total_height ;
scroll_target_y = CalcScrollEdgeSnap ( scroll_target_y , snap_y_min , snap_y_max , window - > ScrollTargetEdgeSnapDist . y , center_y_ratio ) ;
scroll_target_y = CalcScrollEdgeSnap ( scroll_target_y , snap_y_min , snap_y_max , window - > ScrollTargetEdgeSnapDist . y , center_y_ratio ) ;
scroll . y = scroll_target_y - center_y_ratio * ( window - > SizeFull . y - window - > ScrollbarSizes . y - decoration_up_height ) ;
}
scroll . y = scroll_target_y - center_y_ratio * ( window - > SizeFull . y - decoration_total_height ) ;
}
}
scroll . x = IM_FLOOR ( ImMax ( scroll . x , 0.0f ) ) ;
scroll . x = IM_FLOOR ( ImMax ( scroll . x , 0.0f ) ) ;
scroll . y = IM_FLOOR ( ImMax ( scroll . y , 0.0f ) ) ;
scroll . y = IM_FLOOR ( ImMax ( scroll . y , 0.0f ) ) ;
@ -7904,7 +7910,8 @@ void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x
void ImGui : : SetScrollFromPosY ( ImGuiWindow * window , float local_y , float center_y_ratio )
void ImGui : : SetScrollFromPosY ( ImGuiWindow * window , float local_y , float center_y_ratio )
{
{
IM_ASSERT ( center_y_ratio > = 0.0f & & center_y_ratio < = 1.0f ) ;
IM_ASSERT ( center_y_ratio > = 0.0f & & center_y_ratio < = 1.0f ) ;
local_y - = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ; // FIXME: Would be nice to have a more standardized access to our scrollable/client rect
const float decoration_up_height = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ; // FIXME: Would be nice to have a more standardized access to our scrollable/client rect;
local_y - = decoration_up_height ;
window - > ScrollTarget . y = IM_FLOOR ( local_y + window - > Scroll . y ) ; // Convert local position to scroll offset
window - > ScrollTarget . y = IM_FLOOR ( local_y + window - > Scroll . y ) ; // Convert local position to scroll offset
window - > ScrollTargetCenterRatio . y = center_y_ratio ;
window - > ScrollTargetCenterRatio . y = center_y_ratio ;
window - > ScrollTargetEdgeSnapDist . y = 0.0f ;
window - > ScrollTargetEdgeSnapDist . y = 0.0f ;
@ -7927,7 +7934,7 @@ void ImGui::SetScrollHereX(float center_x_ratio)
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
ImGuiWindow * window = g . CurrentWindow ;
float spacing_x = g. Style . ItemSpacing . x ;
float spacing_x = ImMax( window - > WindowPadding . x , g. Style . ItemSpacing . x ) ;
float target_pos_x = ImLerp ( window - > DC . LastItemRect . Min . x - spacing_x , window - > DC . LastItemRect . Max . x + spacing_x , center_x_ratio ) ;
float target_pos_x = ImLerp ( window - > DC . LastItemRect . Min . x - spacing_x , window - > DC . LastItemRect . Max . x + spacing_x , center_x_ratio ) ;
SetScrollFromPosX ( window , target_pos_x - window - > Pos . x , center_x_ratio ) ; // Convert from absolute to local pos
SetScrollFromPosX ( window , target_pos_x - window - > Pos . x , center_x_ratio ) ; // Convert from absolute to local pos
@ -7940,7 +7947,7 @@ void ImGui::SetScrollHereY(float center_y_ratio)
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
ImGuiWindow * window = g . CurrentWindow ;
float spacing_y = g. Style . ItemSpacing . y ;
float spacing_y = ImMax( window - > WindowPadding . y , g. Style . ItemSpacing . y ) ;
float target_pos_y = ImLerp ( window - > DC . CursorPosPrevLine . y - spacing_y , window - > DC . CursorPosPrevLine . y + window - > DC . PrevLineSize . y + spacing_y , center_y_ratio ) ;
float target_pos_y = ImLerp ( window - > DC . CursorPosPrevLine . y - spacing_y , window - > DC . CursorPosPrevLine . y + window - > DC . PrevLineSize . y + spacing_y , center_y_ratio ) ;
SetScrollFromPosY ( window , target_pos_y - window - > Pos . y , center_y_ratio ) ; // Convert from absolute to local pos
SetScrollFromPosY ( window , target_pos_y - window - > Pos . y , center_y_ratio ) ; // Convert from absolute to local pos