Tables: (Breaking) Rename TableAutoHeaders() to TableHeadersRow() + added TableGetColumnCount().

This commit is contained in:
ocornut 2020-09-24 14:33:40 +02:00
parent 3021608392
commit 9b37087fbe
3 changed files with 44 additions and 40 deletions

11
imgui.h
View File

@ -661,7 +661,7 @@ namespace ImGui
// - 1. Call BeginTable() // - 1. Call BeginTable()
// - 2. Optionally call TableSetupColumn() to submit column name/flags/defaults // - 2. Optionally call TableSetupColumn() to submit column name/flags/defaults
// - 3. Optionally call TableSetupScrollFreeze() to request scroll freezing of columns/rows // - 3. Optionally call TableSetupScrollFreeze() to request scroll freezing of columns/rows
// - 4. Optionally call TableAutoHeaders() to submit a header row (names will be pulled from data submitted to TableSetupColumns) // - 4. Optionally call TableHeadersRow() to submit a header row (names will be pulled from data submitted to TableSetupColumns)
// - 4. Populate contents // - 4. Populate contents
// - In most situations you can use TableNextRow() + TableSetColumnIndex() to start appending into a column. // - In most situations you can use TableNextRow() + TableSetColumnIndex() to start appending into a column.
// - If you are using tables as a sort of grid, where every columns is holding the same type of contents, // - If you are using tables as a sort of grid, where every columns is holding the same type of contents,
@ -678,13 +678,13 @@ namespace ImGui
// Tables: Headers & Columns declaration // Tables: Headers & Columns declaration
// - Use TableSetupScrollFreeze() to lock columns (from the right) or rows (from the top) so they stay visible when scrolled. // - Use TableSetupScrollFreeze() to lock columns (from the right) or rows (from the top) so they stay visible when scrolled.
// - 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.
// Important: this will not display anything! The name passed to TableSetupColumn() is used by TableAutoHeaders() and context-menus. // Important: this will not display anything! The name passed to TableSetupColumn() is used by TableHeadersRow() and context-menus.
// - Use TableAutoHeaders() to create a row and automatically submit a TableHeader() for each column. // - Use TableHeadersRow() to create a row and automatically submit a TableHeader() for each column.
// Headers are required to perform some interactions: reordering, sorting, context menu (FIXME-TABLE: context menu should work without!) // Headers are required to perform some interactions: reordering, sorting, context menu (FIXME-TABLE: context menu should work without!)
// - You may manually submit headers using TableNextRow() + TableHeader() calls, but this is only useful in some advanced cases (e.g. adding custom widgets in header row). // - You may manually submit headers using TableNextRow() + TableHeader() calls, but this is only useful in some advanced cases (e.g. adding custom widgets in header row).
IMGUI_API void TableSetupScrollFreeze(int columns, int rows); IMGUI_API void TableSetupScrollFreeze(int columns, int rows);
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 TableHeadersRow(); // 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 (rarely used) IMGUI_API void TableHeader(const char* label); // submit one header cell manually (rarely used)
// Tables: Miscellaneous functions // Tables: Miscellaneous functions
// - Most functions taking 'int column_n' treat the default value of -1 as the same as passing the current column index // - Most functions taking 'int column_n' treat the default value of -1 as the same as passing the current column index
@ -692,6 +692,7 @@ namespace ImGui
// When 'SpecsDirty == true' you should sort your data. It will be true when sorting specs have changed since last call, or the first time. // When 'SpecsDirty == true' you should sort your data. It will be true when sorting specs have changed since last call, or the first time.
// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame! // Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame!
// Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable(). // Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable().
IMGUI_API int TableGetColumnCount(); // return number of columns (value passed to BeginTable)
IMGUI_API const char* TableGetColumnName(int column_n = -1); // return NULL if column didn't have a name declared by TableSetupColumn(). Pass -1 to use current column. IMGUI_API const char* TableGetColumnName(int column_n = -1); // return NULL if column didn't have a name declared by TableSetupColumn(). Pass -1 to use current column.
IMGUI_API bool TableGetColumnIsVisible(int column_n = -1); // return true if column is visible. Same value is also returned by TableNextCell() and TableSetColumnIndex(). Pass -1 to use current column. IMGUI_API bool TableGetColumnIsVisible(int column_n = -1); // return true if column is visible. Same value is also returned by TableNextCell() and TableSetColumnIndex(). Pass -1 to use current column.
IMGUI_API bool TableGetColumnIsSorted(int column_n = -1); // return true if column is included in the sort specs. Rarely used, can be useful to tell if a data change should trigger resort. Equivalent to test ImGuiTableSortSpecs's ->ColumnsMask & (1 << column_n). Pass -1 to use current column. IMGUI_API bool TableGetColumnIsSorted(int column_n = -1); // return true if column is included in the sort specs. Rarely used, can be useful to tell if a data change should trigger resort. Equivalent to test ImGuiTableSortSpecs's ->ColumnsMask & (1 << column_n). Pass -1 to use current column.
@ -1042,7 +1043,7 @@ enum ImGuiTableFlags_
// Features // Features
ImGuiTableFlags_None = 0, ImGuiTableFlags_None = 0,
ImGuiTableFlags_Resizable = 1 << 0, // Allow resizing columns. ImGuiTableFlags_Resizable = 1 << 0, // Allow resizing columns.
ImGuiTableFlags_Reorderable = 1 << 1, // Allow reordering columns (need calling TableSetupColumn() + TableAutoHeaders() or TableHeaders() to display headers) ImGuiTableFlags_Reorderable = 1 << 1, // Allow reordering columns (need calling TableSetupColumn() + TableHeadersRow() to display headers)
ImGuiTableFlags_Hideable = 1 << 2, // Allow hiding columns (with right-click on header) (FIXME-TABLE: allow without headers). ImGuiTableFlags_Hideable = 1 << 2, // Allow hiding columns (with right-click on header) (FIXME-TABLE: allow without headers).
ImGuiTableFlags_Sortable = 1 << 3, // Allow sorting on one column (sort_specs_count will always be == 1). Call TableGetSortSpecs() to obtain sort specs. ImGuiTableFlags_Sortable = 1 << 3, // Allow sorting on one column (sort_specs_count will always be == 1). Call TableGetSortSpecs() to obtain sort specs.
ImGuiTableFlags_MultiSortable = 1 << 4, // Allow sorting on multiple columns by holding Shift (sort_specs_count may be > 1). Call TableGetSortSpecs() to obtain sort specs. ImGuiTableFlags_MultiSortable = 1 << 4, // Allow sorting on multiple columns by holding Shift (sort_specs_count may be > 1). Call TableGetSortSpecs() to obtain sort specs.

