From e09454aec418b61e293097d186acfcb9a1c181ac Mon Sep 17 00:00:00 2001 From: ocornut Date: Mon, 23 Nov 2020 12:39:05 +0100 Subject: [PATCH] Tables: removed TableGetColumnIsVisible from public api, re-specced as TableGetColumnIsHidden() returning same flag as setter, clipper increase CurrentRow. --- imgui.cpp | 4 +++- imgui.h | 5 ++--- imgui_internal.h | 6 ++++-- imgui_tables.cpp | 44 ++++++++++++++++++++++---------------------- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 6d4b74c2..98e9d57f 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -2207,7 +2207,9 @@ static void SetCursorPosYAndSetupForPrevLine(float pos_y, float line_height) if (table->IsInsideRow) ImGui::TableEndRow(table); table->RowPosY2 = window->DC.CursorPos.y; - table->RowBgColorCounter += (int)((off_y / line_height) + 0.5f); + const int row_increase = (int)((off_y / line_height) + 0.5f); + //table->CurrentRow += row_increase; // Can't do without fixing TableEndRow() + table->RowBgColorCounter += row_increase; } } diff --git a/imgui.h b/imgui.h index 5eee1e54..00fe0a2b 100644 --- a/imgui.h +++ b/imgui.h @@ -682,8 +682,8 @@ namespace ImGui 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! IMGUI_API void TableNextRow(ImGuiTableRowFlags row_flags = 0, float min_row_height = 0.0f); // append into the first cell of a new row. - IMGUI_API bool TableNextColumn(); // append into the next column (or first column of next row if currently in last column). Return false when column is not visible. - IMGUI_API bool TableSetColumnIndex(int column_n); // append into the specified column. Return false when column is not visible. + IMGUI_API bool TableNextColumn(); // append into the next column (or first column of next row if currently in last column). Return true when column is visible. + IMGUI_API bool TableSetColumnIndex(int column_n); // append into the specified column. Return true when column is visible. IMGUI_API int TableGetColumnIndex(); // return current column index. IMGUI_API int TableGetRowIndex(); // return current row index. // Tables: Headers & Columns declaration @@ -705,7 +705,6 @@ namespace ImGui // 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 "" 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 TableNextColumn() 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 int TableGetHoveredColumn(); // return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. IMGUI_API ImGuiTableSortSpecs* TableGetSortSpecs(); // get latest sort specs for the table (NULL if not sorting). diff --git a/imgui_internal.h b/imgui_internal.h index 3f0a063d..ca5b0255 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -1894,7 +1894,8 @@ struct ImGuiTabBar #define IMGUI_TABLE_MAX_DRAW_CHANNELS (4 + 64 * 2) // See TableUpdateDrawChannels() // [Internal] sizeof() ~ 104 -// 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). +// We use the terminology "Visible" to refer to a columns that are not Hidden by user or settings. However it may still be out of view and clipped (and IsClipped would be set). +// This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped". struct ImGuiTableColumn { ImRect ClipRect; // Clipping rectangle for the column @@ -2277,7 +2278,8 @@ namespace ImGui IMGUI_API void TableUpdateLayout(ImGuiTable* table); IMGUI_API void TableUpdateBorders(ImGuiTable* table); IMGUI_API void TableSetColumnWidth(int column_n, float width); - IMGUI_API void TableSetColumnVisible(int column_n, bool visible); + IMGUI_API bool TableGetColumnIsHidden(int column_n); + IMGUI_API void TableSetColumnIsHidden(int column_n, bool hidden); IMGUI_API void TableDrawBorders(ImGuiTable* table); IMGUI_API void TableDrawContextMenu(ImGuiTable* table); IMGUI_API void TableOpenContextMenu(int column_n = -1); diff --git a/imgui_tables.cpp b/imgui_tables.cpp index b4b04699..d933f6e6 100644 --- a/imgui_tables.cpp +++ b/imgui_tables.cpp @@ -200,7 +200,7 @@ bool ImGui::BeginTable(const char* str_id, int columns_count, ImGuiTableFlags return BeginTableEx(str_id, id, columns_count, flags, outer_size, inner_width); } -// For reference, the total _allocation count_ for a table is: +// For reference, the average total _allocation count_ for a table is: // + 0 (for ImGuiTable instance, we are pooling allocations in g.Tables) // + 1 (for table->RawData allocated below) // + 1 (for table->ColumnsNames, if names are used) @@ -878,7 +878,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) column->IsClipped = (column->ClipRect.Max.x <= column->ClipRect.Min.x) && (column->AutoFitQueue & 1) == 0 && (column->CannotSkipItemsQueue & 1) == 0; if (column->IsClipped) - table->VisibleUnclippedMaskByIndex &= ~((ImU64)1 << column_n); // Columns with the _WidthAutoResize sizing policy will never be updated then. + table->VisibleUnclippedMaskByIndex &= ~((ImU64)1 << column_n); // Columns with the _WidthAutoResize sizing policy will never be updated then. column->IsSkipItems = !column->IsVisible || table->HostSkipItems; @@ -1386,16 +1386,6 @@ void ImGui::TableSetColumnWidth(int column_n, float width) } } -// Public wrapper -void ImGui::TableSetColumnVisible(int column_n, bool visible) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(table != NULL && table->IsLayoutLocked == false); - IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); - table->Columns[column_n].IsVisibleNextFrame = visible; -} - // Allocate draw channels. Called by TableUpdateLayout() // - We allocate them following storage order instead of display order so reordering columns won't needlessly // increase overall dormant memory cost. @@ -2038,8 +2028,8 @@ const char* ImGui::TableGetColumnName(int 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) +// FIXME-TABLE: Also expose "Visible and Unclipped" to the user, vs our internal "Visible" state which is !Hidden +bool ImGui::TableGetColumnIsHidden(int column_n) { ImGuiContext& g = *GImGui; ImGuiTable* table = g.CurrentTable; @@ -2047,7 +2037,18 @@ bool ImGui::TableGetColumnIsVisible(int column_n) return false; if (column_n < 0) column_n = table->CurrentColumn; - return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_n)) != 0; + return (table->VisibleMaskByIndex & ((ImU64)1 << column_n)) == 0; +} + +void ImGui::TableSetColumnIsHidden(int column_n, bool hidden) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && table->IsLayoutLocked == false); + if (column_n < 0) + column_n = table->CurrentColumn; + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + table->Columns[column_n].IsVisibleNextFrame = !hidden; } int ImGui::TableGetColumnIndex() @@ -2059,6 +2060,7 @@ int ImGui::TableGetColumnIndex() return table->CurrentColumn; } +// Note: for row coloring we use ->RowBgColorCounter which is the same value without counting header rows int ImGui::TableGetRowIndex() { ImGuiContext& g = *GImGui; @@ -2275,7 +2277,7 @@ void ImGui::TableHeadersRow() const float row_y1 = GetCursorScreenPos().y; const int columns_count = TableGetColumnCount(); for (int column_n = 0; column_n < columns_count; column_n++) - if (TableGetColumnIsVisible(column_n)) + if (!TableGetColumnIsHidden(column_n)) row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y); row_height += style.CellPadding.y * 2.0f; @@ -3051,19 +3053,17 @@ void ImGui::DebugNodeTable(ImGuiTable* table) const char* name = TableGetColumnName(table, n); ImFormatString(buf, IM_ARRAYSIZE(buf), "Column %d order %d name '%s': offset %+.2f to %+.2f\n" - "Visible: %d, Clipped: %d, DrawChannels: %d,%d\n" + "Visible: %d, Clipped: %d, SkipItems: %d, DrawChannels: %d,%d\n" "WidthGiven: %.1f, Request/Auto: %.1f/%.1f, StretchWeight: %.3f\n" "MinX: %.1f, MaxX: %.1f (%+.1f), ClipRect: %.1f to %.1f (+%.1f)\n" "ContentWidth: %.1f,%.1f, HeadersUsed/Ideal %.1f/%.1f\n" - "SortOrder: %d, SortDir: %s\n" - "UserID: 0x%08X, Flags: 0x%04X: %s%s%s%s..", + "Sort: %d%s, UserID: 0x%08X, Flags: 0x%04X: %s%s%s%s..", n, column->DisplayOrder, name, column->MinX - table->WorkRect.Min.x, column->MaxX - table->WorkRect.Min.x, - column->IsVisible, column->IsClipped, column->DrawChannelFrozen, column->DrawChannelUnfrozen, + column->IsVisible, column->IsClipped, column->IsSkipItems, column->DrawChannelFrozen, column->DrawChannelUnfrozen, column->WidthGiven, column->WidthRequest, column->WidthAuto, column->StretchWeight, column->MinX, column->MaxX, column->MaxX - column->MinX, column->ClipRect.Min.x, column->ClipRect.Max.x, column->ClipRect.Max.x - column->ClipRect.Min.x, column->ContentMaxXFrozen - column->WorkMinX, column->ContentMaxXUnfrozen - column->WorkMinX, column->ContentMaxXHeadersUsed - column->WorkMinX, column->ContentMaxXHeadersIdeal - column->WorkMinX, - column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? "Ascending" : (column->SortDirection == ImGuiSortDirection_Descending) ? "Descending" : "None", - column->UserID, column->Flags, + column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? " (Asc)" : (column->SortDirection == ImGuiSortDirection_Descending) ? " (Des)" : "", column->UserID, column->Flags, (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? "WidthStretch " : "", (column->Flags & ImGuiTableColumnFlags_WidthFixed) ? "WidthFixed " : "", (column->Flags & ImGuiTableColumnFlags_WidthAutoResize) ? "WidthAutoResize " : "",