@ -80,20 +80,20 @@ Index of this file:
// - outer_size.x <= 0.0f -> Right-align from window/work-rect right-most edge. With -FLT_MIN or 0.0f will align exactly on right-most edge.
// - outer_size.x > 0.0f -> Set Fixed width.
// Y with ScrollX/ScrollY disabled: we output table directly in current window
// - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful is parent window can vertically scroll.
// - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful if parent window can vertically scroll.
// - outer_size.y = 0.0f -> No minimum height (but will auto extend, unless _NoHostExtendY is set)
// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtenY is set)
// Y with ScrollX/ScrollY enabled: using a child window for scrolling
// - outer_size.y < 0.0f -> Bottom-align. Not meaningful is parent window can vertically scroll.
// - outer_size.y < 0.0f -> Bottom-align. Not meaningful if parent window can vertically scroll.
// - outer_size.y = 0.0f -> Bottom-align, consistent with BeginChild(). Not recommended unless table is last item in parent window.
// - outer_size.y > 0.0f -> Set Exact height. Recommended when using Scrolling on any axis.
//-----------------------------------------------------------------------------
// Outer size is also affected by the NoHostExtendX/NoHostExtendY flags.
// Important to that note how the two flags have slightly different behaviors!
// Important to note how the two flags have slightly different behaviors!
// - ImGuiTableFlags_NoHostExtendX -> Make outer width auto-fit to columns (overriding outer_size.x value). Only available when ScrollX/ScrollY are disabled and Stretch columns are not used.
// - ImGuiTableFlags_NoHostExtendY -> Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY is disabled. Data below the limit will be clipped and not visible.
// In theory ImGuiTableFlags_NoHostExtendY could be the default and any non-scrolling tables with outer_size.y != 0.0f would use exact height.
// This would be consistent but perhaps less useful and more confusing (as vertically clipped items are not easily noticeable)
// This would be consistent but perhaps less useful and more confusing (as vertically clipped items are not useful and not easily noticeable).
//-----------------------------------------------------------------------------
// About 'inner_width':
// With ScrollX disabled:
@ -112,15 +112,16 @@ Index of this file:
//-----------------------------------------------------------------------------
// COLUMNS SIZING POLICIES
// (Reference: ImGuiTableFlags_SizingXXX flags and ImGuiTableColumnFlags_WidthXXX flags)
//-----------------------------------------------------------------------------
// About overriding column sizing policy and width/weight with TableSetupColumn():
// We use a default parameter of 'init_width_or_weight == -1 '.
// We use a default parameter of -1 for 'init_width'/'init_weight '.
// - with ImGuiTableColumnFlags_WidthFixed, init_width <= 0 (default) --> width is automatic
// - with ImGuiTableColumnFlags_WidthFixed, init_width > 0 (explicit) --> width is custom
// - with ImGuiTableColumnFlags_WidthStretch, init_weight <= 0 (default) --> weight is 1.0f
// - with ImGuiTableColumnFlags_WidthStretch, init_weight > 0 (explicit) --> weight is custom
// Widths are specified _without_ CellPadding. If you specify a width of 100.0f, the column will be cover (100.0f + Padding * 2.0f)
// and you can fit a 100.0f wide item in it without clipping and with full padding.
// and you can fit a 100.0f wide item in it without clipping and with padding honored .
//-----------------------------------------------------------------------------
// About default sizing policy (if you don't specify a ImGuiTableColumnFlags_WidthXXXX flag)
// - with Table policy ImGuiTableFlags_SizingFixedFit --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is equal to contents width
@ -134,10 +135,10 @@ Index of this file:
// - using mixed policies with ScrollX does not make much sense, as using Stretch columns with ScrollX does not make much sense in the first place!
// that is, unless 'inner_width' is passed to BeginTable() to explicitly provide a total width to layout columns in.
// - when using ImGuiTableFlags_SizingFixedSame with mixed columns, only the Fixed/Auto columns will match their widths to the width of the maximum contents.
// - when using ImGuiTableFlags_SizingStretchSame with mixed columns, only the Stretch columns will match their weight/widths.
// - when using ImGuiTableFlags_SizingStretchSame with mixed columns, only the Stretch columns will match their weights /widths.
//-----------------------------------------------------------------------------
// About using column width:
// If a column is manual resizable or has a width specified with TableSetupColumn():
// If a column is manually resizable or has a width specified with TableSetupColumn():
// - you may use GetContentRegionAvail().x to query the width available in a given column.
// - right-side alignment features such as SetNextItemWidth(-x) or PushItemWidth(-x) will rely on this width.
// If the column is not resizable and has no width specified with TableSetupColumn():
@ -151,7 +152,7 @@ Index of this file:
// TABLES CLIPPING/CULLING
//-----------------------------------------------------------------------------
// About clipping/culling of Rows in Tables:
// - For large numbers of rows, it is recommended you use ImGuiListClipper to only submit visible rows.
// - For large numbers of rows, it is recommended you use ImGuiListClipper to submit only visible rows.
// ImGuiListClipper is reliant on the fact that rows are of equal height.
// See 'Demo->Tables->Vertical Scrolling' or 'Demo->Tables->Advanced' for a demo of using the clipper.
// - Note that auto-resizing columns don't play well with using the clipper.
@ -168,7 +169,7 @@ Index of this file:
// - Case C: column is hidden explicitly by the user (e.g. via the context menu, or _DefaultHide column flag, etc.).
//
// [A] [B] [C]
// TableNextColumn(): true false false -> [userland] when TableNextColumn() / TableSetColumnIndex() return false, user can skip submitting items but only if the column doesn't contribute to row height.
// TableNextColumn(): true false false -> [userland] when TableNextColumn() / TableSetColumnIndex() returns false, user can skip submitting items but only if the column doesn't contribute to row height.
// SkipItems: false false true -> [internal] when SkipItems is true, most widgets will early out if submitted, resulting is no layout output.
// ClipRect: normal zero-width zero-width -> [internal] when ClipRect is zero, ItemAdd() will return false and most widgets will early out mid-way.
// ImDrawList output: normal dummy dummy -> [internal] when using the dummy channel, ImDrawList submissions (if any) will be wasted (because cliprect is zero-width anyway).
@ -319,7 +320,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
if ( flags & ImGuiTableFlags_ScrollX )
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 rules may evolve.
// If an outer size is specified ahead we will be able to early out when not visible. Exact clipping criteria may evolve.
const bool use_child_window = ( flags & ( ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY ) ) ! = 0 ;
const ImVec2 avail_size = GetContentRegionAvail ( ) ;
ImVec2 actual_outer_size = CalcItemSize ( outer_size , ImMax ( avail_size . x , 1.0f ) , use_child_window ? ImMax ( avail_size . y , 1.0f ) : 0.0f ) ;
@ -366,7 +367,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
IM_ASSERT ( table - > ColumnsCount = = columns_count & & " BeginTable(): Cannot change columns count mid-frame while preserving same ID " ) ;
if ( table - > InstanceDataExtra . Size < instance_no )
table - > InstanceDataExtra . push_back ( ImGuiTableInstanceData ( ) ) ;
instance_id = GetIDWithSeed ( instance_no , GetIDWithSeed ( " ##Instances " , NULL , id ) ) ; // Push "##Instance" followed by (int)instance_no in ID stack.
instance_id = GetIDWithSeed ( instance_no , GetIDWithSeed ( " ##Instances " , NULL , id ) ) ; // Push "##Instances " followed by (int)instance_no in ID stack.
}
else
{
@ -477,7 +478,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
table - > IsUnfrozenRows = true ;
table - > DeclColumnsCount = 0 ;
// Using opaque colors facilitate overlapping e lement s of the grid
// Using opaque colors facilitate overlapping lin es of the grid, otherwise we'd need to improve TableDrawBorders()
table - > BorderColorStrong = GetColorU32 ( ImGuiCol_TableBorderStrong ) ;
table - > BorderColorLight = GetColorU32 ( ImGuiCol_TableBorderLight ) ;
@ -491,7 +492,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
if ( ( table_last_flags & ImGuiTableFlags_Reorderable ) & & ( flags & ImGuiTableFlags_Reorderable ) = = 0 )
table - > IsResetDisplayOrderRequest = true ;
// Mark as used
// Mark as used to avoid GC
if ( table_idx > = g . TablesLastTimeActive . Size )
g . TablesLastTimeActive . resize ( table_idx + 1 , - 1.0f ) ;
g . TablesLastTimeActive [ table_idx ] = ( float ) g . Time ;
@ -584,13 +585,13 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
}
// For reference, the average total _allocation count_ for a table is:
// + 0 (for ImGuiTable instance, we are pooling allocations in g.Tables)
// + 0 (for ImGuiTable instance, we are pooling allocations in g.Tables[] )
// + 1 (for table->RawData allocated below)
// + 1 (for table->ColumnsNames, if names are used)
// Shared allocations per number of nested tables
// Shared allocations for the maximum number of simultaneously nested tables (generally a very small number)
// + 1 (for table->Splitter._Channels)
// + 2 * active_channels_count (for ImDrawCmd and ImDrawIdx buffers inside channels)
// Where active_channels_count is variable but often == columns_count or columns_count + 1, see TableSetupDrawChannels() for details.
// Where active_channels_count is variable but often == columns_count or == columns_count + 1, see TableSetupDrawChannels() for details.
// Unused channels don't perform their +2 allocations.
void ImGui : : TableBeginInitMemory ( ImGuiTable * table , int columns_count )
{
@ -617,7 +618,7 @@ void ImGui::TableBeginInitMemory(ImGuiTable* table, int columns_count)
void ImGui : : TableBeginApplyRequests ( ImGuiTable * table )
{
// Handle resizing request
// (We process this at the first TableBegin of the fram e)
// (We process this in the TableBegin() of the first instance of each tabl e)
// FIXME-TABLE: Contains columns if our work area doesn't allow for scrolling?
if ( table - > InstanceCurrent = = 0 )
{
@ -662,8 +663,7 @@ void ImGui::TableBeginApplyRequests(ImGuiTable* table)
table - > Columns [ table - > DisplayOrderToIndex [ order_n ] ] . DisplayOrder - = ( ImGuiTableColumnIdx ) reorder_dir ;
IM_ASSERT ( dst_column - > DisplayOrder = = dst_order - reorder_dir ) ;
// Display order is stored in both columns->IndexDisplayOrder and table->DisplayOrder[],
// rebuild the later from the former.
// Display order is stored in both columns->IndexDisplayOrder and table->DisplayOrder[]. Rebuild later from the former.
for ( int column_n = 0 ; column_n < table - > ColumnsCount ; column_n + + )
table - > DisplayOrderToIndex [ table - > Columns [ column_n ] . DisplayOrder ] = ( ImGuiTableColumnIdx ) column_n ;
table - > ReorderColumnDir = 0 ;
@ -737,8 +737,8 @@ static void TableSetupColumnFlags(ImGuiTable* table, ImGuiTableColumn* column, I
}
}
// Layout columns for the frame. This is in essence the followup to BeginTable().
// Runs on the first call to TableNextRow(), to give a chance for TableSetupColumn() to be called first.
// Layout columns for the frame. This is in essence the followup to BeginTable() and this is our largest function .
// Runs on the first call to TableNextRow(), to give a chance for TableSetupColumn() and other TableSetupXXXXX() functions to be called first.
// FIXME-TABLE: Our width (and therefore our WorkRect) will be minimal in the first frame for _WidthAuto columns.
// Increase feedback side-effect with widgets relying on WorkRect.Max.x... Maybe provide a default distribution for _WidthAuto columns?
void ImGui : : TableUpdateLayout ( ImGuiTable * table )
@ -859,8 +859,8 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
table - > IsSettingsDirty = true ;
// [Part 3] Fix column flags and record a few extra information.
float sum_width_requests = 0.0f ; // Sum of all width for fixed and auto-resize columns, excluding width contributed by Stretch columns but including spacing/padding.
float stretch_sum_weights = 0.0f ; // Sum of all weights for stretch columns.
float sum_width_requests = 0.0f ; // Sum of all width for fixed and auto-resize columns, excluding width contributed by Stretch columns but including spacing/padding.
float stretch_sum_weights = 0.0f ; // Sum of all weights for stretch columns.
table - > LeftMostStretchedColumn = table - > RightMostStretchedColumn = - 1 ;
for ( int column_n = 0 ; column_n < table - > ColumnsCount ; column_n + + )
{
@ -1145,7 +1145,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
EndPopup ( ) ;
}
// [Part 12] Sanitize and build sort specs before we have a chang e to use them for display.
// [Part 12] Sanitize and build sort specs before we have a chanc e to use them for display.
// This path will only be exercised when sort specs are modified before header rows (e.g. init or visibility change)
if ( table - > IsSortSpecsDirty & & ( table - > Flags & ImGuiTableFlags_Sortable ) )
TableSortSpecsBuild ( table ) ;
@ -1166,9 +1166,9 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
}
// Process hit-testing on resizing borders. Actual size change will be applied in EndTable()
// - Set table->HoveredColumnBorder with a short delay/timer to reduce feedback noise
// - Submit ahead of table contents and header, use ImGuiButtonFlags_AllowItemOverlap to prioritize widgets
// overlapping the same area.
// - Set table->HoveredColumnBorder with a short delay/timer to reduce visual feedback noise.
// - Submit ahead of table contents and header, use ImGuiButtonFlags_AllowItemOverlap to prioritize
// widgets overlapping the same area.
void ImGui : : TableUpdateBorders ( ImGuiTable * table )
{
ImGuiContext & g = * GImGui ;
@ -1643,7 +1643,7 @@ ImGuiID ImGui::TableGetColumnResizeID(ImGuiTable* table, int column_n, int insta
return instance_id + 1 + column_n ; // FIXME: #6140: still not ideal
}
// Return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered .
// Return -1 when table is not hovered. return columns_count if hovering the unused space at the right of the right-most visible column.
int ImGui : : TableGetHoveredColumn ( )
{
ImGuiContext & g = * GImGui ;
@ -1980,6 +1980,7 @@ bool ImGui::TableNextColumn()
// FIXME-TABLE FIXME-OPT: Could probably shortcut some things for non-active or clipped columns.
void ImGui : : TableBeginCell ( ImGuiTable * table , int column_n )
{
ImGuiContext & g = * GImGui ;
ImGuiTableColumn * column = & table - > Columns [ column_n ] ;
ImGuiWindow * window = table - > InnerWindow ;
table - > CurrentColumn = column_n ;
@ -2004,7 +2005,6 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_n)
window - > SkipItems = column - > IsSkipItems ;
if ( column - > IsSkipItems )
{
ImGuiContext & g = * GImGui ;
g . LastItemData . ID = 0 ;
g . LastItemData . StatusFlags = 0 ;
}
@ -2023,7 +2023,6 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_n)
}
// Logging
ImGuiContext & g = * GImGui ;
if ( g . LogEnabled & & ! column - > IsSkipItems )
{
LogRenderedText ( & window - > DC . CursorPos , " | " ) ;
@ -2143,7 +2142,7 @@ void ImGui::TableSetColumnWidth(int column_n, float width)
// - All stretch: easy.
// - One or more fixed + one stretch: easy.
// - One or more fixed + more than one stretch: tricky.
// Qt when manual resize is enabled only support a single _trailing_ stretch column.
// Qt when manual resize is enabled only supports a single _trailing_ stretch column, we support more cases here .
// When forwarding resize from Wn| to Fn+1| we need to be considerate of the _NoResize flag on Fn+1.
// FIXME-TABLE: Find a way to rewrite all of this so interactions feel more consistent for the user.
@ -2226,7 +2225,7 @@ void ImGui::TableUpdateColumnsWeightFromWidth(ImGuiTable* table)
{
IM_ASSERT ( table - > LeftMostStretchedColumn ! = - 1 & & table - > RightMostStretchedColumn ! = - 1 ) ;
// Measure existing quantity
// Measure existing quantities
float visible_weight = 0.0f ;
float visible_width = 0.0f ;
for ( int column_n = 0 ; column_n < table - > ColumnsCount ; column_n + + )
@ -2501,11 +2500,9 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table)
merge_clip_rect . Max . x = ImMax ( merge_clip_rect . Max . x , host_rect . Max . x ) ;
if ( ( merge_group_n & 2 ) ! = 0 & & ( table - > Flags & ImGuiTableFlags_NoHostExtendY ) = = 0 )
merge_clip_rect . Max . y = ImMax ( merge_clip_rect . Max . y , host_rect . Max . y ) ;
#if 0
GetOverlayDrawList ( ) - > AddRect ( merge_group - > ClipRect . Min , merge_group - > ClipRect . Max , IM_COL32 ( 255 , 0 , 0 , 200 ) , 0.0f , 0 , 1.0f ) ;
GetOverlayDrawList ( ) - > AddLine ( merge_group - > ClipRect . Min , merge_clip_rect . Min , IM_COL32 ( 255 , 100 , 0 , 200 ) ) ;
GetOverlayDrawList ( ) - > AddLine ( merge_group - > ClipRect . Max , merge_clip_rect . Max , IM_COL32 ( 255 , 100 , 0 , 200 ) ) ;
# endif
//GetForegroundDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 0, 0, 200), 0.0f, 0, 1.0f); // [DEBUG]
//GetForegroundDrawList()->AddLine(merge_group->ClipRect.Min, merge_clip_rect.Min, IM_COL32(255, 100, 0, 200));
//GetForegroundDrawList()->AddLine(merge_group->ClipRect.Max, merge_clip_rect.Max, IM_COL32(255, 100, 0, 200));
remaining_count - = merge_group - > ChannelsCount ;
for ( int n = 0 ; n < ( size_for_masks_bitarrays_one > > 2 ) ; n + + )
remaining_mask [ n ] & = ~ merge_group - > ChannelsMask [ n ] ;
@ -2669,7 +2666,6 @@ ImGuiTableSortSpecs* ImGui::TableGetSortSpecs()
TableUpdateLayout ( table ) ;
TableSortSpecsBuild ( table ) ;
return & table - > SortSpecs ;
}
@ -2788,7 +2784,7 @@ void ImGui::TableSortSpecsSanitize(ImGuiTable* table)
}
}
// Fallback default sort order (if no column had the ImGuiTableColumnFlags_DefaultSort flag)
// Fallback default sort order (if no column wit h the ImGuiTableColumnFlags_DefaultSort flag)
if ( sort_order_count = = 0 & & ! ( table - > Flags & ImGuiTableFlags_SortTristate ) )
for ( int column_n = 0 ; column_n < table - > ColumnsCount ; column_n + + )
{
@ -3479,12 +3475,12 @@ static void TableSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandle
if ( ! save_column )
continue ;
buf - > appendf ( " Column %-2d " , column_n ) ;
if ( column - > UserID ! = 0 ) buf - > appendf ( " UserID=%08X " , column - > UserID ) ;
if ( save_size & & column - > IsStretch ) buf - > appendf ( " Weight=%.4f " , column - > WidthOrWeight ) ;
if ( save_size & & ! column - > IsStretch ) buf - > appendf ( " Width=%d " , ( int ) column - > WidthOrWeight ) ;
if ( save_visible ) buf - > appendf ( " Visible=%d " , column - > IsEnabled ) ;
if ( save_order ) buf - > appendf ( " Order=%d " , column - > DisplayOrder ) ;
if ( save_sort & & column - > SortOrder ! = - 1 ) buf - > appendf ( " Sort=%d%c " , column - > SortOrder , ( column - > SortDirection = = ImGuiSortDirection_Ascending ) ? ' v ' : ' ^ ' ) ;
if ( column - > UserID ! = 0 ) { buf - > appendf ( " UserID=%08X " , column - > UserID ) ; }
if ( save_size & & column - > IsStretch ) { buf - > appendf ( " Weight=%.4f " , column - > WidthOrWeight ) ; }
if ( save_size & & ! column - > IsStretch ) { buf - > appendf ( " Width=%d " , ( int ) column - > WidthOrWeight ) ; }
if ( save_visible ) { buf - > appendf ( " Visible=%d " , column - > IsEnabled ) ; }
if ( save_order ) { buf - > appendf ( " Order=%d " , column - > DisplayOrder ) ; }
if ( save_sort & & column - > SortOrder ! = - 1 ) { buf - > appendf ( " Sort=%d%c " , column - > SortOrder , ( column - > SortDirection = = ImGuiSortDirection_Ascending ) ? ' v ' : ' ^ ' ) ; }
buf - > append ( " \n " ) ;
}
buf - > append ( " \n " ) ;
@ -3532,7 +3528,7 @@ void ImGui::TableGcCompactTransientBuffers(ImGuiTable* table)
IM_ASSERT ( table - > MemoryCompacted = = false ) ;
table - > SortSpecs . Specs = NULL ;
table - > SortSpecsMulti . clear ( ) ;
table - > IsSortSpecsDirty = true ; // FIXME: shouldn't have to leak into user performing a sort
table - > IsSortSpecsDirty = true ; // FIXME: In theory shouldn't have to leak into user performing a sort on resume.
table - > ColumnsNames . clear ( ) ;
table - > MemoryCompacted = true ;
for ( int n = 0 ; n < table - > ColumnsCount ; n + + )