From 745d8cdb497ca77e03e3d2c4136492756b398bda Mon Sep 17 00:00:00 2001 From: omar Date: Fri, 19 Jun 2020 17:28:06 +0200 Subject: [PATCH] Tables: Made TableHeader() responsible for opening per-column context menu to move responsibility away from TableAutoHeaders(). --- imgui_demo.cpp | 3 +-- imgui_tables.cpp | 35 ++++++++++++++++------------------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/imgui_demo.cpp b/imgui_demo.cpp index fab06d81..35844b88 100644 --- a/imgui_demo.cpp +++ b/imgui_demo.cpp @@ -3960,13 +3960,12 @@ static void ShowDemoWindowTables() } // Demonstrate using TableHeader() calls instead of TableAutoHeaders() - // FIXME-TABLE: Currently this doesn't get us feature-parity with TableAutoHeaders(), e.g. missing context menu. Tables API needs some work! if (open_action != -1) ImGui::SetNextItemOpen(open_action != 0); if (ImGui::TreeNode("Custom headers")) { const int COLUMNS_COUNT = 3; - if (ImGui::BeginTable("##table1", COLUMNS_COUNT, ImGuiTableFlags_Borders | ImGuiTableFlags_Reorderable)) + if (ImGui::BeginTable("##table1", COLUMNS_COUNT, ImGuiTableFlags_Borders | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) { ImGui::TableSetupColumn("Apricot"); ImGui::TableSetupColumn("Banana"); diff --git a/imgui_tables.cpp b/imgui_tables.cpp index 1fad48b7..accc75f3 100644 --- a/imgui_tables.cpp +++ b/imgui_tables.cpp @@ -874,7 +874,8 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // Context menu if (table->IsContextPopupOpen && table->InstanceCurrent == table->InstanceInteracted) { - if (BeginPopup("##TableContextMenu")) + const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); + if (BeginPopupEx(context_menu_id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings)) { TableDrawContextMenu(table); EndPopup(); @@ -2010,20 +2011,19 @@ void ImGui::TableOpenContextMenu(ImGuiTable* table, int column_n) table->IsContextPopupOpen = true; table->ContextPopupColumn = (ImS8)column_n; table->InstanceInteracted = table->InstanceCurrent; - OpenPopup("##TableContextMenu"); + const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); + OpenPopupEx(context_menu_id, ImGuiPopupFlags_None); } } // This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn(). // The intent is that advanced users willing to create customized headers would not need to use this helper // and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets. -// FIXME-TABLE: However presently this function uses too many internal structures/calls. void ImGui::TableAutoHeaders() { ImGuiStyle& style = ImGui::GetStyle(); ImGuiContext& g = *GImGui; - //ImGuiWindow* window = g.CurrentWindow; ImGuiTable* table = g.CurrentTable; IM_ASSERT(table != NULL && "Need to call TableAutoHeaders() after BeginTable()!"); const int columns_count = table->ColumnsCount; @@ -2043,7 +2043,6 @@ void ImGui::TableAutoHeaders() // This for loop is constructed to not make use of internal functions, // as this is intended to be a base template to copy and build from. - int open_context_popup = INT_MAX; for (int column_n = 0; column_n < columns_count; column_n++) { if (!TableSetColumnIndex(column_n)) @@ -2071,25 +2070,19 @@ void ImGui::TableAutoHeaders() PushID(table->InstanceCurrent * table->ColumnsCount + column_n); TableHeader(name); PopID(); - - // We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden - if (IsMouseReleased(1) && IsItemHovered()) - open_context_popup = column_n; } // FIXME-TABLE: This is not user-land code any more + need to explain WHY this is here! (added in fa88f023) //window->SkipItems = table->HostSkipItems; - // Allow opening popup from the right-most section after the last column - // (We don't actually need to ImGuiHoveredFlags_AllowWhenBlockedByPopup because in reality this is generally - // not required anymore.. because popup opening code tends to be reacting on IsMouseReleased() and the click - // would already have closed any other popups!) - if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count && g.IO.MousePos.y >= row_y1 && g.IO.MousePos.y < row_y1 + row_height) - open_context_popup = -1; // Will open a non-column-specific popup. - - // Open Context Menu - if (open_context_popup != INT_MAX) - TableOpenContextMenu(table, open_context_popup); + // Allow opening popup from the right-most section after the last column. + // (We don't actually need to use ImGuiHoveredFlags_AllowWhenBlockedByPopup because in reality this is generally + // not required anymore.. because popup opening code tends to be reacting on IsMouseReleased() and the click would + // already have closed any other popups!) + // FIXME-TABLE: TableOpenContextMenu() is not public yet. + if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count) + if (g.IO.MousePos.y >= row_y1 && g.IO.MousePos.y < row_y1 + row_height) + TableOpenContextMenu(table, -1); // Will open a non-column-specific popup. } // Emit a column header (text + optional sort order) @@ -2214,6 +2207,10 @@ void ImGui::TableHeader(const char* label) column->ContentMaxPosHeadersIdeal = ImMax(column->ContentMaxPosHeadersIdeal, max_pos_x); PopID(); + + // We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden + if (IsMouseReleased(1) && IsItemHovered()) + TableOpenContextMenu(table, column_n); } void ImGui::TableSortSpecsClickColumn(ImGuiTable* table, ImGuiTableColumn* clicked_column, bool add_to_existing_sort_orders)