Tables: Renamed internal fields: Active->Visible, Visible->VisibleUnclipped to be less misleading.

This commit is contained in:
omar 2020-05-14 17:57:25 +02:00 committed by ocornut
parent dff26191bd
commit 23c60b2814
3 changed files with 100 additions and 99 deletions

View File

@ -687,7 +687,7 @@ namespace ImGui
// - Use TableSetupColumn() to specify label, resizing policy, default width, id, various other flags etc. // - Use TableSetupColumn() to specify label, resizing policy, default width, id, various other flags etc.
// - The name passed to TableSetupColumn() is used by TableAutoHeaders() and by the context-menu // - The name passed to TableSetupColumn() is used by TableAutoHeaders() and by the context-menu
// - Use TableAutoHeaders() to submit the whole header row, otherwise you may treat the header row as a regular row, manually call TableHeader() and other widgets. // - Use TableAutoHeaders() to submit the whole header row, otherwise you may treat the header row as a regular row, manually call TableHeader() and other widgets.
// - Headers are required to perform some interactions: reordering, sorting, context menu // FIXME-TABLE: remove context from this list! // - Headers are required to perform some interactions: reordering, sorting, context menu (FIXME-TABLE: context menu should work without!)
IMGUI_API void TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = -1.0f, ImU32 user_id = 0); IMGUI_API void TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = -1.0f, ImU32 user_id = 0);
IMGUI_API void TableAutoHeaders(); // submit all headers cells based on data provided to TableSetupColumn() + submit context menu IMGUI_API void TableAutoHeaders(); // submit all headers cells based on data provided to TableSetupColumn() + submit context menu
IMGUI_API void TableHeader(const char* label); // submit one header cell manually. IMGUI_API void TableHeader(const char* label); // submit one header cell manually.

View File

