@ -5420,9 +5420,9 @@ static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& s
if ( ! ( window - > Flags & ( ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize ) ) )
{
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 . y = ImMax ( new_size . y , decoration_up_height + ImMax ( 0.0f , g . Style . WindowRounding - 1.0f ) ) ; // Reduce artifacts with very small windows
const float minimum_height = window_for_height - > TitleBarHeight ( ) + window_for_height - > MenuBarHeight ( ) + ImMax ( 0.0f , g . Style . WindowRounding - 1.0f ) ;
new_size . y = ImMax ( new_size . y , minimum_height ) ; // Reduce artifacts with very small windows
}
return new_size ;
}
@ -5451,9 +5451,10 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont
{
ImGuiContext & g = * GImGui ;
ImGuiStyle & style = g . Style ;
const float decoration_up_height = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ;
const float decoration_w_without_scrollbars = window - > DecoOuterSizeX1 + window - > DecoOuterSizeX2 - window - > ScrollbarSizes . x ;
const float decoration_h_without_scrollbars = window - > DecoOuterSizeY1 + window - > DecoOuterSizeY2 - window - > ScrollbarSizes . y ;
ImVec2 size_pad = window - > WindowPadding * 2.0f ;
ImVec2 size_desired = size_contents + size_pad + ImVec2 ( 0.0f , decoration_up_height ) ;
ImVec2 size_desired = size_contents + size_pad + ImVec2 ( decoration_w_without_scrollbars , decoration_h_without_scrollbars ) ;
if ( window - > Flags & ImGuiWindowFlags_Tooltip )
{
// Tooltip always resize
@ -5474,8 +5475,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),
// 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 ) ;
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 - decoration_up_height < size_contents . y & & ! ( window - > Flags & ImGuiWindowFlags_NoScrollbar ) ) | | ( window - > Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar ) ;
bool will_have_scrollbar_x = ( size_auto_fit_after_constraint . x - size_pad . x - decoration_w_without_scrollbars < 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 - decoration_h_without_scrollbars < size_contents . y & & ! ( window - > Flags & ImGuiWindowFlags_NoScrollbar ) ) | | ( window - > Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar ) ;
if ( will_have_scrollbar_x )
size_auto_fit . y + = style . ScrollbarSize ;
if ( will_have_scrollbar_y )
@ -6237,6 +6238,15 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// SIZE
// Outer Decoration Sizes
// (we need to clear ScrollbarSize immediatly as CalcWindowAutoFitSize() needs it and can be called from other locations).
const ImVec2 scrollbar_sizes_from_last_frame = window - > ScrollbarSizes ;
window - > DecoOuterSizeX1 = 0.0f ;
window - > DecoOuterSizeX2 = 0.0f ;
window - > DecoOuterSizeY1 = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ;
window - > DecoOuterSizeY2 = 0.0f ;
window - > ScrollbarSizes = ImVec2 ( 0.0f , 0.0f ) ;
// Calculate auto-fit size, handle automatic resize
const ImVec2 size_auto_fit = CalcWindowAutoFitSize ( window , window - > ContentSizeIdeal ) ;
if ( ( flags & ImGuiWindowFlags_AlwaysAutoResize ) & & ! window - > Collapsed )
@ -6275,9 +6285,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window - > SizeFull = CalcWindowSizeAfterConstraint ( window , window - > SizeFull ) ;
window - > Size = window - > Collapsed & & ! ( flags & ImGuiWindowFlags_ChildWindow ) ? window - > TitleBarRect ( ) . GetSize ( ) : window - > SizeFull ;
// Decoration size
const float decoration_up_height = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ;
// POSITION
// Popup latch its initial position, will position itself when it appears next frame
@ -6384,9 +6391,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
if ( ! window - > Collapsed )
{
// When reading the current size we need to read it after size constraints have been applied.
// When we use InnerRect here we are intentionally reading last frame size, same for ScrollbarSizes values before we set them again.
ImVec2 avail_size_from_current_frame = ImVec2 ( window - > SizeFull . x , window - > SizeFull . y - decoration_up_height ) ;
ImVec2 avail_size_from_last_frame = window - > InnerRect . GetSize ( ) + window - > ScrollbarSizes ;
// Intentionally use previous frame values for InnerRect and ScrollbarSizes.
// And when we use window->DecorationUp here it doesn't have ScrollbarSizes.y applied yet.
ImVec2 avail_size_from_current_frame = ImVec2 ( window - > SizeFull . x , window - > SizeFull . y - ( window - > DecoOuterSizeY1 + window - > DecoOuterSizeY2 ) ) ;
ImVec2 avail_size_from_last_frame = window - > InnerRect . GetSize ( ) + scrollbar_sizes_from_last_frame ;
ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2 ( 0 , 0 ) : window - > ContentSize + window - > WindowPadding * 2.0f ;
float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame . x : avail_size_from_last_frame . x ;
float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame . y : avail_size_from_last_frame . y ;
@ -6396,6 +6404,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
if ( window - > ScrollbarX & & ! window - > ScrollbarY )
window - > ScrollbarY = ( needed_size_from_last_frame . y > size_y_for_scrollbars ) & & ! ( flags & ImGuiWindowFlags_NoScrollbar ) ;
window - > ScrollbarSizes = ImVec2 ( window - > ScrollbarY ? style . ScrollbarSize : 0.0f , window - > ScrollbarX ? style . ScrollbarSize : 0.0f ) ;
// Amend the partially filled window->DecorationXXX values.
window - > DecoOuterSizeX2 + = window - > ScrollbarSizes . x ;
window - > DecoOuterSizeY2 + = window - > ScrollbarSizes . y ;
}
// UPDATE RECTANGLES (1- THOSE NOT AFFECTED BY SCROLLING)
@ -6419,10 +6431,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// - ScrollToRectEx()
// - NavUpdatePageUpPageDown()
// - Scrollbar()
window - > InnerRect . Min . x = window - > Pos . x ;
window - > InnerRect . Min . y = window - > Pos . y + decoration_up_height ;
window - > InnerRect . Max . x = window - > Pos . x + window - > Size . x - window - > ScrollbarSizes . x ;
window - > InnerRect . Max . y = window - > Pos . y + window - > Size . y - window - > ScrollbarSizes . y ;
window - > InnerRect . Min . x = window - > Pos . x + window - > DecoOuterSizeX1 ;
window - > InnerRect . Min . y = window - > Pos . y + window - > DecoOuterSizeY1 ;
window - > InnerRect . Max . x = window - > Pos . x + window - > Size . x - window - > DecoOuterSizeX2 ;
window - > InnerRect . Max . y = window - > Pos . y + window - > Size . y - window - > DecoOuterSizeY2 ;
// Inner clipping rectangle.
// Will extend a little bit outside the normal work region.
@ -6499,8 +6511,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// - BeginTabBar() for right-most edge
const bool allow_scrollbar_x = ! ( flags & ImGuiWindowFlags_NoScrollbar ) & & ( flags & ImGuiWindowFlags_HorizontalScrollbar ) ;
const bool allow_scrollbar_y = ! ( flags & ImGuiWindowFlags_NoScrollbar ) ;
const float work_rect_size_x = ( window - > ContentSizeExplicit . x ! = 0.0f ? window - > ContentSizeExplicit . x : ImMax ( allow_scrollbar_x ? window - > ContentSize . x : 0.0f , window - > Size . x - window - > WindowPadding . x * 2.0f - window - > ScrollbarSizes . x ) ) ;
const float work_rect_size_y = ( window - > ContentSizeExplicit . y ! = 0.0f ? window - > ContentSizeExplicit . y : ImMax ( allow_scrollbar_y ? window - > ContentSize . y : 0.0f , window - > Size . y - window - > WindowPadding . y * 2.0f - decoration_up_height - window - > ScrollbarSizes . y ) ) ;
const float work_rect_size_x = ( window - > ContentSizeExplicit . x ! = 0.0f ? window - > ContentSizeExplicit . x : ImMax ( allow_scrollbar_x ? window - > ContentSize . x : 0.0f , window - > Size . x - window - > WindowPadding . x * 2.0f - ( window - > DecoOuterSizeX1 + window - > DecoOuterSizeX2 ) ) ) ;
const float work_rect_size_y = ( window - > ContentSizeExplicit . y ! = 0.0f ? window - > ContentSizeExplicit . y : ImMax ( allow_scrollbar_y ? window - > ContentSize . y : 0.0f , window - > Size . y - window - > WindowPadding . y * 2.0f - ( window - > DecoOuterSizeY1 + window - > DecoOuterSizeY2 ) ) ) ;
window - > WorkRect . Min . x = ImFloor ( window - > InnerRect . Min . x - window - > Scroll . x + ImMax ( window - > WindowPadding . x , window - > WindowBorderSize ) ) ;
window - > WorkRect . Min . y = ImFloor ( window - > InnerRect . Min . y - window - > Scroll . y + ImMax ( window - > WindowPadding . y , window - > WindowBorderSize ) ) ;
window - > WorkRect . Max . x = window - > WorkRect . Min . x + work_rect_size_x ;
@ -6511,21 +6523,21 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it.
// Used by:
// - Mouse wheel scrolling + many other things
window - > ContentRegionRect . Min . x = window - > Pos . x - window - > Scroll . x + window - > WindowPadding . x ;
window - > ContentRegionRect . Min . y = window - > Pos . y - window - > Scroll . y + window - > WindowPadding . y + decoration_up_height ;
window - > ContentRegionRect . Max . x = window - > ContentRegionRect . Min . x + ( window - > ContentSizeExplicit . x ! = 0.0f ? window - > ContentSizeExplicit . x : ( window - > Size . x - window - > WindowPadding . x * 2.0f - window - > ScrollbarSizes . x ) ) ;
window - > ContentRegionRect . Max . y = window - > ContentRegionRect . Min . y + ( window - > ContentSizeExplicit . y ! = 0.0f ? window - > ContentSizeExplicit . y : ( window - > Size . y - window - > WindowPadding . y * 2.0f - decoration_up_height - window - > ScrollbarSizes . y ) ) ;
window - > ContentRegionRect . Min . x = window - > Pos . x - window - > Scroll . x + window - > WindowPadding . x + window - > DecoOuterSizeX1 ;
window - > ContentRegionRect . Min . y = window - > Pos . y - window - > Scroll . y + window - > WindowPadding . y + window - > DecoOuterSizeY1 ;
window - > ContentRegionRect . Max . x = window - > ContentRegionRect . Min . x + ( window - > ContentSizeExplicit . x ! = 0.0f ? window - > ContentSizeExplicit . x : ( window - > Size . x - window - > WindowPadding . x * 2.0f - ( window - > DecoOuterSizeX1 + window - > DecoOuterSizeX2 ) ) ) ;
window - > ContentRegionRect . Max . y = window - > ContentRegionRect . Min . y + ( window - > ContentSizeExplicit . y ! = 0.0f ? window - > ContentSizeExplicit . y : ( window - > Size . y - window - > WindowPadding . y * 2.0f - ( window - > DecoOuterSizeY1 + window - > DecoOuterSizeY2 ) ) ) ;
// Setup drawing context
// (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.)
window - > DC . Indent . x = 0.0f + window - > WindowPadding . x - window - > Scroll . x ;
window - > DC . Indent . x = window - > DecoOuterSizeX1 + window - > WindowPadding . x - window - > Scroll . x ;
window - > DC . GroupOffset . x = 0.0f ;
window - > DC . ColumnsOffset . x = 0.0f ;
// Record the loss of precision of CursorStartPos which can happen due to really large scrolling amount.
// This is used by clipper to compensate and fix the most common use case of large scroll area. Easy and cheap, next best thing compared to switching everything to double or ImU64.
double start_pos_highp_x = ( double ) window - > Pos . x + window - > WindowPadding . x - ( double ) window - > Scroll . x + window - > DC . ColumnsOffset . x ;
double start_pos_highp_y = ( double ) window - > Pos . y + window - > WindowPadding . y - ( double ) window - > Scroll . y + decoration_up_height ;
double start_pos_highp_x = ( double ) window - > Pos . x + window - > WindowPadding . x - ( double ) window - > Scroll . x + window - > DecoOuterSizeX1 + window - > D C . ColumnsOffset . x ;
double start_pos_highp_y = ( double ) window - > Pos . y + window - > WindowPadding . y - ( double ) window - > Scroll . y + window - > DecoOuterSizeY1 ;
window - > DC . CursorStartPos = ImVec2 ( ( float ) start_pos_highp_x , ( float ) start_pos_highp_y ) ;
window - > DC . CursorStartPosLossyness = ImVec2 ( ( float ) ( start_pos_highp_x - window - > DC . CursorStartPos . x ) , ( float ) ( start_pos_highp_y - window - > DC . CursorStartPos . y ) ) ;
window - > DC . CursorPos = window - > DC . CursorStartPos ;
@ -9103,7 +9115,7 @@ void ImGui::ItemSize(const ImVec2& size, float text_baseline_y)
window - > DC . CursorPosPrevLine . x = window - > DC . CursorPos . x + size . x ;
window - > DC . CursorPosPrevLine . y = line_y1 ;
window - > DC . CursorPos . x = IM_FLOOR ( window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ) ; // Next line
window - > DC . CursorPos . y = IM_FLOOR ( line_y1 + line_height + g . Style . ItemSpacing . y ) ; // Next line
window - > DC . CursorPos . y = IM_FLOOR ( line_y1 + line_height + g . Style . ItemSpacing . y ) ; // Next line
window - > DC . CursorMaxPos . x = ImMax ( window - > DC . CursorMaxPos . x , window - > DC . CursorPosPrevLine . x ) ;
window - > DC . CursorMaxPos . y = ImMax ( window - > DC . CursorMaxPos . y , window - > DC . CursorPos . y - g . Style . ItemSpacing . y ) ;
//if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]
@ -9577,7 +9589,7 @@ static float CalcScrollEdgeSnap(float target, float snap_min, float snap_max, fl
static ImVec2 CalcNextScrollFromScrollTargetAndClamp ( ImGuiWindow * window )
{
ImVec2 scroll = window - > Scroll ;
ImVec2 decoration_size ( window - > ScrollbarSizes . x , window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) + window - > ScrollbarSizes . y ) ;
ImVec2 decoration_size ( window - > DecoOuterSizeX1 + window - > DecoOuterSizeX2 , window - > DecoOuterSizeY1 + window - > DecoOuterSizeY2 ) ;
for ( int axis = 0 ; axis < 2 ; axis + + )
{
if ( window - > ScrollTarget [ axis ] < FLT_MAX )
@ -9745,7 +9757,7 @@ void ImGui::SetScrollY(float scroll_y)
void ImGui : : SetScrollFromPosX ( ImGuiWindow * window , float local_x , float center_x_ratio )
{
IM_ASSERT ( center_x_ratio > = 0.0f & & center_x_ratio < = 1.0f ) ;
window - > ScrollTarget . x = IM_FLOOR ( local_x + window - > Scroll . x ) ; // Convert local position to scroll offset
window - > ScrollTarget . x = IM_FLOOR ( local_x - window - > DecoOuterSizeX1 + window - > Scroll . x ) ; // Convert local position to scroll offset
window - > ScrollTargetCenterRatio . x = center_x_ratio ;
window - > ScrollTargetEdgeSnapDist . x = 0.0f ;
}
@ -9753,9 +9765,7 @@ void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x
void ImGui : : SetScrollFromPosY ( ImGuiWindow * window , float local_y , float center_y_ratio )
{
IM_ASSERT ( center_y_ratio > = 0.0f & & center_y_ratio < = 1.0f ) ;
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 - > DecoOuterSizeY1 + window - > Scroll . y ) ; // Convert local position to scroll offset
window - > ScrollTargetCenterRatio . y = center_y_ratio ;
window - > ScrollTargetEdgeSnapDist . y = 0.0f ;
}