@ -320,6 +320,12 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
IM_ASSERT ( inner_width > = 0.0f ) ;
// If an outer size is specified ahead we will be able to early out when not visible. Exact clipping criteria may evolve.
// FIXME: coarse clipping because access to table data causes two issues:
// - instance numbers varying/unstable. may not be a direct problem for users, but could make outside access broken or confusing, e.g. TestEngine.
// - can't implement support for ImGuiChildFlags_ResizeY as we need to somehow pull the height data from somewhere. this also needs stable instance numbers.
// The side-effects of accessing table data on coarse clip would be:
// - always reserving the pooled ImGuiTable data ahead for a fully clipped table (minor IMHO). Also the 'outer_window_is_measuring_size' criteria may already be defeating this in some situations.
// - always performing the GetOrAddByKey() O(log N) query in g.Tables.Map[].
const bool use_child_window = ( flags & ( ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY ) ) ! = 0 ;
const ImVec2 avail_size = GetContentRegionAvail ( ) ;
const ImVec2 actual_outer_size = CalcItemSize ( outer_size , ImMax ( avail_size . x , 1.0f ) , use_child_window ? ImMax ( avail_size . y , 1.0f ) : 0.0f ) ;
@ -338,7 +344,6 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
// Acquire storage for the table
ImGuiTable * table = g . Tables . GetOrAddByKey ( id ) ;
const ImGuiTableFlags table_last_flags = table - > Flags ;
// Acquire temporary buffers
const int table_idx = g . Tables . GetIndex ( table ) ;
@ -356,6 +361,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
// Initialize
const int previous_frame_active = table - > LastFrameActive ;
const int instance_no = ( previous_frame_active ! = g . FrameCount ) ? 0 : table - > InstanceCurrent + 1 ;
const ImGuiTableFlags previous_flags = table - > Flags ;
table - > ID = id ;
table - > Flags = flags ;
table - > LastFrameActive = g . FrameCount ;
@ -402,7 +408,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
SetNextWindowContentSize ( ImVec2 ( override_content_size . x ! = FLT_MAX ? override_content_size . x : 0.0f , override_content_size . y ! = FLT_MAX ? override_content_size . y : 0.0f ) ) ;
// Reset scroll if we are reactivating it
if ( ( table_last _flags & ( ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY ) ) = = 0 )
if ( ( previous _flags & ( ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY ) ) = = 0 )
SetNextWindowScroll ( ImVec2 ( 0.0f , 0.0f ) ) ;
// Create scrolling region (without border and zero window padding)
@ -515,7 +521,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
if ( inner_window ! = outer_window ) // So EndChild() within the inner window can restore the table properly.
inner_window - > DC . CurrentTableIdx = table_idx ;
if ( ( table_last _flags & ImGuiTableFlags_Reorderable ) & & ( flags & ImGuiTableFlags_Reorderable ) = = 0 )
if ( ( previous _flags & ImGuiTableFlags_Reorderable ) & & ( flags & ImGuiTableFlags_Reorderable ) = = 0 )
table - > IsResetDisplayOrderRequest = true ;
// Mark as used to avoid GC
@ -2928,6 +2934,7 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table)
}
// Write output
// May be able to move all SortSpecs data from table (48 bytes) to ImGuiTableTempData if we decide to write it back on every BeginTable()
ImGuiTableColumnSortSpecs * sort_specs = ( table - > SortSpecsCount = = 0 ) ? NULL : ( table - > SortSpecsCount = = 1 ) ? & table - > SortSpecsSingle : table - > SortSpecsMulti . Data ;
if ( dirty & & sort_specs ! = NULL )
for ( int column_n = 0 ; column_n < table - > ColumnsCount ; column_n + + )