From 8530b6af3dfcde4b0653b6ffccb2a34eab5bd7e4 Mon Sep 17 00:00:00 2001 From: omar Date: Sat, 13 Jun 2020 18:02:02 +0200 Subject: [PATCH] Tables: Not flagging whole column as SkipItems based on clipping visibility (breaks layout) --- imgui.h | 2 +- imgui_tables.cpp | 48 +++++++++++++++++++++++------------------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/imgui.h b/imgui.h index 3d9898d6..df9cb8d8 100644 --- a/imgui.h +++ b/imgui.h @@ -672,7 +672,7 @@ namespace ImGui // - If you are using tables as a sort of grid, populating every columns with the same type of contents, // you may prefer using TableNextCell() instead of TableNextRow() + TableSetColumnIndex(). // - See Demo->Tables for details. - // - See ImGuiTableFlags_ enums for a description of available flags. + // - See ImGuiTableFlags_ and ImGuiTableColumnsFlags_ enums for a description of available flags. #define IMGUI_HAS_TABLE 1 IMGUI_API bool BeginTable(const char* str_id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f); IMGUI_API void EndTable(); // only call EndTable() if BeginTable() returns true! diff --git a/imgui_tables.cpp b/imgui_tables.cpp index 297c3ad4..c7ab20aa 100644 --- a/imgui_tables.cpp +++ b/imgui_tables.cpp @@ -753,7 +753,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) if (table->FreezeColumnsCount > 0 && table->FreezeColumnsCount == visible_n) offset_x += work_rect.Min.x - table->OuterRect.Min.x; - if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n))) + if ((table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)) == 0) { // 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. @@ -798,31 +798,27 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) column->ClipRect.ClipWithFull(host_clip_rect); column->IsClipped = (column->ClipRect.Max.x <= column->ClipRect.Min.x) && (column->AutoFitQueue & 1) == 0 && (column->CannotSkipItemsQueue & 1) == 0; - column->SkipItems = column->IsClipped || table->HostSkipItems; if (column->IsClipped) - { - // Columns with the _WidthAlwaysAutoResize sizing policy will never be updated then. - table->VisibleUnclippedMaskByIndex &= ~((ImU64)1 << column_n); - } - else - { - // Starting cursor position - column->StartXRows = column->StartXHeaders = column->MinX + table->CellPaddingX1; - - // Alignment - // FIXME-TABLE: This align based on the whole column width, not per-cell, and therefore isn't useful in - // many cases (to be able to honor this we might be able to store a log of cells width, per row, for - // visible rows, but nav/programmatic scroll would have visible artifacts.) - //if (column->Flags & ImGuiTableColumnFlags_AlignRight) - // column->StartXRows = ImMax(column->StartXRows, column->MaxX - column->ContentWidthRowsUnfrozen); - //else if (column->Flags & ImGuiTableColumnFlags_AlignCenter) - // column->StartXRows = ImLerp(column->StartXRows, ImMax(column->StartXRows, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f); - - // Reset content width variables - const float initial_max_pos_x = column->MinX + table->CellPaddingX1; - column->ContentMaxPosRowsFrozen = column->ContentMaxPosRowsUnfrozen = initial_max_pos_x; - column->ContentMaxPosHeadersUsed = column->ContentMaxPosHeadersIdeal = initial_max_pos_x; - } + table->VisibleUnclippedMaskByIndex &= ~((ImU64)1 << column_n); // Columns with the _WidthAlwaysAutoResize sizing policy will never be updated then. + + column->SkipItems = !column->IsVisible || table->HostSkipItems; + + // Starting cursor position + column->StartXRows = column->StartXHeaders = column->MinX + table->CellPaddingX1; + + // Alignment + // FIXME-TABLE: This align based on the whole column width, not per-cell, and therefore isn't useful in + // many cases (to be able to honor this we might be able to store a log of cells width, per row, for + // visible rows, but nav/programmatic scroll would have visible artifacts.) + //if (column->Flags & ImGuiTableColumnFlags_AlignRight) + // column->StartXRows = ImMax(column->StartXRows, column->MaxX - column->ContentWidthRowsUnfrozen); + //else if (column->Flags & ImGuiTableColumnFlags_AlignCenter) + // column->StartXRows = ImLerp(column->StartXRows, ImMax(column->StartXRows, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f); + + // Reset content width variables + const float initial_max_pos_x = column->MinX + table->CellPaddingX1; + column->ContentMaxPosRowsFrozen = column->ContentMaxPosRowsUnfrozen = initial_max_pos_x; + column->ContentMaxPosHeadersUsed = column->ContentMaxPosHeadersIdeal = initial_max_pos_x; // Don't decrement auto-fit counters until container window got a chance to submit its items if (table->HostSkipItems == false) @@ -1798,6 +1794,7 @@ bool ImGui::TableNextCell() TableNextRow(); } + // FIXME-TABLE: it is likely to alter layout if user skips a columns contents based on clipping. int column_n = table->CurrentColumn; return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_n)) != 0; } @@ -1849,6 +1846,7 @@ bool ImGui::TableSetColumnIndex(int column_idx) TableBeginCell(table, column_idx); } + // FIXME-TABLE: it is likely to alter layout if user skips a columns contents based on clipping. return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_idx)) != 0; }