From e3616e151ff7a12121f1fff9360a772b735abfdc Mon Sep 17 00:00:00 2001 From: ocornut Date: Wed, 7 Jun 2023 17:28:22 +0200 Subject: [PATCH] MultiSelect: Demo: Delete items from menu. --- imgui_demo.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/imgui_demo.cpp b/imgui_demo.cpp index 53f60067e..76255107c 100644 --- a/imgui_demo.cpp +++ b/imgui_demo.cpp @@ -2778,10 +2778,11 @@ struct ExampleSelection // Data ImGuiStorage Storage; // Selection set int SelectionSize; // Number of selected items (== number of 1 in the Storage, maintained by this class). // FIXME-MULTISELECT: Imply more difficult to track with intrusive selection schemes? + bool QueueDeletion; // Request deleting selected items // Functions ExampleSelection() { Clear(); } - void Clear() { Storage.Clear(); SelectionSize = 0; } + void Clear() { Storage.Clear(); SelectionSize = 0; QueueDeletion = false; } bool GetSelected(int n) const { return Storage.GetInt((ImGuiID)n, 0) != 0; } void SetSelected(int n, bool v) { int* p_int = Storage.GetIntRef((ImGuiID)n, 0); if (*p_int == (int)v) return; if (v) SelectionSize++; else SelectionSize--; *p_int = (bool)v; } int GetSize() const { return SelectionSize; } @@ -2822,6 +2823,8 @@ struct ExampleSelection template int ApplyDeletionPreLoop(ImGuiMultiSelectIO* ms_io, ImVector& items) { + QueueDeletion = false; + // If current item is not selected. if (ms_io->NavIdSelected == false) // Here 'NavIdSelected' should be == to 'GetSelected(ms_io->NavIdData)' { @@ -3130,7 +3133,7 @@ static void ShowDemoWindowMultiSelect() // FIXME-MULTISELECT: Shortcut(). Hard to demo this? May be helpful to send a helper/optional "delete" signal. // FIXME-MULTISELECT: may turn into 'ms_io->RequestDelete' -> need HasSelection passed. // FIXME-MULTISELECT: Test with intermediary modal dialog. - const bool want_delete = (selection.GetSize() > 0) && ImGui::IsWindowFocused() && ImGui::IsKeyPressed(ImGuiKey_Delete); + const bool want_delete = selection.QueueDeletion || ((selection.GetSize() > 0) && ImGui::IsWindowFocused() && ImGui::IsKeyPressed(ImGuiKey_Delete)); if (want_delete) selection.ApplyDeletionPreLoop(ms_io, items); const int next_focus_item_idx = (int)(intptr_t)ms_io->RequestFocusItem; @@ -3222,7 +3225,10 @@ static void ShowDemoWindowMultiSelect() // Right-click: context menu if (ImGui::BeginPopupContextItem()) { - ImGui::Text("(Testing Selectable inside an embedded popup)"); + ImGui::BeginDisabled(!use_deletion || selection.GetSize() == 0); + sprintf(label, "Delete %d item(s)###DeleteSelected", selection.GetSize()); + selection.QueueDeletion |= ImGui::Selectable(label); + ImGui::EndDisabled(); ImGui::Selectable("Close"); ImGui::EndPopup(); }