@ -3341,8 +3341,8 @@ const ImGuiTableSortSpecs* MyItem::s_current_sort_specs = NULL;
static void PushStyleCompact ( )
{
ImGuiStyle & style = ImGui : : GetStyle ( ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_FramePadding , ImVec2 ( style . FramePadding . x , ( float ) ( int ) ( style . FramePadding . y * 0. 7 0f) ) ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_ItemSpacing , ImVec2 ( style . ItemSpacing . x , ( float ) ( int ) ( style . ItemSpacing . y * 0. 7 0f) ) ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_FramePadding , ImVec2 ( style . FramePadding . x , ( float ) ( int ) ( style . FramePadding . y * 0. 6 0f) ) ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_ItemSpacing , ImVec2 ( style . ItemSpacing . x , ( float ) ( int ) ( style . ItemSpacing . y * 0. 6 0f) ) ) ;
}
static void PopStyleCompact ( )
@ -3559,11 +3559,11 @@ static void ShowDemoWindowTables()
{
// By default, if we don't enable ScrollX the sizing policy for each columns is "Stretch"
// Each columns maintain a sizing weight, and they will occupy all available width.
static ImGuiTableFlags flags = ImGuiTableFlags_ Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody ;
static ImGuiTableFlags flags = ImGuiTableFlags_ SizingPolicyStretch | ImGuiTableFlags_ Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody ;
PushStyleCompact ( ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_Resizable " , & flags , ImGuiTableFlags_Resizable ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersV " , & flags , ImGuiTableFlags_BordersV ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Using the _Resizable flag automatically enables the _Borders V flag as well." ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Using the _Resizable flag automatically enables the _Borders Inner V flag as well." ) ;
PopStyleCompact ( ) ;
if ( ImGui : : BeginTable ( " ##table1 " , 3 , flags ) )
@ -3594,13 +3594,14 @@ static void ShowDemoWindowTables()
" Using _Resizable + _SizingPolicyFixed flags. \n "
" Fixed-width columns generally makes more sense if you want to use horizontal scrolling. \n \n "
" Double-click a column border to auto-fit the column to its contents. " ) ;
static ImGuiTableFlags flags = ImGuiTableFlags_ Resizable | ImGuiTableFlags_SizingPolicyFixed | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody ;
static bool use_all_width = true ;
if ( ImGui : : RadioButton ( " fit " , use_all_width = = false ) ) { use_all_width = false ; }
ImGui : : SameLine( ) ;
if ( ImGui : : RadioButton ( " right-most edge " , use_all_width = = true ) ) { use_all_width = true ; }
static ImGuiTableFlags flags = ImGuiTableFlags_ SizingPolicyFixed | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody ;
PushStyleCompact ( ) ;
static bool fixed_fill = false ;
ImGui : : Checkbox( " fill " , & fixed_fill ) ;
PopStyleCompact ( ) ;
if ( ImGui : : BeginTable ( " ##table1 " , 3 , flags , ImVec2 ( use_all_width ? - FLT_MIN : 0.0f , 0.0f ) ) )
ImVec2 outer_size ( fixed_fill ? - FLT_MIN : 0.0f , 0.0f ) ;
if ( ImGui : : BeginTable ( " ##table1 " , 3 , flags , outer_size ) )
{
for ( int row = 0 ; row < 5 ; row + + )
{
@ -3827,32 +3828,64 @@ static void ShowDemoWindowTables()
if ( open_action ! = - 1 )
ImGui : : SetNextItemOpen ( open_action ! = 0 ) ;
if ( ImGui : : TreeNode ( " Explicit width s" ) )
if ( ImGui : : TreeNode ( " Sizing policie s" ) )
{
static ImGuiTableFlags flags = ImGuiTableFlags_None ;
HelpMarker ( " This section allows you to interact and see the effect of various sizing policies depending on whether Scroll is enabled and the contents of your columns. " ) ;
enum ContentsType { CT_ShortText , CT_LongText , CT_Button , CT_FillButton , CT_InputText } ;
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg ;
static int contents_type = CT_LongText ;
static int column_count = 3 ;
PushStyleCompact ( ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_NoKeepColumnsVisible " , & flags , ImGuiTableFlags_NoKeepColumnsVisible ) ;
ImGui : : PushItemWidth ( TEXT_BASE_WIDTH * 30 ) ;
ImGui : : Combo ( " Contents " , & contents_type , " Short Text \0 Long Text \0 Button \0 Fill Button \0 InputText \0 " ) ;
if ( contents_type = = CT_FillButton )
{
ImGui : : SameLine ( ) ;
HelpMarker ( " Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop where contents width can feed into auto-column width can feed into contents width. " ) ;
}
ImGui : : DragInt ( " Columns " , & column_count , 0.1f , 1 , 64 , " %d " , ImGuiSliderFlags_AlwaysClamp ) ;
ImGui : : PopItemWidth ( ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersInnerH " , & flags , ImGuiTableFlags_BordersInnerH ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersOuterH " , & flags , ImGuiTableFlags_BordersOuterH ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersInnerV " , & flags , ImGuiTableFlags_BordersInnerV ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersOuterV " , & flags , ImGuiTableFlags_BordersOuterV ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_ScrollX " , & flags , ImGuiTableFlags_ScrollX ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_ScrollY " , & flags , ImGuiTableFlags_ScrollY ) ;
if ( ImGui : : CheckboxFlags ( " ImGuiTableFlags_SizingPolicyStretch " , & flags , ImGuiTableFlags_SizingPolicyStretch ) )
flags & = ~ ImGuiTableFlags_SizingPolicyFixed ; // Can't specify both sizing polices so we clear the other
ImGui : : SameLine ( ) ; HelpMarker ( " Default if _ScrollX if disabled. Makes columns use _WidthStretch policy by default. " ) ;
if ( ImGui : : CheckboxFlags ( " ImGuiTableFlags_SizingPolicyFixed " , & flags , ImGuiTableFlags_SizingPolicyFixed ) )
flags & = ~ ImGuiTableFlags_SizingPolicyStretch ; // Can't specify both sizing polices so we clear the other
ImGui : : SameLine ( ) ; HelpMarker ( " Default if _ScrollX if enabled. Makes columns use _WidthFixed by default, or _WidthFixedResize if _Resizable is not set. " ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_PreciseWidths " , & flags , ImGuiTableFlags_PreciseWidths ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. " ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_Resizable " , & flags , ImGuiTableFlags_Resizable ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_NoClip " , & flags , ImGuiTableFlags_NoClip ) ;
PopStyleCompact ( ) ;
if ( ImGui : : BeginTable ( " ##table1 " , 4 , flags ) )
ImVec2 outer_size ( - FLT_MIN , TEXT_BASE_HEIGHT * 7 ) ;
if ( ImGui : : BeginTable ( " ##table1 " , column_count , flags , outer_size ) )
{
// We could also set ImGuiTableFlags_SizingPolicyFixed on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed.
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , 100.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 15.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 30.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 15.0f ) ;
for ( int row = 0 ; row < 5 ; row + + )
for ( int cell = 0 ; cell < 10 * column_count ; cell + + )
{
ImGui : : TableNextRow ( ) ;
for ( int column = 0 ; column < 4 ; column + + )
ImGui : : TableNextColumn ( ) ;
int column = ImGui : : TableGetColumnIndex ( ) ;
int row = ImGui : : TableGetRowIndex ( ) ;
ImGui : : PushID ( cell ) ;
char label [ 32 ] ;
static char text_buf [ 32 ] = " " ;
sprintf ( label , " Hello %d,%d " , column , row ) ;
switch ( contents_type )
{
ImGui : : TableSetColumnIndex ( column ) ;
if ( row = = 0 )
ImGui : : Text ( " (%.2f) " , ImGui : : GetContentRegionAvail ( ) . x ) ;
ImGui : : Text ( " Hello %d,%d " , column , row ) ;
case CT_ShortText : ImGui : : TextUnformatted ( label ) ; break ;
case CT_LongText : ImGui : : Text ( " Some longer text %d,%d \n Over two lines.. " , column , row ) ; break ;
case CT_Button : ImGui : : Button ( label ) ; break ;
case CT_FillButton : ImGui : : Button ( label , ImVec2 ( - FLT_MIN , 0.0f ) ) ; break ;
case CT_InputText : ImGui : : SetNextItemWidth ( - FLT_MIN ) ; ImGui : : InputText ( " ## " , text_buf , IM_ARRAYSIZE ( text_buf ) ) ; break ;
}
ImGui : : PopID ( ) ;
}
ImGui : : EndTable ( ) ;
}
@ -3959,6 +3992,33 @@ static void ShowDemoWindowTables()
}
ImGui : : EndTable ( ) ;
}
ImGui : : Spacing ( ) ;
ImGui : : TextUnformatted ( " Stretch + ScrollX " ) ;
ImGui : : SameLine ( ) ;
HelpMarker (
" Showcase using Stretch columns + ScrollX together: "
" this is rather unusual and only makes sense when specifying an 'inner_width' for the table! \n "
" Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns + ScrollX together doesn't make sense. " ) ;
static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingPolicyStretch | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody ;
static float inner_width = 1000.0f ;
PushStyleCompact ( ) ;
ImGui : : PushID ( " flags3 " ) ;
ImGui : : PushItemWidth ( TEXT_BASE_WIDTH * 30 ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_ScrollX " , & flags2 , ImGuiTableFlags_ScrollX ) ;
ImGui : : DragFloat ( " inner_width " , & inner_width , 1.0f , 0.0f , FLT_MAX , " %.1f " ) ;
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
PopStyleCompact ( ) ;
if ( ImGui : : BeginTable ( " ##table2 " , 7 , flags2 , outer_size , inner_width ) )
{
for ( int cell = 0 ; cell < 20 * 7 ; cell + + )
{
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Hello world %d,%d " , ImGui : : TableGetColumnIndex ( ) , ImGui : : TableGetRowIndex ( ) ) ;
}
ImGui : : EndTable ( ) ;
}
ImGui : : TreePop ( ) ;
}
@ -4028,7 +4088,43 @@ static void ShowDemoWindowTables()
if ( open_action ! = - 1 )
ImGui : : SetNextItemOpen ( open_action ! = 0 ) ;
if ( ImGui : : TreeNode ( " Nested " ) )
if ( ImGui : : TreeNode ( " Columns widths " ) )
{
HelpMarker ( " Using TableSetupColumn() to setup explicit width. " ) ;
static ImGuiTableFlags flags = ImGuiTableFlags_None ;
PushStyleCompact ( ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_NoKeepColumnsVisible " , & flags , ImGuiTableFlags_NoKeepColumnsVisible ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersInnerV " , & flags , ImGuiTableFlags_BordersInnerV ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersOuterV " , & flags , ImGuiTableFlags_BordersOuterV ) ;
PopStyleCompact ( ) ;
if ( ImGui : : BeginTable ( " ##table1 " , 4 , flags ) )
{
// We could also set ImGuiTableFlags_SizingPolicyFixed on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed.
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , 100.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 15.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 30.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 15.0f ) ;
for ( int row = 0 ; row < 5 ; row + + )
{
ImGui : : TableNextRow ( ) ;
for ( int column = 0 ; column < 4 ; column + + )
{
ImGui : : TableSetColumnIndex ( column ) ;
if ( row = = 0 )
ImGui : : Text ( " (%.2f) " , ImGui : : GetContentRegionAvail ( ) . x ) ;
ImGui : : Text ( " Hello %d,%d " , column , row ) ;
}
}
ImGui : : EndTable ( ) ;
}
ImGui : : TreePop ( ) ;
}
if ( open_action ! = - 1 )
ImGui : : SetNextItemOpen ( open_action ! = 0 ) ;
if ( ImGui : : TreeNode ( " Nested tables " ) )
{
HelpMarker ( " This demonstrate embedding a table into another table cell. " ) ;
@ -4070,141 +4166,6 @@ static void ShowDemoWindowTables()
ImGui : : TreePop ( ) ;
}
if ( open_action ! = - 1 )
ImGui : : SetNextItemOpen ( open_action ! = 0 ) ;
if ( ImGui : : TreeNode ( " Sizing policies, cell contents " ) )
{
HelpMarker ( " This section allows you to interact and see the effect of StretchX vs FixedX sizing policies depending on whether Scroll is enabled and the contents of your columns. " ) ;
enum ContentsType { CT_ShortText , CT_LongText , CT_Button , CT_FillButton , CT_InputText } ;
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg ;
static int contents_type = CT_LongText ;
static int column_count = 3 ;
PushStyleCompact ( ) ;
ImGui : : PushItemWidth ( TEXT_BASE_WIDTH * 30 ) ;
ImGui : : Combo ( " Contents " , & contents_type , " Short Text \0 Long Text \0 Button \0 Fill Button \0 InputText \0 " ) ;
if ( contents_type = = CT_FillButton )
{
ImGui : : SameLine ( ) ;
HelpMarker ( " Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop where contents width can feed into auto-column width can feed into contents width. " ) ;
}
ImGui : : DragInt ( " Columns " , & column_count , 0.1f , 1 , 64 , " %d " , ImGuiSliderFlags_AlwaysClamp ) ;
ImGui : : PopItemWidth ( ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersInnerH " , & flags , ImGuiTableFlags_BordersInnerH ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersOuterH " , & flags , ImGuiTableFlags_BordersOuterH ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersInnerV " , & flags , ImGuiTableFlags_BordersInnerV ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersOuterV " , & flags , ImGuiTableFlags_BordersOuterV ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_ScrollX " , & flags , ImGuiTableFlags_ScrollX ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_ScrollY " , & flags , ImGuiTableFlags_ScrollY ) ;
if ( ImGui : : CheckboxFlags ( " ImGuiTableFlags_SizingPolicyStretch " , & flags , ImGuiTableFlags_SizingPolicyStretch ) )
flags & = ~ ImGuiTableFlags_SizingPolicyFixed ; // Can't specify both sizing polices so we clear the other
ImGui : : SameLine ( ) ; HelpMarker ( " Default if _ScrollX if disabled. Makes columns use _WidthStretch policy by default. " ) ;
if ( ImGui : : CheckboxFlags ( " ImGuiTableFlags_SizingPolicyFixed " , & flags , ImGuiTableFlags_SizingPolicyFixed ) )
flags & = ~ ImGuiTableFlags_SizingPolicyStretch ; // Can't specify both sizing polices so we clear the other
ImGui : : SameLine ( ) ; HelpMarker ( " Default if _ScrollX if enabled. Makes columns use _WidthFixed by default, or _WidthFixedResize if _Resizable is not set. " ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_PreciseWidths " , & flags , ImGuiTableFlags_PreciseWidths ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. " ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_Resizable " , & flags , ImGuiTableFlags_Resizable ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_NoClip " , & flags , ImGuiTableFlags_NoClip ) ;
PopStyleCompact ( ) ;
ImVec2 outer_size ( - FLT_MIN , TEXT_BASE_HEIGHT * 7 ) ;
if ( ImGui : : BeginTable ( " ##nways " , column_count , flags , outer_size ) )
{
for ( int cell = 0 ; cell < 10 * column_count ; cell + + )
{
ImGui : : TableNextColumn ( ) ;
int column = ImGui : : TableGetColumnIndex ( ) ;
int row = ImGui : : TableGetRowIndex ( ) ;
ImGui : : PushID ( cell ) ;
char label [ 32 ] ;
static char text_buf [ 32 ] = " " ;
sprintf ( label , " Hello %d,%d " , column , row ) ;
switch ( contents_type )
{
case CT_ShortText : ImGui : : TextUnformatted ( label ) ; break ;
case CT_LongText : ImGui : : Text ( " Some longer text %d,%d \n Over two lines.. " , column , row ) ; break ;
case CT_Button : ImGui : : Button ( label ) ; break ;
case CT_FillButton : ImGui : : Button ( label , ImVec2 ( - FLT_MIN , 0.0f ) ) ; break ;
case CT_InputText : ImGui : : SetNextItemWidth ( - FLT_MIN ) ; ImGui : : InputText ( " ## " , text_buf , IM_ARRAYSIZE ( text_buf ) ) ; break ;
}
ImGui : : PopID ( ) ;
}
ImGui : : EndTable ( ) ;
}
ImGui : : TextUnformatted ( " Item Widths " ) ;
ImGui : : SameLine ( ) ;
HelpMarker ( " Showcase using PushItemWidth() and how it is preserved on a per-column basis " ) ;
if ( ImGui : : BeginTable ( " ##table2 " , 3 , ImGuiTableFlags_Borders ) )
{
ImGui : : TableSetupColumn ( " small " ) ;
ImGui : : TableSetupColumn ( " half " ) ;
ImGui : : TableSetupColumn ( " right-align " ) ;
ImGui : : TableHeadersRow ( ) ;
for ( int row = 0 ; row < 3 ; row + + )
{
ImGui : : TableNextRow ( ) ;
if ( row = = 0 )
{
// Setup ItemWidth once (instead of setting up every time, which is also possible but less efficient)
ImGui : : TableSetColumnIndex ( 0 ) ;
ImGui : : PushItemWidth ( TEXT_BASE_WIDTH * 3.0f ) ; // Small
ImGui : : TableSetColumnIndex ( 1 ) ;
ImGui : : PushItemWidth ( - ImGui : : GetContentRegionAvail ( ) . x * 0.5f ) ;
ImGui : : TableSetColumnIndex ( 2 ) ;
ImGui : : PushItemWidth ( - FLT_MIN ) ; // Right-aligned
}
// Draw our contents
static float dummy_f = 0.0f ;
ImGui : : PushID ( row ) ;
ImGui : : TableSetColumnIndex ( 0 ) ;
ImGui : : SliderFloat ( " float0 " , & dummy_f , 0.0f , 1.0f ) ;
ImGui : : TableSetColumnIndex ( 1 ) ;
ImGui : : SliderFloat ( " float1 " , & dummy_f , 0.0f , 1.0f ) ;
ImGui : : TableSetColumnIndex ( 2 ) ;
ImGui : : SliderFloat ( " float2 " , & dummy_f , 0.0f , 1.0f ) ;
ImGui : : PopID ( ) ;
}
ImGui : : EndTable ( ) ;
}
ImGui : : TextUnformatted ( " Stretch + ScrollX " ) ;
ImGui : : SameLine ( ) ;
HelpMarker (
" Showcase using Stretch columns + ScrollX together: "
" this is rather unusual and only makes sense when specifying an 'inner_width' for the table! \n "
" Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns + ScrollX together doesn't make sense. " ) ;
static ImGuiTableFlags flags3 = ImGuiTableFlags_SizingPolicyStretch | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg ;
static float inner_width = 1000.0f ;
PushStyleCompact ( ) ;
ImGui : : PushID ( " flags3 " ) ;
ImGui : : PushItemWidth ( TEXT_BASE_WIDTH * 30 ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_ScrollX " , & flags3 , ImGuiTableFlags_ScrollX ) ;
if ( ImGui : : CheckboxFlags ( " ImGuiTableFlags_SizingPolicyStretch " , & flags3 , ImGuiTableFlags_SizingPolicyStretch ) )
flags3 & = ~ ImGuiTableFlags_SizingPolicyFixed ; // Can't specify both sizing polices so we clear the other
if ( ImGui : : CheckboxFlags ( " ImGuiTableFlags_SizingPolicyFixed " , & flags3 , ImGuiTableFlags_SizingPolicyFixed ) )
flags3 & = ~ ImGuiTableFlags_SizingPolicyStretch ; // Can't specify both sizing polices so we clear the other
ImGui : : DragFloat ( " inner_width " , & inner_width , 1.0f , 0.0f , FLT_MAX , " %.1f " ) ;
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
PopStyleCompact ( ) ;
if ( ImGui : : BeginTable ( " ##table3 " , 7 , flags3 | ImGuiTableFlags_SizingPolicyStretch | ImGuiTableFlags_ContextMenuInBody , outer_size , inner_width ) )
{
for ( int cell = 0 ; cell < 20 * 7 ; cell + + )
{
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Hello world %d,%d " , ImGui : : TableGetColumnIndex ( ) , ImGui : : TableGetRowIndex ( ) ) ;
}
ImGui : : EndTable ( ) ;
}
ImGui : : TreePop ( ) ;
}
if ( open_action ! = - 1 )
ImGui : : SetNextItemOpen ( open_action ! = 0 ) ;
if ( ImGui : : TreeNode ( " Row height " ) )
@ -4232,11 +4193,15 @@ static void ShowDemoWindowTables()
// The default value of outer_size.x is -FLT_MIN which right-align tables.
// Using outer_size.x == 0.0f on a table with no scrolling and no stretch column we can make them tighter.
ImGui : : Text ( " Using auto/all width, using NoHostExtendY: " ) ;
PushStyleCompact ( ) ;
static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_ContextMenuInBody | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingPolicyFixed ;
static bool use_all_width = false ;
ImGui : : Checkbox ( " Use all width" , & use_all_width ) ;
static bool fixed_fill = false ;
ImGui : : Checkbox ( " fill" , & fixed_fill ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_NoHostExtendY " , & flags , ImGuiTableFlags_NoHostExtendY ) ;
if ( ImGui : : BeginTable ( " ##table3 " , 3 , flags , ImVec2 ( use_all_width ? - FLT_MIN : 0.0f , TEXT_BASE_HEIGHT * 5.5f ) ) )
PopStyleCompact ( ) ;
ImVec2 outer_size = ImVec2 ( fixed_fill ? - FLT_MIN : 0.0f , TEXT_BASE_HEIGHT * 5.5f ) ;
if ( ImGui : : BeginTable ( " ##table3 " , 3 , flags , outer_size ) )
{
for ( int row = 0 ; row < 10 ; row + + )
{
@ -4414,6 +4379,50 @@ static void ShowDemoWindowTables()
ImGui : : TreePop ( ) ;
}
if ( open_action ! = - 1 )
ImGui : : SetNextItemOpen ( open_action ! = 0 ) ;
if ( ImGui : : TreeNode ( " Item width " ) )
{
HelpMarker (
" Showcase using PushItemWidth() and how it is preserved on a per-column basis. \n \n "
" Note that on auto-resizing non-resizable fixed columns, querying the content width for e.g. right-alignment doesn't make sense. " ) ;
if ( ImGui : : BeginTable ( " ##table2 " , 3 , ImGuiTableFlags_Borders ) )
{
ImGui : : TableSetupColumn ( " small " ) ;
ImGui : : TableSetupColumn ( " half " ) ;
ImGui : : TableSetupColumn ( " right-align " ) ;
ImGui : : TableHeadersRow ( ) ;
for ( int row = 0 ; row < 3 ; row + + )
{
ImGui : : TableNextRow ( ) ;
if ( row = = 0 )
{
// Setup ItemWidth once (instead of setting up every time, which is also possible but less efficient)
ImGui : : TableSetColumnIndex ( 0 ) ;
ImGui : : PushItemWidth ( TEXT_BASE_WIDTH * 3.0f ) ; // Small
ImGui : : TableSetColumnIndex ( 1 ) ;
ImGui : : PushItemWidth ( - ImGui : : GetContentRegionAvail ( ) . x * 0.5f ) ;
ImGui : : TableSetColumnIndex ( 2 ) ;
ImGui : : PushItemWidth ( - FLT_MIN ) ; // Right-aligned
}
// Draw our contents
static float dummy_f = 0.0f ;
ImGui : : PushID ( row ) ;
ImGui : : TableSetColumnIndex ( 0 ) ;
ImGui : : SliderFloat ( " float0 " , & dummy_f , 0.0f , 1.0f ) ;
ImGui : : TableSetColumnIndex ( 1 ) ;
ImGui : : SliderFloat ( " float1 " , & dummy_f , 0.0f , 1.0f ) ;
ImGui : : TableSetColumnIndex ( 2 ) ;
ImGui : : SliderFloat ( " float2 " , & dummy_f , 0.0f , 1.0f ) ;
ImGui : : PopID ( ) ;
}
ImGui : : EndTable ( ) ;
}
ImGui : : TreePop ( ) ;
}
// Demonstrate using TableHeader() calls instead of TableHeadersRow()
if ( open_action ! = - 1 )
ImGui : : SetNextItemOpen ( open_action ! = 0 ) ;
@ -4627,10 +4636,12 @@ static void ShowDemoWindowTables()
ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti
| ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_NoBordersInBody
| ImGuiTableFlags_ScrollY ;
PushStyleCompact ( ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_SortMulti " , & flags , ImGuiTableFlags_SortMulti ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1). " ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_SortTristate " , & flags , ImGuiTableFlags_SortTristate ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0). " ) ;
PopStyleCompact ( ) ;
if ( ImGui : : BeginTable ( " ##table " , 4 , flags , ImVec2 ( - FLT_MIN , TEXT_BASE_HEIGHT * 15 ) , 0.0f ) )
{
@ -4749,6 +4760,7 @@ static void ShowDemoWindowTables()
if ( ImGui : : CheckboxFlags ( " ImGuiTableFlags_SizingPolicyFixed " , & flags , ImGuiTableFlags_SizingPolicyFixed ) )
flags & = ~ ImGuiTableFlags_SizingPolicyStretch ; // Can't specify both sizing polices so we clear the other
ImGui : : SameLine ( ) ; HelpMarker ( " [Default if ScrollX is on] \n Enlarge as needed: enable scrollbar if ScrollX is enabled, otherwise extend parent window's contents rectangle. Only Fixed columns allowed. Stretched columns will calculate their width assuming no scrolling. " ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " In the Advanced demo we override the policy of each column so those table-wide settings have less effect that typical. " ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_NoHostExtendY " , & flags , ImGuiTableFlags_NoHostExtendY ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_NoKeepColumnsVisible " , & flags , ImGuiTableFlags_NoKeepColumnsVisible ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Only available if ScrollX is disabled. " ) ;