View File

@ -3513,7 +3513,7 @@ static void ShowDemoWindowTables()
ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed);// | ImGuiTableColumnFlags_NoResize); ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed);// | ImGuiTableColumnFlags_NoResize);
ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed); ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed);
ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthStretch);
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
for (int row = 0; row < 5; row++) for (int row = 0; row < 5; row++)
{ {
ImGui::TableNextRow(); ImGui::TableNextRow();
@ -3533,7 +3533,7 @@ static void ShowDemoWindowTables()
ImGui::TableSetupColumn("DDD", ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("DDD", ImGuiTableColumnFlags_WidthStretch);
ImGui::TableSetupColumn("EEE", ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("EEE", ImGuiTableColumnFlags_WidthStretch);
ImGui::TableSetupColumn("FFF", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_DefaultHide); ImGui::TableSetupColumn("FFF", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_DefaultHide);
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
for (int row = 0; row < 5; row++) for (int row = 0; row < 5; row++)
{ {
ImGui::TableNextRow(); ImGui::TableNextRow();
@ -3560,12 +3560,12 @@ static void ShowDemoWindowTables()
if (ImGui::BeginTable("##table1", 3, flags)) if (ImGui::BeginTable("##table1", 3, flags))
{ {
// Submit columns name with TableSetupColumn() and call TableAutoHeaders() to create a row with a header in each column. // Submit columns name with TableSetupColumn() and call TableHeadersRow() to create a row with a header in each column.
// (Later we will show how TableSetupColumn() has other uses, optional flags, sizing weight etc.) // (Later we will show how TableSetupColumn() has other uses, optional flags, sizing weight etc.)
ImGui::TableSetupColumn("One"); ImGui::TableSetupColumn("One");
ImGui::TableSetupColumn("Two"); ImGui::TableSetupColumn("Two");
ImGui::TableSetupColumn("Three"); ImGui::TableSetupColumn("Three");
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
for (int row = 0; row < 6; row++) for (int row = 0; row < 6; row++)
{ {
ImGui::TableNextRow(); ImGui::TableNextRow();
@ -3583,7 +3583,7 @@ static void ShowDemoWindowTables()
ImGui::TableSetupColumn("One"); ImGui::TableSetupColumn("One");
ImGui::TableSetupColumn("Two"); ImGui::TableSetupColumn("Two");
ImGui::TableSetupColumn("Three"); ImGui::TableSetupColumn("Three");
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
for (int row = 0; row < 6; row++) for (int row = 0; row < 6; row++)
{ {
ImGui::TableNextRow(); ImGui::TableNextRow();
@ -3639,7 +3639,7 @@ static void ShowDemoWindowTables()
ImGui::TableSetupColumn("One", ImGuiTableColumnFlags_None); ImGui::TableSetupColumn("One", ImGuiTableColumnFlags_None);
ImGui::TableSetupColumn("Two", ImGuiTableColumnFlags_None); ImGui::TableSetupColumn("Two", ImGuiTableColumnFlags_None);
ImGui::TableSetupColumn("Three", ImGuiTableColumnFlags_None); ImGui::TableSetupColumn("Three", ImGuiTableColumnFlags_None);
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
ImGuiListClipper clipper; ImGuiListClipper clipper;
clipper.Begin(1000); clipper.Begin(1000);
while (clipper.Step()) while (clipper.Step())
@ -3684,7 +3684,7 @@ static void ShowDemoWindowTables()
ImGui::TableSetupColumn("Four", ImGuiTableColumnFlags_None); ImGui::TableSetupColumn("Four", ImGuiTableColumnFlags_None);
ImGui::TableSetupColumn("Five", ImGuiTableColumnFlags_None); ImGui::TableSetupColumn("Five", ImGuiTableColumnFlags_None);
ImGui::TableSetupColumn("Six", ImGuiTableColumnFlags_None); ImGui::TableSetupColumn("Six", ImGuiTableColumnFlags_None);
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
for (int row = 0; row < 20; row++) for (int row = 0; row < 20; row++)
{ {
ImGui::TableNextRow(); ImGui::TableNextRow();
@ -3750,7 +3750,7 @@ static void ShowDemoWindowTables()
{ {
for (int column = 0; column < column_count; column++) for (int column = 0; column < column_count; column++)
ImGui::TableSetupColumn(column_names[column], column_flags[column]); ImGui::TableSetupColumn(column_names[column], column_flags[column]);
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
for (int row = 0; row < 8; row++) for (int row = 0; row < 8; row++)
{ {
ImGui::Indent(2.0f); // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags. ImGui::Indent(2.0f); // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags.
@ -3778,7 +3778,7 @@ static void ShowDemoWindowTables()
{ {
ImGui::TableSetupColumn("A0"); ImGui::TableSetupColumn("A0");
ImGui::TableSetupColumn("A1"); ImGui::TableSetupColumn("A1");
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
ImGui::TableNextRow(); ImGui::Text("A0 Cell 0"); ImGui::TableNextRow(); ImGui::Text("A0 Cell 0");
{ {
@ -3787,7 +3787,7 @@ static void ShowDemoWindowTables()
{ {
ImGui::TableSetupColumn("B0"); ImGui::TableSetupColumn("B0");
ImGui::TableSetupColumn("B1"); ImGui::TableSetupColumn("B1");
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height); ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height);
ImGui::Text("B0 Cell 0"); ImGui::Text("B0 Cell 0");
@ -3990,7 +3990,7 @@ static void ShowDemoWindowTables()
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide); ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide);
ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 6); ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 6);
ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 10); ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 10);
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
// Simple storage to output a dummy file-system. // Simple storage to output a dummy file-system.
struct MyTreeNode struct MyTreeNode
@ -4048,7 +4048,7 @@ static void ShowDemoWindowTables()
ImGui::TreePop(); ImGui::TreePop();
} }
// Demonstrate using TableHeader() calls instead of TableAutoHeaders() // Demonstrate using TableHeader() calls instead of TableHeadersRow()
if (open_action != -1) if (open_action != -1)
ImGui::SetNextItemOpen(open_action != 0); ImGui::SetNextItemOpen(open_action != 0);
if (ImGui::TreeNode("Custom headers")) if (ImGui::TreeNode("Custom headers"))
@ -4064,7 +4064,7 @@ static void ShowDemoWindowTables()
// FIXME: It would be nice to actually demonstrate full-featured selection using those checkbox. // FIXME: It would be nice to actually demonstrate full-featured selection using those checkbox.
static bool column_selected[3] = {}; static bool column_selected[3] = {};
// Instead of calling TableAutoHeaders() we'll submit custom headers ourselves // Instead of calling TableHeadersRow() we'll submit custom headers ourselves
ImGui::TableNextRow(ImGuiTableRowFlags_Headers); ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
for (int column = 0; column < COLUMNS_COUNT; column++) for (int column = 0; column < COLUMNS_COUNT; column++)
{ {
@ -4095,12 +4095,12 @@ static void ShowDemoWindowTables()
ImGui::TreePop(); ImGui::TreePop();
} }
// Demonstrate creating custom context menus inside columns, while playing it nice with context menus provided by TableHeader()/TableAutoHeaders() // Demonstrate creating custom context menus inside columns, while playing it nice with context menus provided by TableHeadersRow()/TableHeader()
if (open_action != -1) if (open_action != -1)
ImGui::SetNextItemOpen(open_action != 0); ImGui::SetNextItemOpen(open_action != 0);
if (ImGui::TreeNode("Context menus")) if (ImGui::TreeNode("Context menus"))
{ {
HelpMarker("By default, TableHeader()/TableAutoHeaders() will open a context-menu on right-click."); HelpMarker("By default, TableHeadersRow()/TableHeader() will open a context-menu on right-click.");
ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingPolicyFixedX | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders; ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingPolicyFixedX | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders;
const int COLUMNS_COUNT = 3; const int COLUMNS_COUNT = 3;
if (ImGui::BeginTable("##table1", COLUMNS_COUNT, flags)) if (ImGui::BeginTable("##table1", COLUMNS_COUNT, flags))
@ -4110,7 +4110,7 @@ static void ShowDemoWindowTables()
ImGui::TableSetupColumn("Three"); ImGui::TableSetupColumn("Three");
// Context Menu 1: right-click on header (including empty section after the third column!) should open Default Table Popup // Context Menu 1: right-click on header (including empty section after the third column!) should open Default Table Popup
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
for (int row = 0; row < 4; row++) for (int row = 0; row < 4; row++)
{ {
ImGui::TableNextRow(); ImGui::TableNextRow();
@ -4219,7 +4219,7 @@ static void ShowDemoWindowTables()
} }
// Display data // Display data
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
ImGuiListClipper clipper; ImGuiListClipper clipper;
clipper.Begin(items.Size); clipper.Begin(items.Size);
while (clipper.Step()) while (clipper.Step())
@ -4408,7 +4408,7 @@ static void ShowDemoWindowTables()
// Show headers // Show headers
if (show_headers) if (show_headers)
ImGui::TableAutoHeaders(); ImGui::TableHeadersRow();
// Show data // Show data
// FIXME-TABLE FIXME-NAV: How we can get decent up/down even though we have the buttons here? // FIXME-TABLE FIXME-NAV: How we can get decent up/down even though we have the buttons here?

View File

@ -75,11 +75,11 @@
// | TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission // | TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission
// | TableDrawContextMenu() - draw right-click context menu // | TableDrawContextMenu() - draw right-click context menu
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// - TableAutoHeaders() or TableHeader() user submit a headers row (optional) // - TableHeadersRow() or TableHeader() user submit a headers row (optional)
// | TableSortSpecsClickColumn() - when left-clicked: alter sort order and sort direction // | TableSortSpecsClickColumn() - when left-clicked: alter sort order and sort direction
// | TableOpenContextMenu() - when right-clicked: trigger opening of the default context menu // | TableOpenContextMenu() - when right-clicked: trigger opening of the default context menu
// - TableGetSortSpecs() user queries updated sort specs (optional, generally after submitting headers) // - TableGetSortSpecs() user queries updated sort specs (optional, generally after submitting headers)
// - TableNextRow() / TableNextCell() user begin into the first row, also automatically called by TableAutoHeaders() // - TableNextRow() / TableNextCell() user begin into the first row, also automatically called by TableHeadersRow()
// | TableEndCell() - close existing cell if not the first time // | TableEndCell() - close existing cell if not the first time
// | TableBeginCell() - enter into current cell // | TableBeginCell() - enter into current cell
// - [...] user emit contents // - [...] user emit contents
@ -1867,6 +1867,13 @@ bool ImGui::TableNextCell()
return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_n)) != 0; return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_n)) != 0;
} }
int ImGui::TableGetColumnCount()
{
ImGuiContext& g = *GImGui;
ImGuiTable* table = g.CurrentTable;
return table ? table->ColumnsCount : 0;
}
const char* ImGui::TableGetColumnName(int column_n) const char* ImGui::TableGetColumnName(int column_n)
{ {
ImGuiContext& g = *GImGui; ImGuiContext& g = *GImGui;
@ -2066,18 +2073,20 @@ void ImGui::TableOpenContextMenu(ImGuiTable* table, int column_n)
// This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn(). // This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn().
// The intent is that advanced users willing to create customized headers would not need to use this helper // The intent is that advanced users willing to create customized headers would not need to use this helper
// and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets. // and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets.
void ImGui::TableAutoHeaders() // See 'Demo->Tables->Custom headers' for a demonstration of implementing a custom version of this.
void ImGui::TableHeadersRow()
{ {
ImGuiStyle& style = ImGui::GetStyle(); ImGuiStyle& style = ImGui::GetStyle();
ImGuiContext& g = *GImGui; ImGuiContext& g = *GImGui;
ImGuiTable* table = g.CurrentTable; ImGuiTable* table = g.CurrentTable;
IM_ASSERT(table != NULL && "Need to call TableAutoHeaders() after BeginTable()!"); IM_ASSERT(table != NULL && "Need to call TableHeadersRow() after BeginTable()!");
const int columns_count = table->ColumnsCount;
// Calculate row height (for the unlikely case that labels may be are multi-line) // Calculate row height (for the unlikely case that labels may be are multi-line)
float row_y1 = GetCursorScreenPos().y; // If we didn't do that, uneven header height would work but their highlight won't cover the full row height.
float row_height = GetTextLineHeight(); float row_height = GetTextLineHeight();
const float row_y1 = GetCursorScreenPos().y;
const int columns_count = TableGetColumnCount();
for (int column_n = 0; column_n < columns_count; column_n++) for (int column_n = 0; column_n < columns_count; column_n++)
if (TableGetColumnIsVisible(column_n)) if (TableGetColumnIsVisible(column_n))
row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y); row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y);
@ -2095,8 +2104,6 @@ void ImGui::TableAutoHeaders()
if (!TableSetColumnIndex(column_n)) if (!TableSetColumnIndex(column_n))
continue; continue;
const char* name = TableGetColumnName(column_n);
// [DEBUG] Test custom user elements // [DEBUG] Test custom user elements
#if 0 #if 0
if (column_n < 2) if (column_n < 2)
@ -2112,23 +2119,19 @@ void ImGui::TableAutoHeaders()
#endif #endif
// Push an id to allow unnamed labels (generally accidental, but let's behave nicely with them) // Push an id to allow unnamed labels (generally accidental, but let's behave nicely with them)
// - in your own code you may omit the PushID/PopID all-together, provided you know you know they won't collide // - in your own code you may omit the PushID/PopID all-together, provided you know they won't collide
// - table->InstanceCurrent is only >0 when we use multiple BeginTable/EndTable calls with same identifier. // - table->InstanceCurrent is only >0 when we use multiple BeginTable/EndTable calls with same identifier.
const char* name = TableGetColumnName(column_n);
PushID(table->InstanceCurrent * table->ColumnsCount + column_n); PushID(table->InstanceCurrent * table->ColumnsCount + column_n);
TableHeader(name); TableHeader(name);
PopID(); PopID();
} }
// FIXME-TABLE: This is not user-land code any more + need to explain WHY this is here! (added in fa88f023)
//window->SkipItems = table->HostSkipItems;
// Allow opening popup from the right-most section after the last column. // Allow opening popup from the right-most section after the last column.
// (We don't actually need to use ImGuiHoveredFlags_AllowWhenBlockedByPopup because in reality this is generally
// not required anymore.. because popup opening code tends to be reacting on IsMouseReleased() and the click would
// already have closed any other popups!)
// FIXME-TABLE: TableOpenContextMenu() is not public yet. // FIXME-TABLE: TableOpenContextMenu() is not public yet.
ImVec2 mouse_pos = ImGui::GetMousePos();
if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count) if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count)
if (g.IO.MousePos.y >= row_y1 && g.IO.MousePos.y < row_y1 + row_height) if (mouse_pos.y >= row_y1 && mouse_pos.y < row_y1 + row_height)
TableOpenContextMenu(table, -1); // Will open a non-column-specific popup. TableOpenContextMenu(table, -1); // Will open a non-column-specific popup.
} }
@ -2145,7 +2148,7 @@ void ImGui::TableHeader(const char* label)
return; return;
ImGuiTable* table = g.CurrentTable; ImGuiTable* table = g.CurrentTable;
IM_ASSERT(table != NULL && "Need to call TableAutoHeaders() after BeginTable()!"); IM_ASSERT(table != NULL && "Need to call TableHeader() after BeginTable()!");
IM_ASSERT(table->CurrentColumn != -1); IM_ASSERT(table->CurrentColumn != -1);
const int column_n = table->CurrentColumn; const int column_n = table->CurrentColumn;
ImGuiTableColumn* column = &table->Columns[column_n]; ImGuiTableColumn* column = &table->Columns[column_n];