@ -1601,7 +1601,7 @@ void ImGui::TableEndRow(ImGuiTable* table)
// In theory we could call SetWindowClipRectBeforeSetChannel() but since we know TableEndRow() is
// always followed by a change of clipping rectangle we perform the smallest overwrite possible here.
if ( ( table - > Flags & ImGuiTableFlags_NoClip ) = = 0 )
window - > DrawList - > _CmdHeader . ClipRect = table - > Bg ClipRectForDrawCmd. ToVec4 ( ) ;
window - > DrawList - > _CmdHeader . ClipRect = table - > Bg 0 ClipRectForDrawCmd. ToVec4 ( ) ;
table - > DrawSplitter . SetCurrentChannel ( window - > DrawList , TABLE_DRAW_CHANNEL_BG0 ) ;
}
@ -1657,10 +1657,10 @@ void ImGui::TableEndRow(ImGuiTable* table)
// BgClipRect starts as table->InnerClipRect, reduce it now and make BgClipRectForDrawCmd == BgClipRect
float y0 = ImMax ( table - > RowPosY2 + 1 , window - > InnerClipRect . Min . y ) ;
table - > BgClipRect . Min . y = table - > Bg ClipRectForDrawCmd. Min . y = ImMin ( y0 , window - > InnerClipRect . Max . y ) ;
table - > BgClipRect . Max . y = table - > Bg ClipRectForDrawCmd. Max . y = window - > InnerClipRect . Max . y ;
table - > BgClipRect . Min . y = table - > Bg 2 ClipRectForDrawCmd. Min . y = ImMin ( y0 , window - > InnerClipRect . Max . y ) ;
table - > BgClipRect . Max . y = table - > Bg 2 ClipRectForDrawCmd. Max . y = window - > InnerClipRect . Max . y ;
table - > Bg2DrawChannelCurrent = table - > Bg2DrawChannelUnfrozen ;
IM_ASSERT ( table - > Bg ClipRectForDrawCmd. Min . y < = table - > Bg ClipRectForDrawCmd. Max . y ) ;
IM_ASSERT ( table - > Bg 2 ClipRectForDrawCmd. Min . y < = table - > Bg 2 ClipRectForDrawCmd. Max . y ) ;
float row_height = table - > RowPosY2 - table - > RowPosY1 ;
table - > RowPosY2 = window - > DC . CursorPos . y = table - > WorkRect . Min . y + table - > RowPosY2 - table - > OuterRect . Min . y ;
@ -1669,7 +1669,7 @@ void ImGui::TableEndRow(ImGuiTable* table)
{
ImGuiTableColumn * column = & table - > Columns [ column_n ] ;
column - > DrawChannelCurrent = column - > DrawChannelUnfrozen ;
column - > ClipRect . Min . y = table - > Bg ClipRectForDrawCmd. Min . y ;
column - > ClipRect . Min . y = table - > Bg 2 ClipRectForDrawCmd. Min . y ;
}
// Update cliprect ahead of TableBeginCell() so clipper can access to new ClipRect->Min.y
@ -2019,7 +2019,7 @@ void ImGui::TablePushBackgroundChannel()
// Optimization: avoid SetCurrentChannel() + PushClipRect()
table - > HostBackupInnerClipRect = window - > ClipRect ;
SetWindowClipRectBeforeSetChannel ( window , table - > Bg ClipRectForDrawCmd) ;
SetWindowClipRectBeforeSetChannel ( window , table - > Bg 2 ClipRectForDrawCmd) ;
table - > DrawSplitter . SetCurrentChannel ( window - > DrawList , table - > Bg2DrawChannelCurrent ) ;
}
@ -2046,7 +2046,7 @@ void ImGui::TablePopBackgroundChannel()
// - We allocate 1 or 2 background draw channels. This is because we know TablePushBackgroundChannel() is only used for
// horizontal spanning. If we allowed vertical spanning we'd need one background draw channel per merge group (1-4).
// Draw channel allocation (before merging):
// - NoClip --> 2+D+1 channels: bg0/1 + bg2 + foreground (same clip rect == 1 draw call) (FIXME-TABLE: could merge bg2 and foreground? )
// - NoClip --> 2+D+1 channels: bg0/1 + bg2 + foreground (same clip rect == always 1 draw call)
// - Clip --> 2+D+N channels
// - FreezeRows --> 2+D+N*2 (unless scrolling value is zero)
// - FreezeRows || FreezeColunns --> 3+D+N*2 (unless scrolling value is zero)
@ -2085,7 +2085,8 @@ void ImGui::TableSetupDrawChannels(ImGuiTable* table)
// All our cell highlight are manually clipped with BgClipRect. When unfreezing it will be made smaller to fit scrolling rect.
// (This technically isn't part of setting up draw channels, but is reasonably related to be done here)
table - > BgClipRect = table - > InnerClipRect ;
table - > BgClipRectForDrawCmd = table - > HostClipRect ;
table - > Bg0ClipRectForDrawCmd = table - > OuterWindow - > ClipRect ;
table - > Bg2ClipRectForDrawCmd = table - > HostClipRect ;
IM_ASSERT ( table - > BgClipRect . Min . y < = table - > BgClipRect . Max . y ) ;
}
@ -2288,19 +2289,17 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table)
void ImGui : : TableDrawBorders ( ImGuiTable * table )
{
ImGuiWindow * inner_window = table - > InnerWindow ;
ImGuiWindow * outer_window = table - > OuterWindow ;
table - > DrawSplitter . SetCurrentChannel ( inner_window - > DrawList , TABLE_DRAW_CHANNEL_BG0 ) ;
if ( inner_window - > Hidden | | ! table - > HostClipRect . Overlaps ( table - > InnerClipRect ) )
return ;
ImDrawList * inner_drawlist = inner_window - > DrawList ;
ImDrawList* outer_drawlist = outer_window - > DrawList ;
inner_drawlist- > PushClipRect ( table - > Bg0ClipRectForDrawCmd . Min , table - > Bg0ClipRectForDrawCmd . Max , false ) ;
// Draw inner border and resizing feedback
const float border_size = TABLE_BORDER_SIZE ;
const float draw_y1 = table - > InnerRect . Min . y ;
const float draw_y2_body = table - > InnerRect . Max . y ;
const float draw_y2_head = table - > IsUsingHeaders ? ( ( table - > FreezeRowsCount > = 1 ? table - > OuterRect . Min . y : table - > WorkRect . Min . y ) + table - > LastFirstRowHeight ) : draw_y1 ;
if ( table - > Flags & ImGuiTableFlags_BordersInnerV )
{
for ( int order_n = 0 ; order_n < table - > ColumnsCount ; order_n + + )
@ -2351,23 +2350,21 @@ void ImGui::TableDrawBorders(ImGuiTable* table)
// parent. In inner_window, it won't reach out over scrollbars. Another weird solution would be to display part
// of it in inner window, and the part that's over scrollbars in the outer window..)
// Either solution currently won't allow us to use a larger border size: the border would clipped.
ImRect outer_border = table - > OuterRect ;
const ImRect outer_border = table - > OuterRect ;
const ImU32 outer_col = table - > BorderColorStrong ;
if ( inner_window ! = outer_window ) // FIXME-TABLE
outer_border . Expand ( 1.0f ) ;
if ( ( table - > Flags & ImGuiTableFlags_BordersOuter ) = = ImGuiTableFlags_BordersOuter )
{
out er_drawlist- > AddRect ( outer_border . Min , outer_border . Max , outer_col , 0.0f , ~ 0 , border_size ) ;
inn er_drawlist- > AddRect ( outer_border . Min , outer_border . Max , outer_col , 0.0f , ~ 0 , border_size ) ;
}
else if ( table - > Flags & ImGuiTableFlags_BordersOuterV )
{
out er_drawlist- > AddLine ( outer_border . Min , ImVec2 ( outer_border . Min . x , outer_border . Max . y ) , outer_col , border_size ) ;
out er_drawlist- > AddLine ( ImVec2 ( outer_border . Max . x , outer_border . Min . y ) , outer_border . Max , outer_col , border_size ) ;
inn er_drawlist- > AddLine ( outer_border . Min , ImVec2 ( outer_border . Min . x , outer_border . Max . y ) , outer_col , border_size ) ;
inn er_drawlist- > AddLine ( ImVec2 ( outer_border . Max . x , outer_border . Min . y ) , outer_border . Max , outer_col , border_size ) ;
}
else if ( table - > Flags & ImGuiTableFlags_BordersOuterH )
{
out er_drawlist- > AddLine ( outer_border . Min , ImVec2 ( outer_border . Max . x , outer_border . Min . y ) , outer_col , border_size ) ;
out er_drawlist- > AddLine ( ImVec2 ( outer_border . Min . x , outer_border . Max . y ) , outer_border . Max , outer_col , border_size ) ;
inn er_drawlist- > AddLine ( outer_border . Min , ImVec2 ( outer_border . Max . x , outer_border . Min . y ) , outer_col , border_size ) ;
inn er_drawlist- > AddLine ( ImVec2 ( outer_border . Min . x , outer_border . Max . y ) , outer_border . Max , outer_col , border_size ) ;
}
}
if ( ( table - > Flags & ImGuiTableFlags_BordersInnerH ) & & table - > RowPosY2 < table - > OuterRect . Max . y )
@ -2377,6 +2374,8 @@ void ImGui::TableDrawBorders(ImGuiTable* table)
if ( border_y > = table - > BgClipRect . Min . y & & border_y < table - > BgClipRect . Max . y )
inner_drawlist - > AddLine ( ImVec2 ( table - > BorderX1 , border_y ) , ImVec2 ( table - > BorderX2 , border_y ) , table - > BorderColorLight , border_size ) ;
}
inner_drawlist - > PopClipRect ( ) ;
}
//-------------------------------------------------------------------------
@ -2638,7 +2637,6 @@ void ImGui::TableHeadersRow()
// Emit a column header (text + optional sort order)
// We cpu-clip text here so that all columns headers can be merged into a same draw call.
// Note that because of how we cpu-clip and display sorting indicators, you _cannot_ use SameLine() after a TableHeader()
// FIXME-TABLE: Style confusion between CellPadding.y and FramePadding.y
void ImGui : : TableHeader ( const char * label )
{
ImGuiContext & g = * GImGui ;
@ -2660,7 +2658,7 @@ void ImGui::TableHeader(const char* label)
ImVec2 label_pos = window - > DC . CursorPos ;
// If we already got a row height, there's use that.
// FIXME-TABLE -PADDING : Problem if the correct outer-padding CellBgRect strays off our ClipRect
// FIXME-TABLE : Padding p roblem if the correct outer-padding CellBgRect strays off our ClipRect?
ImRect cell_r = TableGetCellBgRect ( table , column_n ) ;
float label_height = ImMax ( label_size . y , table - > RowMinHeight - table - > CellPaddingY * 2.0f ) ;
@ -2671,7 +2669,7 @@ void ImGui::TableHeader(const char* label)
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);
w_arrow = ImFloor ( g . FontSize * ARROW_SCALE + g . Style . FramePadding . x ) ;
if ( column - > SortOrder > 0 )
{
ImFormatString ( sort_order_suf , IM_ARRAYSIZE ( sort_order_suf ) , " %d " , column - > SortOrder + 1 ) ;