|
@@ -320,6 +320,12 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
|
|
|
IM_ASSERT(inner_width >= 0.0f);
|
|
|
|
|
|
// If an outer size is specified ahead we will be able to early out when not visible. Exact clipping criteria may evolve.
|
|
|
+ // FIXME: coarse clipping because access to table data causes two issues:
|
|
|
+ // - instance numbers varying/unstable. may not be a direct problem for users, but could make outside access broken or confusing, e.g. TestEngine.
|
|
|
+ // - can't implement support for ImGuiChildFlags_ResizeY as we need to somehow pull the height data from somewhere. this also needs stable instance numbers.
|
|
|
+ // The side-effects of accessing table data on coarse clip would be:
|
|
|
+ // - always reserving the pooled ImGuiTable data ahead for a fully clipped table (minor IMHO). Also the 'outer_window_is_measuring_size' criteria may already be defeating this in some situations.
|
|
|
+ // - always performing the GetOrAddByKey() O(log N) query in g.Tables.Map[].
|
|
|
const bool use_child_window = (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) != 0;
|
|
|
const ImVec2 avail_size = GetContentRegionAvail();
|
|
|
const ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f);
|
|
@@ -338,7 +344,6 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
|
|
|
|
|
|
// Acquire storage for the table
|
|
|
ImGuiTable* table = g.Tables.GetOrAddByKey(id);
|
|
|
- const ImGuiTableFlags table_last_flags = table->Flags;
|
|
|
|
|
|
// Acquire temporary buffers
|
|
|
const int table_idx = g.Tables.GetIndex(table);
|
|
@@ -356,6 +361,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
|
|
|
// Initialize
|
|
|
const int previous_frame_active = table->LastFrameActive;
|
|
|
const int instance_no = (previous_frame_active != g.FrameCount) ? 0 : table->InstanceCurrent + 1;
|
|
|
+ const ImGuiTableFlags previous_flags = table->Flags;
|
|
|
table->ID = id;
|
|
|
table->Flags = flags;
|
|
|
table->LastFrameActive = g.FrameCount;
|
|
@@ -402,7 +408,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
|
|
|
SetNextWindowContentSize(ImVec2(override_content_size.x != FLT_MAX ? override_content_size.x : 0.0f, override_content_size.y != FLT_MAX ? override_content_size.y : 0.0f));
|
|
|
|
|
|
// Reset scroll if we are reactivating it
|
|
|
- if ((table_last_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0)
|
|
|
+ if ((previous_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0)
|
|
|
SetNextWindowScroll(ImVec2(0.0f, 0.0f));
|
|
|
|
|
|
// Create scrolling region (without border and zero window padding)
|
|
@@ -515,7 +521,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
|
|
|
if (inner_window != outer_window) // So EndChild() within the inner window can restore the table properly.
|
|
|
inner_window->DC.CurrentTableIdx = table_idx;
|
|
|
|
|
|
- if ((table_last_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0)
|
|
|
+ if ((previous_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0)
|
|
|
table->IsResetDisplayOrderRequest = true;
|
|
|
|
|
|
// Mark as used to avoid GC
|
|
@@ -2928,6 +2934,7 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table)
|
|
|
}
|
|
|
|
|
|
// Write output
|
|
|
+ // May be able to move all SortSpecs data from table (48 bytes) to ImGuiTableTempData if we decide to write it back on every BeginTable()
|
|
|
ImGuiTableColumnSortSpecs* sort_specs = (table->SortSpecsCount == 0) ? NULL : (table->SortSpecsCount == 1) ? &table->SortSpecsSingle : table->SortSpecsMulti.Data;
|
|
|
if (dirty && sort_specs != NULL)
|
|
|
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
|