@ -492,8 +492,7 @@ void ImGui::TableBeginApplyRequests(ImGuiTable* table)
{
// Handle resizing request
// (We process this at the first TableBegin of the frame)
// FIXME-TABLE: Preserve contents width _while resizing down_ until releasing.
// FIXME-TABLE: Contains columns if our work area doesn't allow for scrolling.
// FIXME-TABLE: Contains columns if our work area doesn't allow for scrolling?
if ( table - > InstanceCurrent = = 0 )
{
if ( table - > ResizedColumn ! = - 1 & & table - > ResizedColumnNextWidth ! = FLT_MAX )
@ -691,6 +690,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
if ( ( table - > Flags & ImGuiTableFlags_Sortable ) & & table - > SortSpecsCount = = 0 & & ! ( table - > Flags & ImGuiTableFlags_SortTristate ) )
table - > IsSortSpecsDirty = true ;
table - > RightMostEnabledColumn = ( ImGuiTableColumnIdx ) last_visible_column_idx ;
IM_ASSERT ( table - > RightMostEnabledColumn > = 0 ) ;
// [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible
// to avoid the column fitting to wait until the first visible frame of the child container (may or not be a good thing).
@ -1014,9 +1014,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// because of using _WidthAutoResize/_WidthStretch). This will hide the resizing option from the context menu.
if ( is_hovering_table & & table - > HoveredColumnBody = = - 1 )
{
float unused_x1 = table - > WorkRect . Min . x ;
if ( table - > RightMostEnabledColumn ! = - 1 )
unused_x1 = ImMax ( unused_x1 , table - > Columns [ table - > RightMostEnabledColumn ] . ClipRect . Max . x ) ;
float unused_x1 = ImMax ( table - > WorkRect . Min . x , table - > Columns [ table - > RightMostEnabledColumn ] . ClipRect . Max . x ) ;
if ( g . IO . MousePos . x > = unused_x1 )
table - > HoveredColumnBody = ( ImGuiTableColumnIdx ) table - > ColumnsCount ;
}
@ -1109,6 +1107,8 @@ void ImGui::TableUpdateBorders(ImGuiTable* table)
}
if ( held )
{
if ( table - > LastResizedColumn = = - 1 )
table - > ResizeLockMinContentsX2 = table - > RightMostEnabledColumn ! = - 1 ? table - > Columns [ table - > RightMostEnabledColumn ] . MaxX : - FLT_MAX ;
table - > ResizedColumn = ( ImGuiTableColumnIdx ) column_n ;
table - > InstanceInteracted = table - > InstanceCurrent ;
}
@ -1182,6 +1182,8 @@ void ImGui::EndTable()
float max_pos_x = backup_inner_max_pos_x ;
if ( table - > RightMostEnabledColumn ! = - 1 )
max_pos_x = ImMax ( max_pos_x , table - > Columns [ table - > RightMostEnabledColumn ] . MaxX ) ;
if ( table - > ResizedColumn ! = - 1 )
max_pos_x = ImMax ( max_pos_x , table - > ResizeLockMinContentsX2 ) ;
#if 0
// Strip out dummy channel draw calls
@ -1861,7 +1863,12 @@ void ImGui::TableSetColumnWidth(int column_n, float width)
ImGuiTableColumn * column_1 = ( column_0 - > NextEnabledColumn ! = - 1 ) ? & table - > Columns [ column_0 - > NextEnabledColumn ] : NULL ;
// In this surprisingly not simple because of how we support mixing Fixed and Stretch columns.
// In this surprisingly not simple because of how we support mixing Fixed and multiple Stretch columns.
// - All fixed: easy.
// - All stretch: easy.
// - One or more fixed + one stretch: easy.
// - One or more fixed + more than one stretch: A MESS
// 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.
// Scenarios:
@ -2638,6 +2645,26 @@ void ImGui::TableHeader(const char* label)
ImRect cell_r = TableGetCellBgRect ( table , column_n ) ;
float label_height = ImMax ( label_size . y , table - > RowMinHeight - table - > CellPaddingY * 2.0f ) ;
// Calculate ideal size for sort order arrow
float w_arrow = 0.0f ;
float w_sort_text = 0.0f ;
char sort_order_suf [ 4 ] = " " ;
const float ARROW_SCALE = 0.65f ;
if ( ( table - > Flags & ImGuiTableFlags_Sortable ) & & ! ( column - > Flags & ImGuiTableColumnFlags_NoSort ) )
{
w_arrow = ImFloor ( g . FontSize * ARROW_SCALE + g . Style . FramePadding . x ) ; // table->CellPadding.x);
if ( column - > SortOrder > 0 )
{
ImFormatString ( sort_order_suf , IM_ARRAYSIZE ( sort_order_suf ) , " %d " , column - > SortOrder + 1 ) ;
w_sort_text = g . Style . ItemInnerSpacing . x + CalcTextSize ( sort_order_suf ) . x ;
}
}
// We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considering for merging.
float max_pos_x = label_pos . x + label_size . x + w_sort_text + w_arrow ;
column - > ContentMaxXHeadersUsed = ImMax ( column - > ContentMaxXHeadersUsed , column - > WorkMaxX ) ;
column - > ContentMaxXHeadersIdeal = ImMax ( column - > ContentMaxXHeadersIdeal , max_pos_x ) ;
// Keep header highlighted when context menu is open.
const bool selected = ( table - > IsContextPopupOpen & & table - > ContextPopupColumn = = column_n & & table - > InstanceInteracted = = table - > InstanceCurrent ) ;
ImGuiID id = window - > GetID ( label ) ;
@ -2692,28 +2719,13 @@ void ImGui::TableHeader(const char* label)
}
// Sort order arrow
float w_arrow = 0.0f ;
float w_sort_text = 0.0f ;
float ellipsis_max = cell_r . Max . x ;
const float ellipsis_max = cell_r . Max . x - w_arrow - w_sort_text ;
if ( ( table - > Flags & ImGuiTableFlags_Sortable ) & & ! ( column - > Flags & ImGuiTableColumnFlags_NoSort ) )
{
const float ARROW_SCALE = 0.65f ;
w_arrow = ImFloor ( g . FontSize * ARROW_SCALE + g . Style . FramePadding . x ) ; // table->CellPadding.x);
if ( column - > SortOrder ! = - 1 )
{
char sort_order_suf [ 8 ] ;
w_sort_text = 0.0f ;
if ( column - > SortOrder > 0 )
{
ImFormatString ( sort_order_suf , IM_ARRAYSIZE ( sort_order_suf ) , " %d " , column - > SortOrder + 1 ) ;
w_sort_text = g . Style . ItemInnerSpacing . x + CalcTextSize ( sort_order_suf ) . x ;
}
float x = ImMax ( cell_r . Min . x , cell_r . Max . x - w_arrow - w_sort_text ) ;
ellipsis_max - = w_arrow + w_sort_text ;
float y = label_pos . y ;
ImU32 col = GetColorU32 ( ImGuiCol_Text ) ;
if ( column - > SortOrder > 0 )
{
PushStyleColor ( ImGuiCol_Text , GetColorU32 ( ImGuiCol_Text , 0.70f ) ) ;
@ -2721,7 +2733,7 @@ void ImGui::TableHeader(const char* label)
PopStyleColor ( ) ;
x + = w_sort_text ;
}
RenderArrow ( window - > DrawList , ImVec2 ( x , y ) , col , column - > SortDirection = = ImGuiSortDirection_Ascending ? ImGuiDir_Up : ImGuiDir_Down , ARROW_SCALE ) ;
RenderArrow ( window - > DrawList , ImVec2 ( x , y ) , GetColorU32( ImGuiCol_Text ) , column - > SortDirection = = ImGuiSortDirection_Ascending ? ImGuiDir_Up : ImGuiDir_Down , ARROW_SCALE ) ;
}
// Handle clicking on column header to adjust Sort Order
@ -2741,11 +2753,6 @@ void ImGui::TableHeader(const char* label)
if ( text_clipped & & hovered & & g . HoveredIdNotActiveTimer > g . TooltipSlowDelay )
SetTooltip ( " %.*s " , ( int ) ( label_end - label ) , label ) ;
// We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considering for merging.
float max_pos_x = label_pos . x + label_size . x + w_sort_text + w_arrow ;
column - > ContentMaxXHeadersUsed = ImMax ( column - > ContentMaxXHeadersUsed , column - > WorkMaxX ) ;
column - > ContentMaxXHeadersIdeal = ImMax ( column - > ContentMaxXHeadersIdeal , max_pos_x ) ;
// We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden
if ( IsMouseReleased ( 1 ) & & IsItemHovered ( ) )
TableOpenContextMenu ( column_n ) ;