@ -1888,7 +1888,7 @@ struct ImGuiTabBar
#define IMGUI_TABLE_MAX_DRAW_CHANNELS (2 + 64 * 2) // See TableUpdateDrawChannels() #define IMGUI_TABLE_MAX_DRAW_CHANNELS (2 + 64 * 2) // See TableUpdateDrawChannels()
// [Internal] sizeof() ~ 100 // [Internal] sizeof() ~ 100
// We use the terminology "Active" to refer to a column that is not Hidden by user or programmatically. We don't use the term "Visible" because it is ambiguous since an Active column can be non-visible because of scrolling. // We use the terminology "Visible" to refer to a column that is not Hidden by user or settings. However it may still be out of view and clipped (see IsClipped).
struct ImGuiTableColumn struct ImGuiTableColumn
{ {
ImRect ClipRect; // Clipping rectangle for the column ImRect ClipRect; // Clipping rectangle for the column
@ -1911,17 +1911,17 @@ struct ImGuiTableColumn
ImS16 ContentWidthHeadersUsed; // TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls ImS16 ContentWidthHeadersUsed; // TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls
ImS16 ContentWidthHeadersIdeal; ImS16 ContentWidthHeadersIdeal;
ImS16 NameOffset; // Offset into parent ColumnsNames[] ImS16 NameOffset; // Offset into parent ColumnsNames[]
bool IsActive; // Is the column not marked Hidden by the user (regardless of clipping). We're not calling this "Visible" here because visibility also depends on clipping. bool IsVisible; // Is the column not marked Hidden by the user? (could be clipped by scrolling, etc).
bool IsActiveNextFrame; bool IsVisibleNextFrame;
bool IsClipped; // Set when not overlapping the host window clipping rectangle. We don't use the opposite "!Visible" name because Clipped can be altered by events. bool IsClipped; // Set when not overlapping the host window clipping rectangle.
bool SkipItems; bool SkipItems;
ImS8 DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users) ImS8 DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users)
ImS8 IndexWithinActiveSet; // Index within active/visible set (<= IndexToDisplayOrder) ImS8 IndexWithinVisibleSet; // Index within visible set (<= IndexToDisplayOrder)
ImS8 DrawChannelCurrent; // Index within DrawSplitter.Channels[] ImS8 DrawChannelCurrent; // Index within DrawSplitter.Channels[]
ImS8 DrawChannelRowsBeforeFreeze; ImS8 DrawChannelRowsBeforeFreeze;
ImS8 DrawChannelRowsAfterFreeze; ImS8 DrawChannelRowsAfterFreeze;
ImS8 PrevActiveColumn; // Index of prev active column within Columns[], -1 if first active column ImS8 PrevVisibleColumn; // Index of prev visible column within Columns[], -1 if first visible column
ImS8 NextActiveColumn; // Index of next active column within Columns[], -1 if last active column ImS8 NextVisibleColumn; // Index of next visible column within Columns[], -1 if last visible column
ImS8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit ImS8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit
ImS8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem ImS8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem
ImS8 SortOrder; // -1: Not sorting on this column ImS8 SortOrder; // -1: Not sorting on this column
@ -1932,10 +1932,10 @@ struct ImGuiTableColumn
memset(this, 0, sizeof(*this)); memset(this, 0, sizeof(*this));
ResizeWeight = WidthRequested = WidthGiven = -1.0f; ResizeWeight = WidthRequested = WidthGiven = -1.0f;
NameOffset = -1; NameOffset = -1;
IsActive = IsActiveNextFrame = true; IsVisible = IsVisibleNextFrame = true;
DisplayOrder = IndexWithinActiveSet = -1; DisplayOrder = IndexWithinVisibleSet = -1;
DrawChannelCurrent = DrawChannelRowsBeforeFreeze = DrawChannelRowsAfterFreeze = -1; DrawChannelCurrent = DrawChannelRowsBeforeFreeze = DrawChannelRowsAfterFreeze = -1;
PrevActiveColumn = NextActiveColumn = -1; PrevVisibleColumn = NextVisibleColumn = -1;
AutoFitQueue = CannotSkipItemsQueue = (1 << 3) - 1; // Skip for three frames AutoFitQueue = CannotSkipItemsQueue = (1 << 3) - 1; // Skip for three frames
SortOrder = -1; SortOrder = -1;
SortDirection = ImGuiSortDirection_Ascending; SortDirection = ImGuiSortDirection_Ascending;
@ -1949,14 +1949,14 @@ struct ImGuiTable
ImVector<char> RawData; ImVector<char> RawData;
ImSpan<ImGuiTableColumn> Columns; // Point within RawData[] ImSpan<ImGuiTableColumn> Columns; // Point within RawData[]
ImSpan<ImS8> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1) ImSpan<ImS8> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1)
ImU64 ActiveMaskByIndex; // Column Index -> IsActive map (Active == not hidden by user/api) in a format adequate for iterating column without touching cold data ImU64 VisibleMaskByIndex; // Column Index -> IsVisible map (== not hidden by user/api) in a format adequate for iterating column without touching cold data
ImU64 ActiveMaskByDisplayOrder; // Column DisplayOrder -> IsActive map ImU64 VisibleMaskByDisplayOrder; // Column DisplayOrder -> IsVisible map
ImU64 VisibleMaskByIndex; // Visible (== Active and not Clipped) ImU64 VisibleUnclippedMaskByIndex;// Visible and not Clipped, aka "actually visible" "not hidden by some scrolling"
ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order) ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order)
int SettingsOffset; // Offset in g.SettingsTables int SettingsOffset; // Offset in g.SettingsTables
int LastFrameActive; int LastFrameActive;
int ColumnsCount; // Number of columns declared in BeginTable() int ColumnsCount; // Number of columns declared in BeginTable()
int ColumnsActiveCount; // Number of non-hidden columns (<= ColumnsCount) int ColumnsVisibleCount; // Number of non-hidden columns (<= ColumnsCount)
int CurrentColumn; int CurrentColumn;
int CurrentRow; int CurrentRow;
ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple table with same ID look are multiple tables, they are just synched. ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple table with same ID look are multiple tables, they are just synched.
@ -2007,7 +2007,7 @@ struct ImGuiTable
ImS8 HeldHeaderColumn; // Index of column header being held. ImS8 HeldHeaderColumn; // Index of column header being held.
ImS8 ReorderColumn; // Index of column being reordered. (not cleared) ImS8 ReorderColumn; // Index of column being reordered. (not cleared)
ImS8 ReorderColumnDir; // -1 or +1 ImS8 ReorderColumnDir; // -1 or +1
ImS8 RightMostActiveColumn; // Index of right-most non-hidden column. ImS8 RightMostVisibleColumn; // Index of right-most non-hidden column.
ImS8 LeftMostStretchedColumnDisplayOrder; // Display order of left-most stretched column. ImS8 LeftMostStretchedColumnDisplayOrder; // Display order of left-most stretched column.
ImS8 ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot ImS8 ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot
ImS8 DummyDrawChannel; // Redirect non-visible columns here. ImS8 DummyDrawChannel; // Redirect non-visible columns here.
@ -2049,7 +2049,7 @@ struct ImGuiTableColumnSettings
ImS8 DisplayOrder; ImS8 DisplayOrder;
ImS8 SortOrder; ImS8 SortOrder;
ImS8 SortDirection : 7; ImS8 SortDirection : 7;
ImU8 Visible : 1; // This is called Active in ImGuiTableColumn, but in user-facing code we call this Visible (thus in .ini file) ImU8 Visible : 1;
ImGuiTableColumnSettings() ImGuiTableColumnSettings()
{ {

View File

@ -286,7 +286,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
table->DeclColumnsCount = 0; table->DeclColumnsCount = 0;
table->HoveredColumnBody = -1; table->HoveredColumnBody = -1;
table->HoveredColumnBorder = -1; table->HoveredColumnBorder = -1;
table->RightMostActiveColumn = -1; table->RightMostVisibleColumn = -1;
// Using opaque colors facilitate overlapping elements of the grid // Using opaque colors facilitate overlapping elements of the grid
table->BorderColorStrong = GetColorU32(ImGuiCol_TableBorderStrong); table->BorderColorStrong = GetColorU32(ImGuiCol_TableBorderStrong);
@ -333,7 +333,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
// Because we cannot safely assert in EndTable() when no rows have been created, this seems like our best option. // Because we cannot safely assert in EndTable() when no rows have been created, this seems like our best option.
inner_window->SkipItems = true; inner_window->SkipItems = true;
// Update/lock which columns will be Active for the frame // Update/lock which columns will be Visible for the frame
TableBeginUpdateColumns(table); TableBeginUpdateColumns(table);
return true; return true;
@ -371,7 +371,7 @@ void ImGui::TableBeginUpdateColumns(ImGuiTable* table)
IM_ASSERT(reorder_dir == -1 || reorder_dir == +1); IM_ASSERT(reorder_dir == -1 || reorder_dir == +1);
IM_ASSERT(table->Flags & ImGuiTableFlags_Reorderable); IM_ASSERT(table->Flags & ImGuiTableFlags_Reorderable);
ImGuiTableColumn* src_column = &table->Columns[table->ReorderColumn]; ImGuiTableColumn* src_column = &table->Columns[table->ReorderColumn];
ImGuiTableColumn* dst_column = &table->Columns[(reorder_dir == -1) ? src_column->PrevActiveColumn : src_column->NextActiveColumn]; ImGuiTableColumn* dst_column = &table->Columns[(reorder_dir == -1) ? src_column->PrevVisibleColumn : src_column->NextVisibleColumn];
IM_UNUSED(dst_column); IM_UNUSED(dst_column);
const int src_order = src_column->DisplayOrder; const int src_order = src_column->DisplayOrder;
const int dst_order = dst_column->DisplayOrder; const int dst_order = dst_column->DisplayOrder;
@ -398,10 +398,10 @@ void ImGui::TableBeginUpdateColumns(ImGuiTable* table)
table->IsSettingsDirty = true; table->IsSettingsDirty = true;
} }
// Setup and lock Active state and order // Setup and lock Visible state and order
table->ColumnsActiveCount = 0; table->ColumnsVisibleCount = 0;
table->IsDefaultDisplayOrder = true; table->IsDefaultDisplayOrder = true;
ImGuiTableColumn* last_active_column = NULL; ImGuiTableColumn* last_visible_column = NULL;
bool want_column_auto_fit = false; bool want_column_auto_fit = false;
for (int order_n = 0; order_n < table->ColumnsCount; order_n++) for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
{ {
@ -411,12 +411,12 @@ void ImGui::TableBeginUpdateColumns(ImGuiTable* table)
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];
column->NameOffset = -1; column->NameOffset = -1;
if (!(table->Flags & ImGuiTableFlags_Hideable) || (column->Flags & ImGuiTableColumnFlags_NoHide)) if (!(table->Flags & ImGuiTableFlags_Hideable) || (column->Flags & ImGuiTableColumnFlags_NoHide))
column->IsActiveNextFrame = true; column->IsVisibleNextFrame = true;
if (column->IsActive != column->IsActiveNextFrame) if (column->IsVisible != column->IsVisibleNextFrame)
{ {
column->IsActive = column->IsActiveNextFrame; column->IsVisible = column->IsVisibleNextFrame;
table->IsSettingsDirty = true; table->IsSettingsDirty = true;
if (!column->IsActive && column->SortOrder != -1) if (!column->IsVisible && column->SortOrder != -1)
table->IsSortSpecsDirty = true; table->IsSortSpecsDirty = true;
} }
if (column->SortOrder > 0 && !(table->Flags & ImGuiTableFlags_MultiSortable)) if (column->SortOrder > 0 && !(table->Flags & ImGuiTableFlags_MultiSortable))
@ -426,30 +426,30 @@ void ImGui::TableBeginUpdateColumns(ImGuiTable* table)
ImU64 index_mask = (ImU64)1 << column_n; ImU64 index_mask = (ImU64)1 << column_n;
ImU64 display_order_mask = (ImU64)1 << column->DisplayOrder; ImU64 display_order_mask = (ImU64)1 << column->DisplayOrder;
if (column->IsActive) if (column->IsVisible)
{ {
column->PrevActiveColumn = column->NextActiveColumn = -1; column->PrevVisibleColumn = column->NextVisibleColumn = -1;
if (last_active_column) if (last_visible_column)
{ {
last_active_column->NextActiveColumn = (ImS8)column_n; last_visible_column->NextVisibleColumn = (ImS8)column_n;
column->PrevActiveColumn = (ImS8)table->Columns.index_from_ptr(last_active_column); column->PrevVisibleColumn = (ImS8)table->Columns.index_from_ptr(last_visible_column);
} }
column->IndexWithinActiveSet = (ImS8)table->ColumnsActiveCount; column->IndexWithinVisibleSet = (ImS8)table->ColumnsVisibleCount;
table->ColumnsActiveCount++; table->ColumnsVisibleCount++;
table->ActiveMaskByIndex |= index_mask; table->VisibleMaskByIndex |= index_mask;
table->ActiveMaskByDisplayOrder |= display_order_mask; table->VisibleMaskByDisplayOrder |= display_order_mask;
last_active_column = column; last_visible_column = column;
} }
else else
{ {
column->IndexWithinActiveSet = -1; column->IndexWithinVisibleSet = -1;
table->ActiveMaskByIndex &= ~index_mask; table->VisibleMaskByIndex &= ~index_mask;
table->ActiveMaskByDisplayOrder &= ~display_order_mask; table->VisibleMaskByDisplayOrder &= ~display_order_mask;
} }
IM_ASSERT(column->IndexWithinActiveSet <= column->DisplayOrder); IM_ASSERT(column->IndexWithinVisibleSet <= column->DisplayOrder);
} }
table->VisibleMaskByIndex = table->ActiveMaskByIndex; // Columns will be masked out by TableUpdateLayout() when Clipped table->VisibleUnclippedMaskByIndex = table->VisibleMaskByIndex; // Columns will be masked out by TableUpdateLayout() when Clipped
table->RightMostActiveColumn = (ImS8)(last_active_column ? table->Columns.index_from_ptr(last_active_column) : -1); table->RightMostVisibleColumn = (ImS8)(last_visible_column ? table->Columns.index_from_ptr(last_visible_column) : -1);
// Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible to avoid // 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). // the column fitting to wait until the first visible frame of the child container (may or not be a good thing).
@ -473,9 +473,9 @@ void ImGui::TableUpdateDrawChannels(ImGuiTable* table)
// - FreezeRows || FreezeColumns --> 1+N*2 (unless scrolling value is zero) // - FreezeRows || FreezeColumns --> 1+N*2 (unless scrolling value is zero)
// - FreezeRows && FreezeColunns --> 2+N*2 (unless scrolling value is zero) // - FreezeRows && FreezeColunns --> 2+N*2 (unless scrolling value is zero)
const int freeze_row_multiplier = (table->FreezeRowsCount > 0) ? 2 : 1; const int freeze_row_multiplier = (table->FreezeRowsCount > 0) ? 2 : 1;
const int channels_for_row = (table->Flags & ImGuiTableFlags_NoClipX) ? 1 : table->ColumnsActiveCount; const int channels_for_row = (table->Flags & ImGuiTableFlags_NoClipX) ? 1 : table->ColumnsVisibleCount;
const int channels_for_background = 1; const int channels_for_background = 1;
const int channels_for_dummy = (table->ColumnsActiveCount < table->ColumnsCount || table->VisibleMaskByIndex != table->ActiveMaskByIndex) ? +1 : 0; const int channels_for_dummy = (table->ColumnsVisibleCount < table->ColumnsCount || table->VisibleUnclippedMaskByIndex != table->VisibleMaskByIndex) ? +1 : 0;
const int channels_total = channels_for_background + (channels_for_row * freeze_row_multiplier) + channels_for_dummy; const int channels_total = channels_for_background + (channels_for_row * freeze_row_multiplier) + channels_for_dummy;
table->DrawSplitter.Split(table->InnerWindow->DrawList, channels_total); table->DrawSplitter.Split(table->InnerWindow->DrawList, channels_total);
table->DummyDrawChannel = channels_for_dummy ? (ImS8)(channels_total - 1) : -1; table->DummyDrawChannel = channels_for_dummy ? (ImS8)(channels_total - 1) : -1;
@ -568,7 +568,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
table->ColumnsAutoFitWidth = 0.0f; table->ColumnsAutoFitWidth = 0.0f;
for (int order_n = 0; order_n < table->ColumnsCount; order_n++) for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
{ {
if (!(table->ActiveMaskByDisplayOrder & ((ImU64)1 << order_n))) if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)))
continue; continue;
const int column_n = table->DisplayOrderToIndex[order_n]; const int column_n = table->DisplayOrderToIndex[order_n];
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];
@ -626,11 +626,11 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// CellSpacingX is >0.0f when there's no vertical border, in which case we add two extra CellSpacingX to make auto-fit look nice instead of cramped. // CellSpacingX is >0.0f when there's no vertical border, in which case we add two extra CellSpacingX to make auto-fit look nice instead of cramped.
// We may want to expose this somehow. // We may want to expose this somehow.
table->ColumnsAutoFitWidth += spacing_auto_x * (table->ColumnsActiveCount - 1); table->ColumnsAutoFitWidth += spacing_auto_x * (table->ColumnsVisibleCount - 1);
// Layout // Layout
// Remove -1.0f to cancel out the +1.0f we are doing in EndTable() to make last column line visible // Remove -1.0f to cancel out the +1.0f we are doing in EndTable() to make last column line visible
const float width_spacings = table->CellSpacingX * (table->ColumnsActiveCount - 1); const float width_spacings = table->CellSpacingX * (table->ColumnsVisibleCount - 1);
float width_avail; float width_avail;
if ((table->Flags & ImGuiTableFlags_ScrollX) && table->InnerWidth == 0.0f) if ((table->Flags & ImGuiTableFlags_ScrollX) && table->InnerWidth == 0.0f)
width_avail = table->InnerClipRect.GetWidth() - width_spacings - 1.0f; width_avail = table->InnerClipRect.GetWidth() - width_spacings - 1.0f;
@ -645,7 +645,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
table->ColumnsTotalWidth = width_spacings; table->ColumnsTotalWidth = width_spacings;
for (int order_n = 0; order_n < table->ColumnsCount; order_n++) for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
{ {
if (!(table->ActiveMaskByDisplayOrder & ((ImU64)1 << order_n))) if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)))
continue; continue;
ImGuiTableColumn* column = &table->Columns[table->DisplayOrderToIndex[order_n]]; ImGuiTableColumn* column = &table->Columns[table->DisplayOrderToIndex[order_n]];
@ -658,15 +658,15 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// [Resize Rule 2] Resizing from right-side of a weighted column before a fixed column froward sizing // [Resize Rule 2] Resizing from right-side of a weighted column before a fixed column froward sizing
// to left-side of fixed column. We also need to copy the NoResize flag.. // to left-side of fixed column. We also need to copy the NoResize flag..
if (column->NextActiveColumn != -1) if (column->NextVisibleColumn != -1)
if (ImGuiTableColumn* next_column = &table->Columns[column->NextActiveColumn]) if (ImGuiTableColumn* next_column = &table->Columns[column->NextVisibleColumn])
if (next_column->Flags & ImGuiTableColumnFlags_WidthFixed) if (next_column->Flags & ImGuiTableColumnFlags_WidthFixed)
column->Flags |= (next_column->Flags & ImGuiTableColumnFlags_NoDirectResize_); column->Flags |= (next_column->Flags & ImGuiTableColumnFlags_NoDirectResize_);
} }
// [Resize Rule 1] The right-most active column is not resizable if there is at least one Stretch column // [Resize Rule 1] The right-most Visible column is not resizable if there is at least one Stretch column
// (see comments in TableResizeColumn().) // (see comments in TableResizeColumn())
if (column->NextActiveColumn == -1 && table->LeftMostStretchedColumnDisplayOrder != -1) if (column->NextVisibleColumn == -1 && table->LeftMostStretchedColumnDisplayOrder != -1)
column->Flags |= ImGuiTableColumnFlags_NoDirectResize_; column->Flags |= ImGuiTableColumnFlags_NoDirectResize_;
if (!(column->Flags & ImGuiTableColumnFlags_NoResize)) if (!(column->Flags & ImGuiTableColumnFlags_NoResize))
@ -684,15 +684,15 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// Shrink widths when the total does not fit // Shrink widths when the total does not fit
// FIXME-TABLE: This is working but confuses/conflicts with manual resizing. // FIXME-TABLE: This is working but confuses/conflicts with manual resizing.
// FIXME-TABLE: Policy to shrink down below below ideal/requested width if there's no room? // FIXME-TABLE: Policy to shrink down below below ideal/requested width if there's no room?
g.ShrinkWidthBuffer.resize(table->ColumnsActiveCount); g.ShrinkWidthBuffer.resize(table->ColumnsVisibleCount);
for (int order_n = 0, active_n = 0; order_n < table->ColumnsCount; order_n++) for (int order_n = 0, visible_n = 0; order_n < table->ColumnsCount; order_n++)
{ {
if (!(table->ActiveMaskByDisplayOrder & ((ImU64)1 << order_n))) if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)))
continue; continue;
const int column_n = table->DisplayOrder[order_n]; const int column_n = table->DisplayOrder[order_n];
g.ShrinkWidthBuffer[active_n].Index = column_n; g.ShrinkWidthBuffer[visible_n].Index = column_n;
g.ShrinkWidthBuffer[active_n].Width = table->Columns[column_n].WidthGiven; g.ShrinkWidthBuffer[visible_n].Width = table->Columns[column_n].WidthGiven;
active_n++; visible_n++;
} }
ShrinkWidths(g.ShrinkWidthBuffer.Data, g.ShrinkWidthBuffer.Size, width_excess); ShrinkWidths(g.ShrinkWidthBuffer.Data, g.ShrinkWidthBuffer.Size, width_excess);
for (int n = 0; n < g.ShrinkWidthBuffer.Size; n++) for (int n = 0; n < g.ShrinkWidthBuffer.Size; n++)
@ -710,7 +710,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
if (width_remaining_for_stretched_columns >= 1.0f) if (width_remaining_for_stretched_columns >= 1.0f)
for (int order_n = table->ColumnsCount - 1; total_weights > 0.0f && width_remaining_for_stretched_columns >= 1.0f && order_n >= 0; order_n--) for (int order_n = table->ColumnsCount - 1; total_weights > 0.0f && width_remaining_for_stretched_columns >= 1.0f && order_n >= 0; order_n--)
{ {
if (!(table->ActiveMaskByDisplayOrder & ((ImU64)1 << order_n))) if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)))
continue; continue;
ImGuiTableColumn* column = &table->Columns[table->DisplayOrderToIndex[order_n]]; ImGuiTableColumn* column = &table->Columns[table->DisplayOrderToIndex[order_n]];
if (!(column->Flags & ImGuiTableColumnFlags_WidthStretch)) if (!(column->Flags & ImGuiTableColumnFlags_WidthStretch))
@ -721,7 +721,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
} }
// Setup final position, offset and clipping rectangles // Setup final position, offset and clipping rectangles
int active_n = 0; int visible_n = 0;
float offset_x = (table->FreezeColumnsCount > 0) ? table->OuterRect.Min.x : work_rect.Min.x; float offset_x = (table->FreezeColumnsCount > 0) ? table->OuterRect.Min.x : work_rect.Min.x;
ImRect host_clip_rect = table->InnerClipRect; ImRect host_clip_rect = table->InnerClipRect;
for (int order_n = 0; order_n < table->ColumnsCount; order_n++) for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
@ -729,10 +729,10 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
const int column_n = table->DisplayOrderToIndex[order_n]; const int column_n = table->DisplayOrderToIndex[order_n];
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];
if (table->FreezeColumnsCount > 0 && table->FreezeColumnsCount == active_n) if (table->FreezeColumnsCount > 0 && table->FreezeColumnsCount == visible_n)
offset_x += work_rect.Min.x - table->OuterRect.Min.x; offset_x += work_rect.Min.x - table->OuterRect.Min.x;
if (!(table->ActiveMaskByDisplayOrder & ((ImU64)1 << order_n))) if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)))
{ {
// Hidden column: clear a few fields and we are done with it for the remainder of the function. // Hidden column: clear a few fields and we are done with it for the remainder of the function.
// We set a zero-width clip rect but set Min.y/Max.y properly to not interfere with the clipper. // We set a zero-width clip rect but set Min.y/Max.y properly to not interfere with the clipper.
@ -761,7 +761,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// sure they are all visible. Because of this we also know that all of the columns will always fit in // sure they are all visible. Because of this we also know that all of the columns will always fit in
// table->WorkRect and therefore in table->InnerRect (because ScrollX is off) // table->WorkRect and therefore in table->InnerRect (because ScrollX is off)
if (!(table->Flags & ImGuiTableFlags_NoKeepColumnsVisible)) if (!(table->Flags & ImGuiTableFlags_NoKeepColumnsVisible))
max_x = table->WorkRect.Max.x - (table->ColumnsActiveCount - (column->IndexWithinActiveSet + 1)) * min_column_width; max_x = table->WorkRect.Max.x - (table->ColumnsVisibleCount - (column->IndexWithinVisibleSet + 1)) * min_column_width;
} }
if (offset_x + column->WidthGiven > max_x) if (offset_x + column->WidthGiven > max_x)
column->WidthGiven = ImMax(max_x - offset_x, min_column_width); column->WidthGiven = ImMax(max_x - offset_x, min_column_width);
@ -781,7 +781,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
if (column->IsClipped) if (column->IsClipped)
{ {
// Columns with the _WidthAlwaysAutoResize sizing policy will never be updated then. // Columns with the _WidthAlwaysAutoResize sizing policy will never be updated then.
table->VisibleMaskByIndex &= ~((ImU64)1 << column_n); table->VisibleUnclippedMaskByIndex &= ~((ImU64)1 << column_n);
} }
else else
{ {
@ -810,11 +810,11 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
column->CannotSkipItemsQueue >>= 1; column->CannotSkipItemsQueue >>= 1;
} }
if (active_n < table->FreezeColumnsCount) if (visible_n < table->FreezeColumnsCount)
host_clip_rect.Min.x = ImMax(host_clip_rect.Min.x, column->MaxX + 2.0f); host_clip_rect.Min.x = ImMax(host_clip_rect.Min.x, column->MaxX + 2.0f);
offset_x += column->WidthGiven + table->CellSpacingX; offset_x += column->WidthGiven + table->CellSpacingX;
active_n++; visible_n++;
} }
// Clear Resizable flag if none of our column are actually resizable (either via an explicit _NoResize flag, // Clear Resizable flag if none of our column are actually resizable (either via an explicit _NoResize flag,
@ -879,7 +879,7 @@ void ImGui::TableUpdateBorders(ImGuiTable* table)
for (int order_n = 0; order_n < table->ColumnsCount; order_n++) for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
{ {
if (!(table->ActiveMaskByDisplayOrder & ((ImU64)1 << order_n))) if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)))
continue; continue;
const int column_n = table->DisplayOrderToIndex[order_n]; const int column_n = table->DisplayOrderToIndex[order_n];
@ -1033,7 +1033,7 @@ void ImGui::EndTable()
column->ContentWidthHeadersIdeal = (ImS16)ImMax(0.0f, column->ContentMaxPosHeadersIdeal - ref_x_headers); column->ContentWidthHeadersIdeal = (ImS16)ImMax(0.0f, column->ContentMaxPosHeadersIdeal - ref_x_headers);
// Add an extra 1 pixel so we can see the last column vertical line if it lies on the right-most edge. // Add an extra 1 pixel so we can see the last column vertical line if it lies on the right-most edge.
if (table->ActiveMaskByIndex & ((ImU64)1 << column_n)) if (table->VisibleMaskByIndex & ((ImU64)1 << column_n))
max_pos_x = ImMax(max_pos_x, column->MaxX + 1.0f); max_pos_x = ImMax(max_pos_x, column->MaxX + 1.0f);
} }
@ -1094,7 +1094,7 @@ void ImGui::TableDrawBorders(ImGuiTable* table)
{ {
for (int order_n = 0; order_n < table->ColumnsCount; order_n++) for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
{ {
if (!(table->ActiveMaskByDisplayOrder & ((ImU64)1 << order_n))) if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)))
continue; continue;
const int column_n = table->DisplayOrderToIndex[order_n]; const int column_n = table->DisplayOrderToIndex[order_n];
@ -1103,7 +1103,7 @@ void ImGui::TableDrawBorders(ImGuiTable* table)
const bool is_resized = (table->ResizedColumn == column_n) && (table->InstanceInteracted == table->InstanceCurrent); const bool is_resized = (table->ResizedColumn == column_n) && (table->InstanceInteracted == table->InstanceCurrent);
const bool is_resizable = (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) == 0; const bool is_resizable = (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) == 0;
bool draw_right_border = (column->MaxX <= table->InnerClipRect.Max.x) || (is_resized || is_hovered); bool draw_right_border = (column->MaxX <= table->InnerClipRect.Max.x) || (is_resized || is_hovered);
if (column->NextActiveColumn == -1 && !is_resizable) if (column->NextVisibleColumn == -1 && !is_resizable)
draw_right_border = false; draw_right_border = false;
if (draw_right_border && column->MaxX > column->ClipRect.Min.x) // FIXME-TABLE FIXME-STYLE: Assume BorderSize==1, this is problematic if we want to increase the border size.. if (draw_right_border && column->MaxX > column->ClipRect.Min.x) // FIXME-TABLE FIXME-STYLE: Assume BorderSize==1, this is problematic if we want to increase the border size..
{ {
@ -1166,7 +1166,7 @@ static void TableUpdateColumnsWeightFromWidth(ImGuiTable* table)
for (int column_n = 0; column_n < table->ColumnsCount; column_n++) for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
{ {
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];
if (!column->IsActive || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) if (!column->IsVisible || !(column->Flags & ImGuiTableColumnFlags_WidthStretch))
continue; continue;
visible_weight += column->ResizeWeight; visible_weight += column->ResizeWeight;
visible_width += column->WidthRequested; visible_width += column->WidthRequested;
@ -1177,7 +1177,7 @@ static void TableUpdateColumnsWeightFromWidth(ImGuiTable* table)
for (int column_n = 0; column_n < table->ColumnsCount; column_n++) for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
{ {
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];
if (!column->IsActive || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) if (!column->IsVisible || !(column->Flags & ImGuiTableColumnFlags_WidthStretch))
continue; continue;
column->ResizeWeight = (column->WidthRequested + 0.0f) / visible_width; column->ResizeWeight = (column->WidthRequested + 0.0f) / visible_width;
} }
@ -1201,14 +1201,14 @@ void ImGui::TableSetColumnWidth(ImGuiTable* table, ImGuiTableColumn* column_0, f
float min_width = TableGetMinColumnWidth(); float min_width = TableGetMinColumnWidth();
float max_width_0 = FLT_MAX; float max_width_0 = FLT_MAX;
if (!(table->Flags & ImGuiTableFlags_ScrollX)) if (!(table->Flags & ImGuiTableFlags_ScrollX))
max_width_0 = (table->WorkRect.Max.x - column_0->MinX) - (table->ColumnsActiveCount - (column_0->IndexWithinActiveSet + 1)) * min_width; max_width_0 = (table->WorkRect.Max.x - column_0->MinX) - (table->ColumnsVisibleCount - (column_0->IndexWithinVisibleSet + 1)) * min_width;
column_0_width = ImClamp(column_0_width, min_width, max_width_0); column_0_width = ImClamp(column_0_width, min_width, max_width_0);
// Compare both requested and actual given width to avoid overwriting requested width when column is stuck (minimum size, bounded) // Compare both requested and actual given width to avoid overwriting requested width when column is stuck (minimum size, bounded)
if (column_0->WidthGiven == column_0_width || column_0->WidthRequested == column_0_width) if (column_0->WidthGiven == column_0_width || column_0->WidthRequested == column_0_width)
return; return;
ImGuiTableColumn* column_1 = (column_0->NextActiveColumn != -1) ? &table->Columns[column_0->NextActiveColumn] : NULL; ImGuiTableColumn* column_1 = (column_0->NextVisibleColumn != -1) ? &table->Columns[column_0->NextVisibleColumn] : 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 Stretch columns.
// When forwarding resize from Wn| to Fn+1| we need to be considerate of the _NoResize flag on Fn+1. // When forwarding resize from Wn| to Fn+1| we need to be considerate of the _NoResize flag on Fn+1.
@ -1315,7 +1315,7 @@ void ImGui::TableDrawMergeChannels(ImGuiTable* table)
// 1. Scan channels and take note of those which can be merged // 1. Scan channels and take note of those which can be merged
for (int order_n = 0; order_n < table->ColumnsCount; order_n++) for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
{ {
if (!(table->ActiveMaskByDisplayOrder & ((ImU64)1 << order_n))) if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)))
continue; continue;
const int column_n = table->DisplayOrderToIndex[order_n]; const int column_n = table->DisplayOrderToIndex[order_n];
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];
@ -1485,7 +1485,7 @@ void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags,
{ {
// Init default visibility/sort state // Init default visibility/sort state
if ((flags & ImGuiTableColumnFlags_DefaultHide) && (table->SettingsLoadedFlags & ImGuiTableFlags_Hideable) == 0) if ((flags & ImGuiTableColumnFlags_DefaultHide) && (table->SettingsLoadedFlags & ImGuiTableFlags_Hideable) == 0)
column->IsActive = column->IsActiveNextFrame = false; column->IsVisible = column->IsVisibleNextFrame = false;
if (flags & ImGuiTableColumnFlags_DefaultSort && (table->SettingsLoadedFlags & ImGuiTableFlags_Sortable) == 0) if (flags & ImGuiTableColumnFlags_DefaultSort && (table->SettingsLoadedFlags & ImGuiTableFlags_Sortable) == 0)
{ {
column->SortOrder = 0; // Multiple columns using _DefaultSort will be reordered when building the sort specs. column->SortOrder = 0; // Multiple columns using _DefaultSort will be reordered when building the sort specs.
@ -1692,7 +1692,7 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_n)
window->WorkRect.Max.x = column->MaxX - table->CellPaddingX2; window->WorkRect.Max.x = column->MaxX - table->CellPaddingX2;
// To allow ImGuiListClipper to function we propagate our row height // To allow ImGuiListClipper to function we propagate our row height
if (!column->IsActive) if (!column->IsVisible)
window->DC.CursorPos.y = ImMax(window->DC.CursorPos.y, table->RowPosY2); window->DC.CursorPos.y = ImMax(window->DC.CursorPos.y, table->RowPosY2);
window->SkipItems = column->SkipItems; window->SkipItems = column->SkipItems;
@ -1752,7 +1752,7 @@ bool ImGui::TableNextCell()
} }
int column_n = table->CurrentColumn; int column_n = table->CurrentColumn;
return (table->VisibleMaskByIndex & ((ImU64)1 << column_n)) != 0; return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_n)) != 0;
} }
const char* ImGui::TableGetColumnName(int column_n) const char* ImGui::TableGetColumnName(int column_n)
@ -1766,6 +1766,7 @@ const char* ImGui::TableGetColumnName(int column_n)
return TableGetColumnName(table, column_n); return TableGetColumnName(table, column_n);
} }
// We expose "Visible and Unclipped" to the user, vs our internal "Visible" state which is !Hidden
bool ImGui::TableGetColumnIsVisible(int column_n) bool ImGui::TableGetColumnIsVisible(int column_n)
{ {
ImGuiContext& g = *GImGui; ImGuiContext& g = *GImGui;
@ -1774,7 +1775,7 @@ bool ImGui::TableGetColumnIsVisible(int column_n)
return false; return false;
if (column_n < 0) if (column_n < 0)
column_n = table->CurrentColumn; column_n = table->CurrentColumn;
return (table->VisibleMaskByIndex & ((ImU64)1 << column_n)) != 0; return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_n)) != 0;
} }
int ImGui::TableGetColumnIndex() int ImGui::TableGetColumnIndex()
@ -1801,7 +1802,7 @@ bool ImGui::TableSetColumnIndex(int column_idx)
TableBeginCell(table, column_idx); TableBeginCell(table, column_idx);
} }
return (table->VisibleMaskByIndex & ((ImU64)1 << column_idx)) != 0; return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_idx)) != 0;
} }
// Return the cell rectangle based on currently known height. // Return the cell rectangle based on currently known height.
@ -1876,7 +1877,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table, int selected_column_n)
{ {
if (ImGuiTableColumn* selected_column = (selected_column_n != -1) ? &table->Columns[selected_column_n] : NULL) if (ImGuiTableColumn* selected_column = (selected_column_n != -1) ? &table->Columns[selected_column_n] : NULL)
{ {
const bool can_resize = !(selected_column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthStretch)) && selected_column->IsActive; const bool can_resize = !(selected_column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthStretch)) && selected_column->IsVisible;
if (MenuItem("Size column to fit", NULL, false, can_resize)) if (MenuItem("Size column to fit", NULL, false, can_resize))
TableSetColumnAutofit(table, selected_column_n); TableSetColumnAutofit(table, selected_column_n);
} }
@ -1886,7 +1887,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table, int selected_column_n)
for (int column_n = 0; column_n < table->ColumnsCount; column_n++) for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
{ {
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];
if (column->IsActive) if (column->IsVisible)
TableSetColumnAutofit(table, column_n); TableSetColumnAutofit(table, column_n);
} }
} }
@ -1918,10 +1919,10 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table, int selected_column_n)
// Make sure we can't hide the last active column // Make sure we can't hide the last active column
bool menu_item_active = (column->Flags & ImGuiTableColumnFlags_NoHide) ? false : true; bool menu_item_active = (column->Flags & ImGuiTableColumnFlags_NoHide) ? false : true;
if (column->IsActive && table->ColumnsActiveCount <= 1) if (column->IsVisible && table->ColumnsVisibleCount <= 1)
menu_item_active = false; menu_item_active = false;
if (MenuItem(name, NULL, column->IsActive, menu_item_active)) if (MenuItem(name, NULL, column->IsVisible, menu_item_active))
column->IsActiveNextFrame = !column->IsActive; column->IsVisibleNextFrame = !column->IsVisible;
} }
PopItemFlag(); PopItemFlag();
} }
@ -1995,8 +1996,8 @@ void ImGui::TableAutoHeaders()
// FIXME-TABLE: This is not user-land code any more... perhaps instead we should expose hovered column. // FIXME-TABLE: This is not user-land code any more... perhaps instead we should expose hovered column.
// and allow some sort of row-centric IsItemHovered() for full flexibility? // and allow some sort of row-centric IsItemHovered() for full flexibility?
float unused_x1 = table->WorkRect.Min.x; float unused_x1 = table->WorkRect.Min.x;
if (table->RightMostActiveColumn != -1) if (table->RightMostVisibleColumn != -1)
unused_x1 = ImMax(unused_x1, table->Columns[table->RightMostActiveColumn].MaxX); unused_x1 = ImMax(unused_x1, table->Columns[table->RightMostVisibleColumn].MaxX);
if (unused_x1 < table->WorkRect.Max.x) if (unused_x1 < table->WorkRect.Max.x)
{ {
// FIXME: We inherit ClipRect/SkipItem from last submitted column (active or not), let's temporarily override it. // FIXME: We inherit ClipRect/SkipItem from last submitted column (active or not), let's temporarily override it.
@ -2091,14 +2092,14 @@ void ImGui::TableHeader(const char* label)
// We don't reorder: through the frozen<>unfrozen line, or through a column that is marked with ImGuiTableColumnFlags_NoReorder. // We don't reorder: through the frozen<>unfrozen line, or through a column that is marked with ImGuiTableColumnFlags_NoReorder.
if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < cell_r.Min.x) if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < cell_r.Min.x)
if (ImGuiTableColumn* prev_column = (column->PrevActiveColumn != -1) ? &table->Columns[column->PrevActiveColumn] : NULL) if (ImGuiTableColumn* prev_column = (column->PrevVisibleColumn != -1) ? &table->Columns[column->PrevVisibleColumn] : NULL)
if (!((column->Flags | prev_column->Flags) & ImGuiTableColumnFlags_NoReorder)) if (!((column->Flags | prev_column->Flags) & ImGuiTableColumnFlags_NoReorder))
if ((column->IndexWithinActiveSet < table->FreezeColumnsRequest) == (prev_column->IndexWithinActiveSet < table->FreezeColumnsRequest)) if ((column->IndexWithinVisibleSet < table->FreezeColumnsRequest) == (prev_column->IndexWithinVisibleSet < table->FreezeColumnsRequest))
table->ReorderColumnDir = -1; table->ReorderColumnDir = -1;
if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > cell_r.Max.x) if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > cell_r.Max.x)
if (ImGuiTableColumn* next_column = (column->NextActiveColumn != -1) ? &table->Columns[column->NextActiveColumn] : NULL) if (ImGuiTableColumn* next_column = (column->NextVisibleColumn != -1) ? &table->Columns[column->NextVisibleColumn] : NULL)
if (!((column->Flags | next_column->Flags) & ImGuiTableColumnFlags_NoReorder)) if (!((column->Flags | next_column->Flags) & ImGuiTableColumnFlags_NoReorder))
if ((column->IndexWithinActiveSet < table->FreezeColumnsRequest) == (next_column->IndexWithinActiveSet < table->FreezeColumnsRequest)) if ((column->IndexWithinVisibleSet < table->FreezeColumnsRequest) == (next_column->IndexWithinVisibleSet < table->FreezeColumnsRequest))
table->ReorderColumnDir = +1; table->ReorderColumnDir = +1;
} }
@ -2257,7 +2258,7 @@ void ImGui::TableSortSpecsSanitize(ImGuiTable* table)
for (int column_n = 0; column_n < table->ColumnsCount; column_n++) for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
{ {
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];
if (column->SortOrder != -1 && !column->IsActive) if (column->SortOrder != -1 && !column->IsVisible)
column->SortOrder = -1; column->SortOrder = -1;
if (column->SortOrder == -1) if (column->SortOrder == -1)
continue; continue;
@ -2300,7 +2301,7 @@ void ImGui::TableSortSpecsSanitize(ImGuiTable* table)
for (int column_n = 0; column_n < table->ColumnsCount; column_n++) for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
{ {
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];
if (!(column->Flags & ImGuiTableColumnFlags_NoSort) && column->IsActive) if (!(column->Flags & ImGuiTableColumnFlags_NoSort) && column->IsVisible)
{ {
sort_order_count = 1; sort_order_count = 1;
column->SortOrder = 0; column->SortOrder = 0;
@ -2398,7 +2399,7 @@ void ImGui::TableSaveSettings(ImGuiTable* table)
column_settings->DisplayOrder = column->DisplayOrder; column_settings->DisplayOrder = column->DisplayOrder;
column_settings->SortOrder = column->SortOrder; column_settings->SortOrder = column->SortOrder;
column_settings->SortDirection = column->SortDirection; column_settings->SortDirection = column->SortDirection;
column_settings->Visible = column->IsActive; column_settings->Visible = column->IsVisible;
// We skip saving some data in the .ini file when they are unnecessary to restore our state // We skip saving some data in the .ini file when they are unnecessary to restore our state
// FIXME-TABLE: We don't have logic to easily compare SortOrder to DefaultSortOrder yet so it's always saved when present. // FIXME-TABLE: We don't have logic to easily compare SortOrder to DefaultSortOrder yet so it's always saved when present.
@ -2450,7 +2451,7 @@ void ImGui::TableLoadSettings(ImGuiTable* table)
column->DisplayOrder = column_settings->DisplayOrder; column->DisplayOrder = column_settings->DisplayOrder;
else else
column->DisplayOrder = (ImS8)column_n; column->DisplayOrder = (ImS8)column_n;
column->IsActive = column->IsActiveNextFrame = column_settings->Visible; column->IsVisible = column->IsVisibleNextFrame = column_settings->Visible;
column->SortOrder = column_settings->SortOrder; column->SortOrder = column_settings->SortOrder;
column->SortDirection = column_settings->SortDirection; column->SortDirection = column_settings->SortDirection;
} }
@ -2592,13 +2593,13 @@ void ImGui::DebugNodeTable(ImGuiTable* table)
ImGuiTableColumn* column = &table->Columns[n]; ImGuiTableColumn* column = &table->Columns[n];
const char* name = TableGetColumnName(table, n); const char* name = TableGetColumnName(table, n);
BulletText("Column %d order %d name '%s': +%.1f to +%.1f\n" BulletText("Column %d order %d name '%s': +%.1f to +%.1f\n"
"Active: %d, Clipped: %d, DrawChannels: %d,%d\n" "Visible: %d, Clipped: %d, DrawChannels: %d,%d\n"
"WidthGiven/Requested: %.1f/%.1f, Weight: %.2f\n" "WidthGiven/Requested: %.1f/%.1f, Weight: %.2f\n"
"ContentWidth: RowsFrozen %d, RowsUnfrozen %d, HeadersUsed/Ideal %d/%d\n" "ContentWidth: RowsFrozen %d, RowsUnfrozen %d, HeadersUsed/Ideal %d/%d\n"
"SortOrder: %d, SortDir: %s\n" "SortOrder: %d, SortDir: %s\n"
"UserID: 0x%08X, Flags: 0x%04X: %s%s%s%s..", "UserID: 0x%08X, Flags: 0x%04X: %s%s%s%s..",
n, column->DisplayOrder, name ? name : "NULL", column->MinX - table->WorkRect.Min.x, column->MaxX - table->WorkRect.Min.x, n, column->DisplayOrder, name ? name : "NULL", column->MinX - table->WorkRect.Min.x, column->MaxX - table->WorkRect.Min.x,
column->IsActive, column->IsClipped, column->DrawChannelRowsBeforeFreeze, column->DrawChannelRowsAfterFreeze, column->IsVisible, column->IsClipped, column->DrawChannelRowsBeforeFreeze, column->DrawChannelRowsAfterFreeze,
column->WidthGiven, column->WidthRequested, column->ResizeWeight, column->WidthGiven, column->WidthRequested, column->ResizeWeight,
column->ContentWidthRowsFrozen, column->ContentWidthRowsUnfrozen, column->ContentWidthHeadersUsed, column->ContentWidthHeadersIdeal, column->ContentWidthRowsFrozen, column->ContentWidthRowsUnfrozen, column->ContentWidthHeadersUsed, column->ContentWidthHeadersIdeal,
column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? "Ascending" : (column->SortDirection == ImGuiSortDirection_Descending) ? "Descending" : "None", column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? "Ascending" : (column->SortDirection == ImGuiSortDirection_Descending) ? "Descending" : "None",