From 5f43e8b57aca9aa1742a7695713aaa8cb352bc35 Mon Sep 17 00:00:00 2001 From: omar Date: Wed, 10 Jun 2020 11:15:44 +0200 Subject: [PATCH] Tables: Fix rendering of row bg and line separators (#3293, broken by fixes #3163, code was accidently relying on SetCurrentChannel not updating rectangle) + Used shortcut in PushTableBackground/PopTableBackground --- imgui_tables.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/imgui_tables.cpp b/imgui_tables.cpp index 242bd2e00112..a775a1a44ce9 100644 --- a/imgui_tables.cpp +++ b/imgui_tables.cpp @@ -1309,7 +1309,7 @@ void ImGui::TableSetColumnWidth(ImGuiTable* table, ImGuiTableColumn* column_0, f // matches, by e.g. calling SetCursorScreenPos(). // - The channel uses more than one draw command itself. We drop all our attempt at merging stuff here.. // we could do better but it's going to be rare and probably not worth the hassle. -// Columns for which the draw chnanel(s) haven't been merged with other will use their own ImDrawCmd. +// Columns for which the draw channel(s) haven't been merged with other will use their own ImDrawCmd. // // This function is particularly tricky to understand.. take a breath. void ImGui::TableDrawMergeChannels(ImGuiTable* table) @@ -1651,7 +1651,10 @@ void ImGui::TableEndRow(ImGuiTable* table) } if (bg_col != 0 || border_col != 0) + { + window->DrawList->_CmdHeader.ClipRect = table->HostClipRect.ToVec4(); table->DrawSplitter.SetCurrentChannel(window->DrawList, 0); + } // Draw background // We soft/cpu clip this so all backgrounds and borders can share the same clipping rectangle @@ -1889,6 +1892,9 @@ void ImGui::PushTableBackground() ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; ImGuiTable* table = g.CurrentTable; + + // Set cmd header ahead to avoid SetCurrentChannel+PushClipRect doing an unnecessary AddDrawCmd/Pop + window->DrawList->_CmdHeader.ClipRect = table->HostClipRect.ToVec4(); table->DrawSplitter.SetCurrentChannel(window->DrawList, 0); PushClipRect(table->HostClipRect.Min, table->HostClipRect.Max, false); } @@ -1899,6 +1905,10 @@ void ImGui::PopTableBackground() ImGuiWindow* window = g.CurrentWindow; ImGuiTable* table = g.CurrentTable; ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; + + // Set cmd header ahead to avoid SetCurrentChannel+PopClipRect doing an unnecessary AddDrawCmd/Pop + ImVec4 pop_clip_rect = window->DrawList->_ClipRectStack.Data[window->DrawList->_ClipRectStack.Size - 2]; + window->DrawList->_CmdHeader.ClipRect = pop_clip_rect; table->DrawSplitter.SetCurrentChannel(window->DrawList, column->DrawChannelCurrent); PopClipRect(); }