From 83c433682883aaa6f9583a4a84d1ae4bd8d1e977 Mon Sep 17 00:00:00 2001 From: ocornut Date: Thu, 12 Oct 2023 19:47:37 +0200 Subject: [PATCH] Tables: fixed angled headers with frozen columns. --- imgui_demo.cpp | 4 +++- imgui_tables.cpp | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/imgui_demo.cpp b/imgui_demo.cpp index 9118f19b5..2cc02b237 100644 --- a/imgui_demo.cpp +++ b/imgui_demo.cpp @@ -5275,12 +5275,14 @@ static void ShowDemoWindowTables() static ImGuiTableFlags table_flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_Hideable | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_HighlightHoveredColumn; static bool bools[columns_count * rows_count] = {}; // Dummy storage selection storage + static int frozen_cols = 1; static int frozen_rows = 2; ImGui::CheckboxFlags("_ScrollX", &table_flags, ImGuiTableFlags_ScrollX); ImGui::CheckboxFlags("_ScrollY", &table_flags, ImGuiTableFlags_ScrollY); ImGui::CheckboxFlags("_NoBordersInBody", &table_flags, ImGuiTableFlags_NoBordersInBody); ImGui::CheckboxFlags("_HighlightHoveredColumn", &table_flags, ImGuiTableFlags_HighlightHoveredColumn); ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::SliderInt("Frozen columns", &frozen_cols, 0, 2); ImGui::SliderInt("Frozen rows", &frozen_rows, 0, 2); if (ImGui::BeginTable("table_angled_headers", columns_count, table_flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 12))) @@ -5288,7 +5290,7 @@ static void ShowDemoWindowTables() ImGui::TableSetupColumn(column_names[0], ImGuiTableColumnFlags_NoHide | ImGuiTableColumnFlags_NoReorder); for (int n = 1; n < columns_count; n++) ImGui::TableSetupColumn(column_names[n], ImGuiTableColumnFlags_AngledHeader | ImGuiTableColumnFlags_WidthFixed); - ImGui::TableSetupScrollFreeze(0, frozen_rows); + ImGui::TableSetupScrollFreeze(frozen_cols, frozen_rows); ImGui::TableAngledHeadersRow(); // Draw angled headers for all columns with the ImGuiTableColumnFlags_AngledHeader flag. ImGui::TableHeadersRow(); // Draw remaining headers and allow access to context-menu and other functions. diff --git a/imgui_tables.cpp b/imgui_tables.cpp index 1063fa79d..e028376d5 100644 --- a/imgui_tables.cpp +++ b/imgui_tables.cpp @@ -3166,9 +3166,13 @@ void ImGui::TableAngledHeadersRowEx(float angle, float max_label_width) TableNextRow(ImGuiTableRowFlags_Headers, row_height); TableNextColumn(); table->DrawSplitter->SetCurrentChannel(draw_list, TABLE_DRAW_CHANNEL_BG0); - PushClipRect(table->BgClipRect.Min, table->BgClipRect.Max, false); // Span all columns + float clip_rect_min_x = table->BgClipRect.Min.x; + if (table->FreezeColumnsCount > 0) + clip_rect_min_x = ImMax(clip_rect_min_x, table->Columns[table->FreezeColumnsCount - 1].MaxX); TableSetBgColor(ImGuiTableBgTarget_RowBg0, 0); // Cancel + PushClipRect(table->BgClipRect.Min, table->BgClipRect.Max, false); // Span all columns draw_list->AddRectFilled(table->BgClipRect.Min, table->BgClipRect.Max, GetColorU32(ImGuiCol_TableHeaderBg, 0.25f)); // FIXME-STYLE: Change row background with an arbitrary color. + PushClipRect(ImVec2(clip_rect_min_x, table->BgClipRect.Min.y), table->BgClipRect.Max, true); // Span all columns const ImRect row_r(table->WorkRect.Min.x, table->BgClipRect.Min.y, table->WorkRect.Max.x, window->DC.CursorPos.y + row_height); const ImGuiID row_id = GetID("##AngledHeaders"); @@ -3230,6 +3234,7 @@ void ImGui::TableAngledHeadersRowEx(float angle, float max_label_width) } } PopClipRect(); + PopClipRect(); table->TempData->AngledheadersExtraWidth = ImMax(0.0f, max_x - table->Columns[table->RightMostEnabledColumn].MaxX); }