@ -2117,25 +2117,27 @@ void ImGui::TableHeader(const char* label)
// If we already got a row height, there's use that.
// If we already got a row height, there's use that.
ImRect cell_r = TableGetCellRect ( ) ;
ImRect cell_r = TableGetCellRect ( ) ;
cell_r . Min . x - = table - > CellSpacingX ; // FIXME-TABLE: TableGetCellRect() is misleading.
float label_height = ImMax ( label_size . y , table - > RowMinHeight - g . Style . CellPadding . y * 2.0f ) ;
float label_height = ImMax ( label_size . y , table - > RowMinHeight - g . Style . CellPadding . y * 2.0f ) ;
//GetForegroundDrawList()->AddRect(cell_r.Min, cell_r.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG]
//GetForegroundDrawList()->AddRect(cell_r.Min, cell_r.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG]
ImRect work_r = cell_r ;
work_r . Min . x = window - > DC . CursorPos . x ;
work_r . Max . y = work_r . Min . y + label_height ;
float ellipsis_max = work_r . Max . x ;
// Selectable
PushID ( label ) ;
// FIXME-TABLE: Fix when padding are disabled.
//window->DC.CursorPos.x = column->MinX + table->CellPadding.x;
// Keep header highlighted when context menu is open.
// Keep header highlighted when context menu is open.
// (FIXME-TABLE: however we cannot assume the ID of said popup if it has been created by the user...)
// (FIXME-TABLE: however we cannot assume the ID of said popup if it has been created by the user...)
const bool selected = ( table - > IsContextPopupOpen & & table - > ContextPopupColumn = = column_n & & table - > InstanceInteracted = = table - > InstanceCurrent ) ;
const bool selected = ( table - > IsContextPopupOpen & & table - > ContextPopupColumn = = column_n & & table - > InstanceInteracted = = table - > InstanceCurrent ) ;
const bool pressed = Selectable ( " " , selected , ImGuiSelectableFlags_DrawHoveredWhenHeld | ImGuiSelectableFlags_DontClosePopups , ImVec2 ( 0.0f , label_height ) ) ;
ImGuiID id = window - > GetID ( label ) ;
const bool held = IsItemActive ( ) ;
ImRect bb ( cell_r . Min . x , cell_r . Min . y , cell_r . Max . x , ImMax ( cell_r . Max . y , cell_r . Min . y + label_height + g . Style . CellPadding . y * 2.0f ) ) ;
if ( ! ItemAdd ( bb , id ) )
return ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held , ImGuiButtonFlags_None ) ;
if ( hovered | | selected )
{
const ImU32 col = GetColorU32 ( held ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header ) ;
RenderFrame ( bb . Min , bb . Max , col , false , 0.0f ) ;
RenderNavHighlight ( bb , id , ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding ) ;
}
if ( held )
if ( held )
table - > HeldHeaderColumn = ( ImS8 ) column_n ;
table - > HeldHeaderColumn = ( ImS8 ) column_n ;
window - > DC . CursorPos . y - = g . Style . ItemSpacing . y * 0.5f ;
window - > DC . CursorPos . y - = g . Style . ItemSpacing . y * 0.5f ;
@ -2164,6 +2166,7 @@ void ImGui::TableHeader(const char* label)
// Sort order arrow
// Sort order arrow
float w_arrow = 0.0f ;
float w_arrow = 0.0f ;
float w_sort_text = 0.0f ;
float w_sort_text = 0.0f ;
float ellipsis_max = cell_r . Max . x ;
if ( ( table - > Flags & ImGuiTableFlags_Sortable ) & & ! ( column - > Flags & ImGuiTableColumnFlags_NoSort ) )
if ( ( table - > Flags & ImGuiTableFlags_Sortable ) & & ! ( column - > Flags & ImGuiTableColumnFlags_NoSort ) )
{
{
const float ARROW_SCALE = 0.65f ;
const float ARROW_SCALE = 0.65f ;
@ -2179,7 +2182,7 @@ void ImGui::TableHeader(const char* label)
w_sort_text = g . Style . ItemInnerSpacing . x + CalcTextSize ( sort_order_suf ) . x ;
w_sort_text = g . Style . ItemInnerSpacing . x + CalcTextSize ( sort_order_suf ) . x ;
}
}
float x = ImMax ( cell_r . Min . x , work _r. Max . x - w_arrow - w_sort_text ) ;
float x = ImMax ( cell_r . Min . x , cell _r. Max . x - w_arrow - w_sort_text ) ;
ellipsis_max - = w_arrow + w_sort_text ;
ellipsis_max - = w_arrow + w_sort_text ;
float y = label_pos . y ;
float y = label_pos . y ;
@ -2208,11 +2211,9 @@ void ImGui::TableHeader(const char* label)
// for merging.
// for merging.
// FIXME-TABLE: Clarify policies of how label width and potential decorations (arrows) fit into auto-resize of the column
// FIXME-TABLE: Clarify policies of how label width and potential decorations (arrows) fit into auto-resize of the column
float max_pos_x = label_pos . x + label_size . x + w_sort_text + w_arrow ;
float max_pos_x = label_pos . x + label_size . x + w_sort_text + w_arrow ;
column - > ContentMaxPosHeadersUsed = ImMax ( column - > ContentMaxPosHeadersUsed , work_r. Max . x ) ; // ImMin(max_pos_x, work _r.Max.x));
column - > ContentMaxPosHeadersUsed = ImMax ( column - > ContentMaxPosHeadersUsed , cell_r. Max . x ) ; // ImMin(max_pos_x, cell _r.Max.x));
column - > ContentMaxPosHeadersIdeal = ImMax ( column - > ContentMaxPosHeadersIdeal , max_pos_x ) ;
column - > ContentMaxPosHeadersIdeal = ImMax ( column - > ContentMaxPosHeadersIdeal , max_pos_x ) ;
PopID ( ) ;
// We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden
// We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden
if ( IsMouseReleased ( 1 ) & & IsItemHovered ( ) )
if ( IsMouseReleased ( 1 ) & & IsItemHovered ( ) )
TableOpenContextMenu ( table , column_n ) ;
TableOpenContextMenu ( table , column_n ) ;